Compare commits
7 Commits
d8a55daf3f
...
dfecb09b7c
| Author | SHA1 | Date | |
|---|---|---|---|
| dfecb09b7c | |||
| 349f3b8ac3 | |||
| 5143a79890 | |||
| e92c1355d0 | |||
| 1d3352455e | |||
| f0219559c5 | |||
|
|
c7d389ecbb |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -3,6 +3,9 @@ node_modules/
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
dist/
|
dist/
|
||||||
build/
|
build/
|
||||||
|
app.ini
|
||||||
|
gitea/
|
||||||
|
mysql/
|
||||||
.cursor/
|
.cursor/
|
||||||
terminals/
|
terminals/
|
||||||
agent-transcripts/
|
agent-transcripts/
|
||||||
|
|||||||
103
app.ini.example
Normal file
103
app.ini.example
Normal 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
43
docker-compose-gitea.yml
Normal 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
|
||||||
25
docs/features/billeterie-flux.md
Normal file
25
docs/features/billeterie-flux.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Billeterie – flux complet
|
||||||
|
|
||||||
|
**Objectif :** Flux d’entrée/sortie conforme aux specs : heures d’ouverture 08h–20h, entrée limitée à 1 visiteur/s, départs après durée de séjour, affluence selon l’heure.
|
||||||
|
|
||||||
|
**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 l’heure (08h–10h faible, 10h–16h fort, 16h–18h décroissant, 18h–20h 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 n’entre.
|
||||||
|
- Jour : nouveaux visiteurs jusqu’à cap et demande, avec au plus 1/s réels (selon tick interval).
|
||||||
@@ -28,14 +28,15 @@
|
|||||||
|
|
||||||
## Non implémenté
|
## 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.
|
- **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.
|
- **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é (actuellement seul le bébé invendu est compté).
|
- **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
|
## Fichiers
|
||||||
|
|
||||||
- `web/js/food.js` : `checkDeathCauses`, `maybeDeathBlock`, `filterPendingBabies`, `filterReceptionAnimals`.
|
- `web/js/food.js` : `checkDeathCauses`, `maybeDeathBlock`, `checkNotAlone`, `filterPendingBabies`, `filterReceptionAnimals` ; cause recherche (getSkillLevel), cause seuls (Animal config).
|
||||||
- `web/js/trade.js` : `tickSaleListings` (expiration bébé).
|
- `web/js/trade.js` : `tickSaleListings` (expiration bébé et adulte → deathCountRecent).
|
||||||
- `web/js/animal-visits.js` : `lastVisitedAt` pour cause « pas visités ».
|
- `web/js/animal-visits.js` : `lastVisitedAt` pour cause « pas visités ».
|
||||||
- `server/db.js` : `expireSaleListings` (bébé invendu).
|
- `server/db.js` : `expireSaleListings` (bébé invendu).
|
||||||
|
- `web/js/config.js` : `Animal.MinSameSpeciesInRadius`, `RadiusCells`, `MaxSecondsAlone`.
|
||||||
|
|||||||
24
docs/features/docs-specs-enrichment.md
Normal file
24
docs/features/docs-specs-enrichment.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Specs documentation enrichment (docs/specs)
|
||||||
|
|
||||||
|
**Auteur : Équipe 4NK**
|
||||||
|
|
||||||
|
## Objectif
|
||||||
|
- Rendre l’ensemble 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 d’exemple `"..."` au profit de types (`timestamp`) ou structures explicites.
|
||||||
|
|
||||||
|
## Modalités d’analyse
|
||||||
|
- Re-scan de `docs/specs/` pour l’absence 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.
|
||||||
|
|
||||||
24
docs/features/feedbacks-visuels-animaux.md
Normal file
24
docs/features/feedbacks-visuels-animaux.md
Normal 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 l’origine 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.
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
- **state.js**
|
- **state.js**
|
||||||
- `buildDefaultCells()` : appelle `buildDefaultRow1Cells()` du module partagé `default-grid-layout.js` (research, billeterie, nursery, reception, food, school en ligne 1).
|
- `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.
|
- `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**
|
- **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`.
|
- 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`.
|
||||||
|
|
||||||
|
|||||||
36
docs/features/saisons-phase.md
Normal file
36
docs/features/saisons-phase.md
Normal 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.
|
||||||
42
docs/features/ui-render-extraction.md
Normal file
42
docs/features/ui-render-extraction.md
Normal 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
35
docs/leo.md
Normal 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.
|
||||||
192
docs/plan-enrich-docs-specs.md
Normal file
192
docs/plan-enrich-docs-specs.md
Normal 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 qu’ils 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 d’attente, 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 qu’aucun titre/sous-titre n’a 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`
|
||||||
@@ -1,321 +0,0 @@
|
|||||||
# Plan d'implémentation – Rappel des grandes règles (cahier des charges 174-324)
|
|
||||||
|
|
||||||
Plan pour implémenter l’inté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 d’interpolation entre cases voisines (calcul côté moteur).
|
|
||||||
- **Animaux multi-cases** : définition des types d’animaux 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 aujourd’hui)
|
|
||||||
- `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** à l’achat/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 d’une 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 d’origine).
|
|
||||||
- **UI** : affichage d’un sprite ou emprise sur plusieurs cases ; glisser-déposer d’un 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 d’animaux/bébés. Coût d’upgrade 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 d’acclimatation 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 aujourd’hui ; 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 d’une case (ou d’une 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** à l’achat.
|
|
||||||
- **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 d’abord en **accueil** (1 animal par unité). À la fin de l’acclimatation : **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`, l’entité 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à d’un seuil (temps ou déficit), l’animal 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 d’un 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 d’animal, après un délai l’animal meurt.
|
|
||||||
- **Bébé non vendu dans les délais** : si un bébé en vente n’est 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 n’est pas déplacé (case ou camion) avant un délai, il meurt.
|
|
||||||
- **Animal d’accueil 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 l’animal soit récupéré, mort.
|
|
||||||
- **Température trop en écart** : si la température de la case (ou de la zone) n’est pas dans la plage acceptable pour l’animal, 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 d’attractivité 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é d’un autre animal de même type mais issu d’un zoo différent, naissance d’un 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 d’un **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 l’arrivée du bébé (réduction du délai).
|
|
||||||
- **Température et milieu** : « très bonne adéquation » avec la température/milieu de l’animal 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 d’animal (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 d’alimentation, et score « vendu » attaché aux animaux.
|
|
||||||
|
|
||||||
**Livrables** :
|
|
||||||
- **Nombre de naissances** : compteur dans le game_state (incrémenté à chaque bébé né en reproduction).
|
|
||||||
- **Taux d’alimentation** : ratio (animaux nourris / animaux total) sur une fenêtre ou instantané ; stocké ou dérivé pour l’affichage et les formules.
|
|
||||||
- **Score de reproduction** (valeur agrégée du zoo) : formule combinant naissances, taux d’alimentation, et éventuellement autres facteurs. Exposé pour l’UI (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 l’arrivée d’un 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 d’animaux 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 s’il y a des boutiques et plus d’animaux 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 d’animaux différents
|
|
||||||
- proportionnelle à la rareté (niveau) des animaux
|
|
||||||
- proportionnelle au taux de remplissage en animaux
|
|
||||||
- **Pénalités** : les morts pénalisent l’attractivité auprès des visiteurs à venir (depuis les villes) ; les morts pénalisent l’apparition de naissances dans le zoo.
|
|
||||||
- **Bonus** : les naissances augmentent l’attractivité auprès des visiteurs à venir ; les naissances augmentent l’apparition d’autres naissances dans le zoo.
|
|
||||||
- **Villes** : nombre de visiteurs maximum vers les zoos (voir phase 10). L’attractivité 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 d’attractivité » (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 d’unité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 d’animaux à 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 d’attractivité, juste en dessous 1 case score de reproduction, juste en dessous 1 case de vente (voir phase 10). Possibilité d’acheter sur les cases voisines d’autres 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 d’enchère.
|
|
||||||
- **Mise en vente** : depuis la carte du zoo, déplacer un animal ou un bébé mature sur le camion → l’entité 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é d’un 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** : l’acheteur reçoit le bébé ou l’animal (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é à l’entité (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 d’erreur 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 0–12.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 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é d’implé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 l’animal
|
|
||||||
- [ ] Attractivité : valeur cumulée, nombre d’animaux 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é
|
|
||||||
192
docs/plan-implementation-specs-animaux-billeterie.md
Normal file
192
docs/plan-implementation-specs-animaux-billeterie.md
Normal 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 08h–20h ; 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 (08h–10h faible, 10h–16h 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 (1–8) vs rarityLevel (1–5) ; 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 l’animal 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 d’un changement de saison (comparer `getCurrentSeason(state)` à une valeur stockée), afficher un message type “C’est 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 d’ouverture, départs explicites, limite 1 visiteur/s à l’entrée.
|
||||||
|
|
||||||
|
### 4.1 Heures d’ouverture (08h–20h)
|
||||||
|
|
||||||
|
- **Fichier :** `web/js/config.js`
|
||||||
|
- **Ajout :** `Billeterie.OpenHour: 8`, `Billeterie.CloseHour: 20` (ou 20h = fermeture, pas d’entré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`. S’assurer 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 à l’entrée
|
||||||
|
|
||||||
|
- **Fichier :** `web/js/income.js`
|
||||||
|
- **Changement :** Dans `tickVisitorArrivals`, au lieu d’ajouter `target - current` d’un coup, limiter le nombre d’entrées sur ce tick à au plus `ceil(dt)` ou 1 par tick si tick = 1s, ou stocker `lastVisitorSpawnAt` et n’ajouter qu’un 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 l’heure (optionnel)
|
||||||
|
|
||||||
|
- **Fichier :** `web/js/income.js`
|
||||||
|
- **Changement :** Dans `getVisitorDemand`, appliquer un coefficient selon `timeOfDay` : 08h–10h faible, 10h–16h fort, 16h–18h 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 d’exé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 |
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
# Vérification des phases 0 à 9 avant phase 10
|
|
||||||
|
|
||||||
**Référence :** `docs/plan-implementation-rappel-grandes-regles.md`.
|
|
||||||
**Objectif :** S’assurer 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 l’affichage 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 s’appuyer sur saleListings et bébés/animaux tels qu’ils 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 l’UI d’enchè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
5664
docs/specs-format-audit.json
Normal file
File diff suppressed because it is too large
Load Diff
BIN
docs/specs/IMG_20260303_170253.jpg
Normal file
BIN
docs/specs/IMG_20260303_170253.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 626 KiB |
@@ -1,11 +1,12 @@
|
|||||||
# Spécifications : Accueil des Animaux
|
# Spécifications : Accueil des Animaux
|
||||||
|
|
||||||
## Définition
|
## 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
|
## Fonctionnalités
|
||||||
- **Acclimatation** : Période obligatoire avant de pouvoir placer l'animal sur la grille active.
|
- **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.
|
- **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)
|
## Niveaux d'Amélioration (7 niveaux)
|
||||||
- **Coût** : Progressif par palier.
|
- **Coût** : Progressif par palier.
|
||||||
@@ -19,115 +20,187 @@ Zone tampon pour les nouveaux animaux arrivant dans le zoo (achats adultes ou tr
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"id": "uuid",
|
"id": "uuid",
|
||||||
"type": "animal_reception",
|
"type": "building_reception",
|
||||||
|
"created_at": "timestamp",
|
||||||
|
"updated_at": "timestamp",
|
||||||
"level": "integer (1-7)",
|
"level": "integer (1-7)",
|
||||||
|
"position": { "x": "integer", "y": "integer" },
|
||||||
"slots": [
|
"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éristiques Initiales
|
||||||
| Caractéristique | Valeur Initiale (Niv 1) |
|
| Caractéristique | Valeur Initiale (Niv 1) | Valeur Max (Niv 7) |
|
||||||
| :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| Temps Acclimatation | 10 minutes |
|
| Temps Acclimatation | 600 secondes (10 min) | 0 secondes (Instantané) |
|
||||||
| Capacité | 1 animal |
|
| Capacité | 1 animal | 7 animaux |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| Confort Quarantaine | 60 | 0-100 | Modifie le stress initial de l’animal lors du placement (\(-\)stress = +confort). |
|
||||||
|
| Risque Contamination | 2% | 0-25% | Probabilité d’incident 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'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
|
### Conditions de Disparition
|
||||||
Indestructible.
|
Indestructible. Ne peut pas être vendu ni déplacé (sauf si feature de réaménagement global).
|
||||||
|
|
||||||
### Hérédité
|
### 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### Impact Milieu (Biome)
|
||||||
Zone neutre.
|
Zone neutre. Compatible avec tous les biomes d'animaux.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
Protégé.
|
Protégé des intempéries.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
Fonctionne 24/7. Pas de pénalité la nuit.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### 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
|
### 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
|
### Impact Nourriture
|
||||||
Nourri automatiquement.
|
Nourri automatiquement (coût nul ou inclus dans les frais de gestion globaux).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
| Action/État | Gain Attractivité | Rayon d'action |
|
||||||
|
|---|---:|---:|
|
||||||
|
| Façade entretenue (Propreté > 80) | +5 | 6 cases |
|
||||||
|
| File d’attente visible (Capacité saturée) | -10 | 8 cases |
|
||||||
|
| Livraison spectaculaire (animal rare) | +20 | 10 cases |
|
||||||
|
|
||||||
### Impact Valeur
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
**Réduction Temps Acclimatation** :
|
**Réduction Temps Acclimatation** :
|
||||||
| Niveau | Temps Base |
|
| Niveau | Temps Base | Réduction % |
|
||||||
| :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| 1 | 10 min |
|
| 1 | 10 min | 0% |
|
||||||
| 2 | 8 min |
|
| 2 | 8 min | 20% |
|
||||||
| 3 | 6 min |
|
| 3 | 6 min | 40% |
|
||||||
| 4 | 4 min |
|
| 4 | 4 min | 60% |
|
||||||
| 5 | 2 min |
|
| 5 | 2 min | 80% |
|
||||||
| 6 | 1 min |
|
| 6 | 1 min | 90% |
|
||||||
| 7 | Instantané |
|
| 7 | Instantané | 100% |
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### 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
|
### Trajet Visiteurs
|
||||||
N/A
|
| Trajet | Condition | Effet | Détails |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Visiteurs passent devant | Chemin adjacent | Attraction faible | Le bâtiment n’est pas une attraction nominale, mais une façade visible peut influer sur l’ambiance. |
|
||||||
|
| 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
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Arrivée** : Animal livré par camion.
|
* **Arrivée (`ANIMAL_ARRIVAL`)** : Animal livré par camion, entre dans un slot libre.
|
||||||
* **Prêt** : Animal prêt à être placé.
|
* **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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
| Niveau | Coût (Pièces) | Capacité | Temps Acclimatation | Temps Construction |
|
| Niveau | Coût (Pièces) | Capacité | Temps Acclimatation | Temps Construction |
|
||||||
| :--- | :--- | :--- | :--- | :--- |
|
| :--- | :--- | :--- | :--- | :--- |
|
||||||
| 1 | 100 | 1 | 10 min | 0s |
|
| 1 | 100 | 1 | 10 min | 0s |
|
||||||
| 2 | 200 | 2 | 8 min | 0s |
|
| 2 | 200 | 2 | 8 min | 10s |
|
||||||
| 3 | 400 | 3 | 6 min | 0s |
|
| 3 | 400 | 3 | 6 min | 30s |
|
||||||
| 4 | 800 | 4 | 4 min | 0s |
|
| 4 | 800 | 4 | 4 min | 1m |
|
||||||
| 5 | 1600 | 5 | 2 min | 0s |
|
| 5 | 1600 | 5 | 2 min | 2m |
|
||||||
| 6 | 3200 | 6 | 1 min | 0s |
|
| 6 | 3200 | 6 | 1 min | 5m |
|
||||||
| 7 | 6400 | 7 | 0 min | 0s |
|
| 7 | 6400 | 7 | 0 min | 10m |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
```
|
```python
|
||||||
function updateReception(center):
|
def update_reception(reception_center, current_time):
|
||||||
for slot in center.slots:
|
# Vérification de l'intégrité
|
||||||
if currentTime >= slot.ready_time:
|
if not reception_center or not reception_center.slots:
|
||||||
notifyPlayer("ANIMAL_READY", slot.animal_id)
|
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
|
### Messages d'Infos / Alerte
|
||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message | Condition |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- | :--- |
|
||||||
| `ANIMAL_READY` | Info | "Un nouvel animal est prêt à rejoindre le zoo !" |
|
| `ANIMAL_READY` | Info | "Un nouvel animal est prêt à rejoindre le zoo !" | `slot.status` passe à `READY` |
|
||||||
| `RECEPTION_FULL` | Warning | "Accueil saturé, impossible d'acheter." |
|
| `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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Arrivée Animal (Passif)
|
### Arrivée Animal (Passif)
|
||||||
**Description UX** : Le camion décharge un animal. Il apparaît dans l'Accueil en mode "Attente".
|
**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.
|
**Notification Push** : "Votre [Animal] est arrivé à l'accueil !" envoyée si le joueur est hors ligne.
|
||||||
**Emplacement** : Case Accueil.
|
**Emplacement** : Case Accueil.
|
||||||
**Intégration** : Suite de l'action Camion.
|
**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`.
|
**Événements** : `DELIVERY_COMPLETE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ambience_stable_soft.mp3` (léger, discret, pas intrusif).
|
||||||
- **Sons** : `truck_door.mp3`, `crate_drop.mp3`.
|
- **Sons** : `truck_door.mp3`, `crate_drop.mp3`.
|
||||||
- **Graphiques** : Sprite Caisse en bois.
|
- **Graphiques** : Sprite Caisse en bois.
|
||||||
- **Images** : N/A
|
- **Images** : `reception_building.png` (bâtiment), `reception_icon.png` (icône), `badge_quarantine.png` (badge).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `delivery_short.webm` (2s, loop optionnel sur notif).
|
||||||
- **Animations** : Camion qui repart.
|
- **Animations** : Camion qui repart.
|
||||||
- **Couleurs** : Marron (Caisse).
|
- **Couleurs** : Marron (Caisse).
|
||||||
- **Textes** : N/A
|
- **Textes** : `RECEPTION_DELIVERY_DONE` = "Livraison effectuée", `RECEPTION_ANIMAL_ARRIVED` = "Votre {animalName} est arrivé à l'accueil !"
|
||||||
- **Formes** : N/A
|
- **Formes** : Bulle (notif), badge rond (état).
|
||||||
|
|
||||||
### Consultation & Acclimatation (Consultation)
|
### Consultation & Acclimatation (Consultation)
|
||||||
**Description UX** : Le joueur vérifie le temps restant avant de pouvoir placer l'animal.
|
**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`.
|
**Événements** : `OPEN_RECEPTION`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_modal_soft.mp3` (jingle court).
|
||||||
- **Sons** : `ui_open.mp3`
|
- **Sons** : `ui_open.mp3`
|
||||||
- **Graphiques** : Style "Quarantaine" ou "Étable propre".
|
- **Graphiques** : Style "Quarantaine" ou "Étable propre".
|
||||||
- **Images** : Portrait animal.
|
- **Images** : Portrait animal.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `progress_fill.webm` (0.8s loop) pour la barre d’acclimatation (optionnel).
|
||||||
- **Animations** : Barre de progression qui avance.
|
- **Animations** : Barre de progression qui avance.
|
||||||
- **Couleurs** : Orange (En cours), Vert (Prêt).
|
- **Couleurs** : Orange (En cours), Vert (Prêt).
|
||||||
- **Textes** : "Prêt dans X min".
|
- **Textes** : "Prêt dans X min".
|
||||||
@@ -178,12 +251,18 @@ function updateReception(center):
|
|||||||
**Événements** : `PLACE_ANIMAL`.
|
**Événements** : `PLACE_ANIMAL`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_confirm_place.mp3` (jingle court de confirmation).
|
||||||
- **Sons** : `animal_happy.mp3` (cri de l'animal).
|
- **Sons** : `animal_happy.mp3` (cri de l'animal).
|
||||||
- **Graphiques** : Sprite Animal.
|
- **Graphiques** : Sprite Animal.
|
||||||
- **Images** : N/A
|
- **Images** : `placement_ghost_ok.png`, `placement_ghost_ko.png` (surbrillance vert/rouge).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `placement_glow.webm` (1.2s, non loop).
|
||||||
- **Animations** : Animal qui saute de joie au placement.
|
- **Animations** : Animal qui saute de joie au placement.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Vert (#2ECC71) placement valide, Rouge (#E74C3C) placement invalide, Ambre (#F39C12) état “en acclimatation”.
|
||||||
- **Textes** : N/A
|
- **Textes** : `BTN_PLACE` = "Placer", `RECEPTION_READY` = "Prêt"
|
||||||
- **Formes** : N/A
|
- **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.
|
||||||
|
|||||||
@@ -1,24 +1,79 @@
|
|||||||
# Spécifications : Achat et Upgrade des Boutiques
|
# Spécifications : Achat et Upgrade des Boutiques
|
||||||
|
|
||||||
## Construction
|
## 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)
|
## Upgrade (7 Niveaux)
|
||||||
- **Attrait** : Attire les visiteurs de plus loin sur la grille.
|
- **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.
|
- **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.
|
- **Capacité** : Augmente le nombre de visiteurs pouvant interagir simultanément (File d'attente).
|
||||||
|
|
||||||
# Annexes Techniques
|
# Annexes Techniques
|
||||||
|
|
||||||
## 1. Données et États
|
## 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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Rénovation (Action)
|
### Rénovation (Action)
|
||||||
**Description UX** : Améliorer la boutique change son apparence et ses stats.
|
**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`.
|
**Événements** : `UPGRADE_SHOP_VISUAL`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Musique d'ascenseur (Muzak) apaisante.
|
||||||
- **Sons** : `construction_finish.mp3`.
|
- **Sons** : `construction_finish.mp3`.
|
||||||
- **Graphiques** : Sprites Boutiques Niv 1-7.
|
- **Graphiques** : Sprites Boutiques Niv 1-7.
|
||||||
- **Images** : N/A
|
- **Images** : Photo avant/après (style émission rénovation).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Ruban d'inauguration coupé.
|
||||||
- **Animations** : Effet de "pop" ou échafaudage rapide.
|
- **Animations** : Effet de "pop" ou échafaudage rapide.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Doré (pour les niveaux élevés).
|
||||||
- **Textes** : N/A
|
- **Textes** : "Niveau Supérieur !".
|
||||||
- **Formes** : N/A
|
- **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.
|
||||||
|
|||||||
@@ -3,25 +3,68 @@
|
|||||||
## Achat
|
## Achat
|
||||||
- Le joueur possède un camion par défaut.
|
- Le joueur possède un camion par défaut.
|
||||||
- Possibilité d'acheter des camions supplémentaires (si le design autorise plusieurs flottes).
|
- 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)
|
## Upgrade (7 Niveaux)
|
||||||
- **Niveau 1** : Camion standard.
|
- **Niveau 1** : Camion standard.
|
||||||
- **Niveau 2-7** :
|
- **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.
|
- **Confort** : Réduit la perte de santé/stress des animaux transportés.
|
||||||
- **Capacité** : (Optionnel) Transport de plusieurs animaux ? *Actuellement 1 unité = 1 camion.*
|
- **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
|
# Annexes Techniques
|
||||||
|
|
||||||
## 1. Données et États
|
## 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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Garage / Atelier (Consultation)
|
### Garage / Atelier (Consultation)
|
||||||
**Description UX** : Le joueur gère sa flotte de camions.
|
**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`.
|
**Événements** : `OPEN_GARAGE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Radio "Trucker" (Rock instrumental léger).
|
||||||
- **Sons** : `wrench.mp3` (bruit d'outil).
|
- **Sons** : `wrench.mp3` (bruit d'outil).
|
||||||
- **Graphiques** : Fond garage.
|
- **Graphiques** : Fond garage.
|
||||||
- **Images** : Sprites Camions évolutifs (Vieux tacot -> Camion futuriste).
|
- **Images** : Sprites Camions évolutifs (Vieux tacot -> Camion futuriste).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Rotation 360° du modèle de camion.
|
||||||
- **Animations** : N/A
|
- **Animations** : Étincelles de soudure.
|
||||||
- **Couleurs** : Gris, Métal.
|
- **Couleurs** : Gris, Métal.
|
||||||
- **Textes** : "Niveau X".
|
- **Textes** : "Niveau X".
|
||||||
- **Formes** : N/A
|
- **Formes** : Silhouettes de camions en arrière-plan.
|
||||||
|
|
||||||
### Customisation (Cosmétique)
|
### Customisation (Cosmétique)
|
||||||
**Description UX** : Changer la couleur du camion.
|
**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`.
|
**Événements** : `PAINT_TRUCK`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Bruit de spray "Pshhh" musical.
|
||||||
- **Sons** : `spray.mp3`.
|
- **Sons** : `spray.mp3`.
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Pistolet peinture.
|
||||||
- **Images** : N/A
|
- **Images** : Nuancier de couleurs (Texture brillante).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Reflet de lumière sur la carrosserie (shader).
|
||||||
- **Animations** : Camion change de couleur.
|
- **Animations** : Camion change de couleur.
|
||||||
- **Couleurs** : Palette 16 couleurs.
|
- **Couleurs** : Palette 16 couleurs.
|
||||||
- **Textes** : N/A
|
- **Textes** : "Peinture fraîche !".
|
||||||
- **Formes** : N/A
|
- **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).
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
## Construction
|
## Construction
|
||||||
- Sur une case vide de type "Terrain", le joueur peut acheter un bâtiment.
|
- Sur une case vide de type "Terrain", le joueur peut acheter un bâtiment.
|
||||||
- Le coût dépend du type de 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
|
## Types Constructibles
|
||||||
- Nurserie
|
- 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).
|
- (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)
|
## Upgrade de Case (Terrain)
|
||||||
- **Changement de Milieu** : Payer pour changer la couleur (Biome) d'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.
|
- **Changement de Température** : Payer pour installer un régulateur thermique sur une case (invisible ou petit objet technique).
|
||||||
|
|
||||||
# Annexes Techniques
|
# Annexes Techniques
|
||||||
|
|
||||||
## 1. Données et États
|
## 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`.
|
Voir `case_zoo.md` et `achat_upgrade_generique.md`.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
@@ -23,8 +34,8 @@ Voir `case_zoo.md` et `achat_upgrade_generique.md`.
|
|||||||
**Changement de Milieu** :
|
**Changement de Milieu** :
|
||||||
| Niveau | Coût | Précision | Temps |
|
| Niveau | Coût | Précision | Temps |
|
||||||
| :--- | :--- | :--- | :--- |
|
| :--- | :--- | :--- | :--- |
|
||||||
| 1 | 500 | Changement vers biome adjacent | 0s |
|
| 1 | 500 | Changement vers biome adjacent uniquement | 5s |
|
||||||
| 7 | 5000 | Changement vers n'importe quel biome | 0s |
|
| 7 | 5000 | Changement vers n'importe quel biome (Terraformation avancée) | 2s |
|
||||||
|
|
||||||
**Régulateur Thermique** :
|
**Régulateur Thermique** :
|
||||||
| Niveau | Coût | Plage Réglage | Temps |
|
| 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 |
|
| 1 | 200 | +/- 5°C | 0s |
|
||||||
| 7 | 2000 | +/- 50°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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Modification Terrain (Action)
|
### Modification Terrain (Action)
|
||||||
**Description UX** : Le joueur sélectionne une case et choisit "Modifier Biome" ou "Température".
|
**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`.
|
**Événements** : `TERRAFORM_CASE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Jingle "Travaux Publics" (bruits de chantier rythmés).
|
||||||
- **Sons** : `digging.mp3` (Biome), `hissing_gas.mp3` (Température).
|
- **Sons** : `digging.mp3` (Biome), `hissing_gas.mp3` (Température).
|
||||||
- **Graphiques** : Icône Pelle, Thermomètre.
|
- **Graphiques** : Icône Pelle, Thermomètre.
|
||||||
- **Images** : Textures sol (Herbe, Sable, Neige).
|
- **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.
|
- **Animations** : Transition de couleur (Fade) sur la case.
|
||||||
- **Couleurs** : Vert, Jaune, Blanc.
|
- **Couleurs** : Vert, Jaune, Blanc.
|
||||||
- **Textes** : "Coût : X".
|
- **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).
|
||||||
|
|||||||
@@ -4,25 +4,71 @@
|
|||||||
- **Action** : Acheter une nouvelle parcelle de terrain adjacente à la grille existante.
|
- **Action** : Acheter une nouvelle parcelle de terrain adjacente à la grille existante.
|
||||||
- **Coût** : Très élevé, progressif selon la taille actuelle du zoo.
|
- **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.
|
- **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
|
# Annexes Techniques
|
||||||
|
|
||||||
## 1. Données et États
|
## 1. Données et États
|
||||||
### Modèle de Données (JSON)
|
### Modèle de Données (JSON)
|
||||||
Action sur l'objet `Zoo` (dimensions).
|
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
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Taille Initiale** : 5x6 cases (30 cases).
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades (Agrandissement)
|
### Tableau des Upgrades (Agrandissement)
|
||||||
| Extension | Coût (Pièces) | Gain |
|
| Extension | Coût (Pièces) | Gain |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| +1 Colonne | `1000 * (LargeurActuelle^2)` | +Hauteur cases |
|
| +1 Colonne (Est) | 1000 | +Hauteur cases (6) |
|
||||||
| +1 Ligne | `1000 * (HauteurActuelle^2)` | +Largeur cases |
|
| +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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Achat Parcelle (Action)
|
### Achat Parcelle (Action)
|
||||||
**Description UX** : Le joueur clique sur une zone "Hors Limites" adjacente pour l'acheter.
|
**Description UX** : Le joueur clique sur une zone "Hors Limites" adjacente pour l'acheter.
|
||||||
@@ -33,12 +79,17 @@ N/A
|
|||||||
**Événements** : `EXPAND_ZOO`.
|
**Événements** : `EXPAND_ZOO`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Son "Vent dans les plaines" lors du survol.
|
||||||
- **Sons** : `land_buy.mp3`.
|
- **Sons** : `land_buy.mp3`.
|
||||||
- **Graphiques** : Panneau "For Sale".
|
- **Graphiques** : Panneau "For Sale".
|
||||||
- **Images** : Texture herbe (cachée par brouillard).
|
- **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.
|
- **Animations** : Brouillard se dissipe, herbe apparaît.
|
||||||
- **Couleurs** : Gris (Inaccessible) -> Vert (Accessible).
|
- **Couleurs** : Gris (Inaccessible) -> Vert (Accessible).
|
||||||
- **Textes** : "Acheter Terrain (X Pièces)".
|
- **Textes** : "Acheter Terrain (X Pièces)".
|
||||||
- **Formes** : Carré.
|
- **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.
|
||||||
|
|||||||
@@ -3,18 +3,64 @@
|
|||||||
## Upgrade (7 Niveaux)
|
## Upgrade (7 Niveaux)
|
||||||
- **Production** : Augmente le nombre d'Unités de Recherche générées par heure.
|
- **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).
|
- **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
|
# Annexes Techniques
|
||||||
|
|
||||||
## 1. Données et États
|
## 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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Arbre Technologique (Consultation)
|
### Arbre Technologique (Consultation)
|
||||||
**Description UX** : Visualiser les paliers de recherche.
|
**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`.
|
**Événements** : `VIEW_TECH_TREE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Ambiance "Laboratoire High-Tech" (boucle subtile).
|
||||||
- **Sons** : N/A
|
- **Sons** : `lab_hum.mp3`, `data_process.mp3`.
|
||||||
- **Graphiques** : Lignes de connexion.
|
- **Graphiques** : Lignes de connexion.
|
||||||
- **Images** : Icônes Radar, Fiole.
|
- **Images** : Icônes Radar, Fiole.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Hologramme rotatif de la technologie sélectionnée.
|
||||||
- **Animations** : N/A
|
- **Animations** : Cadenas qui saute.
|
||||||
- **Couleurs** : Bleu (Science).
|
- **Couleurs** : Bleu (Science).
|
||||||
- **Textes** : "Niveau Suivant : Portée +10km".
|
- **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.
|
||||||
|
|||||||
@@ -13,80 +13,141 @@
|
|||||||
|
|
||||||
## 1. Données et États
|
## 1. Données et États
|
||||||
### Modèle de Données (JSON)
|
### 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
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Solde Joueur** : Voir `joueur.md`.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Dépenses Totales** : 0.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
**Menu Achat** : Accessible via le HUD.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Fermeture Menu**.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Historique** : Les transactions sont loggées pour les stats.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### 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
|
### 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
|
### 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
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Couveuses** : L'achat d'upgrades "Confort" pour les enclos augmente la fertilité de +2%.
|
||||||
|
|
||||||
### Impact Mort
|
### 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
|
### Impact Nourriture
|
||||||
N/A
|
**Stockage** : Les upgrades de "Réserve" permettent d'acheter la nourriture en gros (-5% prix unitaire).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### 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
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### 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
|
### Trajet Visiteurs
|
||||||
N/A
|
**Obstacle** : Un bâtiment en construction bloque le passage, forçant les visiteurs à faire un détour.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
N/A
|
* **Promo** : Offre limitée dans le temps (-20%).
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Interface d'Achat (Consultation)
|
### Interface d'Achat (Consultation)
|
||||||
**Description UX** : Le joueur ouvre le menu de construction ou d'upgrade.
|
**Description UX** : Le joueur ouvre le menu de construction ou d'upgrade.
|
||||||
@@ -97,15 +158,15 @@ N/A
|
|||||||
**Événements** : `OPEN_SHOP_MENU`.
|
**Événements** : `OPEN_SHOP_MENU`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Jingle "Caisse Enregistreuse" (court).
|
||||||
- **Sons** : `ui_hover.mp3`.
|
- **Sons** : `ui_hover.mp3`.
|
||||||
- **Graphiques** : Icônes Bâtiments.
|
- **Graphiques** : Icônes Bâtiments.
|
||||||
- **Images** : N/A
|
- **Images** : Sprites des bâtiments dans le menu (2D isométrique).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Mini-clip "Construction en cours" (optionnel).
|
||||||
- **Animations** : N/A
|
- **Animations** : Bouton rebondit au survol.
|
||||||
- **Couleurs** : Fond sombre, Texte clair.
|
- **Couleurs** : Fond sombre, Texte clair.
|
||||||
- **Textes** : Prix, Nom.
|
- **Textes** : Prix, Nom.
|
||||||
- **Formes** : Cartes carrées.
|
- **Formes** : Cartes carrées avec coins arrondis.
|
||||||
|
|
||||||
### Confirmation Achat (Action)
|
### Confirmation Achat (Action)
|
||||||
**Description UX** : Le joueur clique pour acheter.
|
**Description UX** : Le joueur clique pour acheter.
|
||||||
@@ -116,12 +177,12 @@ N/A
|
|||||||
**Événements** : `BUY_ITEM`.
|
**Événements** : `BUY_ITEM`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Jingle "Succès" (trompettes légères).
|
||||||
- **Sons** : `buy_success.mp3`.
|
- **Sons** : `buy_success.mp3`.
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Particules de pièces d'or.
|
||||||
- **Images** : N/A
|
- **Images** : Icône "Vendu" tamponnée.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Transition de fermeture de menu (wipe).
|
||||||
- **Animations** : Compteur pièces descend.
|
- **Animations** : Compteur pièces descend.
|
||||||
- **Couleurs** : Rouge (déduction).
|
- **Couleurs** : Rouge (déduction).
|
||||||
- **Textes** : "-500".
|
- **Textes** : "-500".
|
||||||
- **Formes** : N/A
|
- **Formes** : Effet d'onde de choc circulaire au clic.
|
||||||
|
|||||||
@@ -2,39 +2,86 @@
|
|||||||
|
|
||||||
## Construction
|
## Construction
|
||||||
- Nécessaire pour faire éclore plus d'œufs simultanément.
|
- Nécessaire pour faire éclore plus d'œufs simultanément.
|
||||||
|
- Peut être construite sur une case vide.
|
||||||
|
|
||||||
## Upgrade (7 Niveaux)
|
## Upgrade (7 Niveaux)
|
||||||
- **Incubation** : Réduit le temps d'éclosion.
|
- **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).
|
- **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
|
# Annexes Techniques
|
||||||
|
|
||||||
## 1. Données et États
|
## 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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Extension (Action)
|
### Extension (Action)
|
||||||
**Description UX** : Ajouter des slots d'œufs.
|
**Description UX** : Ajouter des slots d'œufs.
|
||||||
**Description UI** : La grille de slots s'agrandit (nouvelles cases déverrouillées).
|
**Description UI** : La grille de slots s'agrandit (nouvelles cases déverrouillées).
|
||||||
**Emplacement** : Modal Nurserie.
|
**Emplacement** : Modal Nurserie.
|
||||||
**Intégration** : UI Grid.
|
**Intégration** : UI Grid.
|
||||||
**Navigation** : N/A
|
**Navigation** : Clic Nurserie -> Onglet Extension.
|
||||||
**Événements** : `UNLOCK_SLOT`.
|
**Événements** : `UNLOCK_SLOT`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Berceuse douce (boîte à musique).
|
||||||
- **Sons** : `unlock.mp3`.
|
- **Sons** : `unlock.mp3`.
|
||||||
- **Graphiques** : Cadenas qui s'ouvre.
|
- **Graphiques** : Cadenas qui s'ouvre.
|
||||||
- **Images** : N/A
|
- **Images** : Icône "Œuf +" (Slot vide).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Rayon de lumière sur le nouveau slot.
|
||||||
- **Animations** : Slot qui s'illumine.
|
- **Animations** : Slot qui s'illumine.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Rose pastel et Bleu ciel.
|
||||||
- **Textes** : "Slot débloqué".
|
- **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).
|
||||||
|
|||||||
103
docs/specs/affiche_enclos.md
Normal file
103
docs/specs/affiche_enclos.md
Normal 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` : n’affecte pas la lisibilité mais réduit l’attractivité (ex. -5 rayon 6 cases) jusqu’au 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.
|
||||||
566
docs/specs/agent_securite.md
Normal file
566
docs/specs/agent_securite.md
Normal 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 l’ordre, 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 d’animation), 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 n’alimente 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 |
|
||||||
@@ -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
|
## 1. Données et États
|
||||||
### Modèle de Données (JSON)
|
### Modèle de Données (JSON)
|
||||||
Propriété `view_radius` sur `Zoo` ou `Player`.
|
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éristiques Initiales
|
||||||
| Caractéristique | Valeur Initiale |
|
| Caractéristique | Valeur Initiale |
|
||||||
@@ -32,8 +42,38 @@ Propriété `view_radius` sur `Zoo` ou `Player`.
|
|||||||
| 6 | 2500 | 1200 km |
|
| 6 | 2500 | 1200 km |
|
||||||
| 7 | 5000 | 2000 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Découverte (Passif/Action)
|
### Découverte (Passif/Action)
|
||||||
**Description UX** : En payant des points de recherche, le brouillard de guerre recule sur la carte du monde.
|
**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).
|
- **Musiques** : Jingle découverte (style Zelda/Civ).
|
||||||
- **Sons** : `wind_whoosh.mp3`.
|
- **Sons** : `wind_whoosh.mp3`.
|
||||||
- **Graphiques** : Nuages (Brouillard de guerre).
|
- **Graphiques** : Nuages (Brouillard de guerre).
|
||||||
- **Images** : N/A
|
- **Images** : Carte au trésor (Icône).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de dissipation de brume.
|
||||||
- **Animations** : Fade out des nuages. Scale up de la vue (Dezoom).
|
- **Animations** : Fade out des nuages. Scale up de la vue (Dezoom).
|
||||||
- **Couleurs** : Blanc/Gris (Nuages).
|
- **Couleurs** : Blanc/Gris (Nuages).
|
||||||
- **Textes** : "Nouvelle zone découverte !".
|
- **Textes** : "Nouvelle zone découverte !".
|
||||||
- **Formes** : Cercle (Rayon de vue).
|
- **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.
|
||||||
|
|||||||
@@ -5,20 +5,19 @@ Entité biologique principale du jeu.
|
|||||||
|
|
||||||
## Propriétés
|
## Propriétés
|
||||||
- **Type/Espèce** : Défini par le loot (75 animaux possibles).
|
- **Type/Espèce** : Défini par le loot (75 animaux possibles).
|
||||||
|
- **Affichage** : Apparaît "en petit" dans l'enclos fusionné.
|
||||||
- **Génétique** :
|
- **Génétique** :
|
||||||
- **Couleur** : 15 variations.
|
- **Couleur** : 15 variations.
|
||||||
- **Rareté** : 5 niveaux (pondération Fibonacci).
|
- **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.
|
- **Cycle de vie** : Œuf -> Bébé -> Adulte -> Mort.
|
||||||
|
|
||||||
## Besoins
|
## Besoins
|
||||||
- **Nourriture** : Consommation périodique.
|
- **Nourriture** : Consommation périodique.
|
||||||
- **Environnement** : Adéquation Biome/Température.
|
- **Environnement** : Adéquation Biome/Température.
|
||||||
- **Social** : Besoin de congénères (reproduction) ou de solitude (selon espèce).
|
- **Social** : Besoin de congénères (reproduction) ou de solitude (selon espèce).
|
||||||
|
- **Enrichissement** : Besoin d'un objet spécial dans l'enclos (ex: Arbre à singe).
|
||||||
## 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é.
|
|
||||||
|
|
||||||
# Annexes Techniques
|
# Annexes Techniques
|
||||||
|
|
||||||
@@ -36,14 +35,20 @@ Conséquence : Perte sèche, pénalité d'attractivité.
|
|||||||
"health": "float (0-100)",
|
"health": "float (0-100)",
|
||||||
"hunger": "float (0-100)",
|
"hunger": "float (0-100)",
|
||||||
"temperature_comfort": "float (-1.0 to 1.0)",
|
"temperature_comfort": "float (-1.0 to 1.0)",
|
||||||
"stress": "float (0-100)"
|
"stress": "float (0-100)",
|
||||||
|
"energy": "float (0-100)"
|
||||||
},
|
},
|
||||||
"genetics": {
|
"genetics": {
|
||||||
"parent_a_id": "uuid_v4 | null",
|
"parent_a_id": "uuid_v4 | null",
|
||||||
"parent_b_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 |
|
| Stress | 0.0 |
|
||||||
| Âge | 0 (Bébé) |
|
| Âge | 0 (Bébé) |
|
||||||
|
|
||||||
### Scores Initiaux
|
|
||||||
| Score | Valeur |
|
|
||||||
| :--- | :--- |
|
|
||||||
| Valeur Vente (Base) | 10 * Fibonacci(Rareté) |
|
|
||||||
| Attractivité (Base) | 5 * Rareté |
|
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
| Type | Condition |
|
| Type | Condition |
|
||||||
@@ -77,12 +76,6 @@ Conséquence : Perte sèche, pénalité d'attractivité.
|
|||||||
| Vente | Transaction validée |
|
| Vente | Transaction validée |
|
||||||
| Libération | Action joueur |
|
| 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
| Delta T° (Idéal - Réel) | Effet sur Santé / Heure | Effet sur Stress / Heure |
|
| 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 |
|
| Adjacente (Cercle chromatique) | 0 | 0 |
|
||||||
| Opposée | -5 | +10 |
|
| 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
```
|
```javascript
|
||||||
function updateAnimal(animal, context):
|
function updateAnimal(animal, context):
|
||||||
|
# Gestion Température
|
||||||
deltaTemp = abs(animal.idealTemp - context.tileTemp)
|
deltaTemp = abs(animal.idealTemp - context.tileTemp)
|
||||||
if deltaTemp > 0:
|
if deltaTemp > 0:
|
||||||
animal.health -= tableImpactTemp[deltaTemp]
|
animal.health -= tableImpactTemp[deltaTemp]
|
||||||
animal.stress += tableImpactTemp[deltaTemp] * 0.5
|
animal.stress += tableImpactTemp[deltaTemp] * 0.5
|
||||||
|
|
||||||
|
# Gestion Biome
|
||||||
if context.tileBiome != animal.idealBiome:
|
if context.tileBiome != animal.idealBiome:
|
||||||
animal.stress += 5
|
animal.stress += 5
|
||||||
|
|
||||||
if animal.hunger > 0:
|
# Gestion Faim
|
||||||
|
if animal.hunger < 100:
|
||||||
animal.hunger += baseHungerRate * context.seasonMod
|
animal.hunger += baseHungerRate * context.seasonMod
|
||||||
|
else:
|
||||||
|
animal.health -= 10 # Famine
|
||||||
|
|
||||||
if animal.hunger >= 100:
|
# Gestion Reproduction
|
||||||
animal.health -= 10
|
if canReproduce(animal):
|
||||||
|
mate = findMate(animal)
|
||||||
|
if mate:
|
||||||
|
startReproduction(animal, mate)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
@@ -203,60 +130,36 @@ function updateAnimal(animal, context):
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Vie Quotidienne (Passif)
|
### Vie Quotidienne (Passif)
|
||||||
**Description UX** : L'animal vit sa vie sur la grille. Il bouge, mange, dort.
|
**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).
|
**Description UI** : Sprite animé. Si problème (faim/froid), feedback visuel immédiat (changement couleur/tremblement).
|
||||||
**Emplacement** : Case Zoo.
|
**Emplacement** : Case Zoo.
|
||||||
**Intégration** : Grille principale.
|
**Intégration** : Grille principale.
|
||||||
**Navigation** : N/A
|
**Navigation** : Clic Animal (Focus).
|
||||||
**Événements** : `ANIMAL_IDLE`, `ANIMAL_MOVE`.
|
**Événements** : `ANIMAL_IDLE`, `ANIMAL_MOVE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : Ambiance nature (oiseaux, vent).
|
- **Musiques** : Ambiance nature (oiseaux, vent).
|
||||||
- **Sons** : Cris d'animaux aléatoires (faible volume).
|
- **Sons** : Cris d'animaux aléatoires (faible volume).
|
||||||
- **Graphiques** : Sprites Pixel Art (4 directions).
|
- **Graphiques** : Sprites Pixel Art (4 directions).
|
||||||
- **Images** : N/A
|
- **Images** : Portraits HD pour les dialogues.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Mini-cinématique d'introduction de l'espèce (découverte).
|
||||||
- **Animations** : Idle, Walk, Eat, Sleep.
|
- **Animations** : Idle, Walk, Eat, Sleep.
|
||||||
- **Couleurs** : Selon espèce + Teinte bleue (Froid) / Rouge (Chaud).
|
- **Couleurs** : Selon espèce + Teinte bleue (Froid) / Rouge (Chaud).
|
||||||
- **Textes** : Bulle "Zzz" (Sommeil), "!" (Alerte).
|
- **Textes** : Bulle "Zzz" (Sommeil), "!" (Alerte).
|
||||||
- **Formes** : N/A
|
- **Formes** : Ombre portée ovale sous l'animal.
|
||||||
|
|
||||||
### Consultation (Consultation)
|
### Vue Isométrique
|
||||||
**Description UX** : Le joueur clique sur l'animal pour voir ses détails (Santé, Faim, Génétique).
|
- **Sprites** : 4 directions (N, S, E, W) minimum. Idéalement 8 pour fluidité.
|
||||||
**Description UI** : **Bottom Sheet** (Mobile) ou Panneau Latéral (Desktop) pour ne pas masquer le jeu. Jauges colorées. Arbre généalogique simplifié.
|
- **Occlusion** : L'animal doit être caché par les murs sud/est de son enclos, mais visible par-dessus les murs nord/ouest.
|
||||||
**Emplacement** : Case Zoo.
|
- **Comportement** : L'animal ne doit jamais traverser les murs (collision box stricte).
|
||||||
**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
|
|
||||||
|
|||||||
559
docs/specs/artiste.md
Normal file
559
docs/specs/artiste.md
Normal 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 d’intérêt (scène) avec un rayon d’effet 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 à l’embauche |
|
||||||
|
| `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 | S’ajoute 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 d’abris proches |
|
||||||
|
| 15–25°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 |
|
||||||
|
|---|---|---|
|
||||||
|
| 10h–16h | affluence max | perf prioritaire |
|
||||||
|
| 18h–20h | 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 d’enclos |
|
||||||
|
| 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 d’impact direct |
|
||||||
|
|
||||||
|
#### Vitesse (Nurserie) (tableau détaillé)
|
||||||
|
|
||||||
|
| Paramètre | Effet | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| - | aucun | artiste n’affecte 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 | à l’achat |
|
||||||
|
|
||||||
|
#### 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é | l’artiste n’affecte 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 |
|
||||||
@@ -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
|
## 1. Données et États
|
||||||
### Modèle de Données (JSON)
|
### Modèle de Données (JSON)
|
||||||
Propriétés de `Visiteur`.
|
Propriétés de `Visiteur`.
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"visitor_id": "uuid",
|
||||||
|
"current_target": { "type": "enum('animal','shop','bench','toilet','exit')", "entity_id": "uuid" },
|
||||||
|
"target_score": "float",
|
||||||
|
"memory": {
|
||||||
|
"seen_species": "string[]",
|
||||||
|
"last_shop_at": "timestamp | null",
|
||||||
|
"fatigue": "float (0-100)",
|
||||||
|
"thirst": "float (0-100)"
|
||||||
|
},
|
||||||
|
"pathing": {
|
||||||
|
"preferred_tiles": "enum('path','bridge')",
|
||||||
|
"avoid_zones": "uuid[]",
|
||||||
|
"repath_cooldown_ms": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caracté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
|
### 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'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
|
### Conditions de Disparition
|
||||||
N/A
|
| Condition | Seuil | Opérateur | Résultat |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| Ennui | 70 | >= | Cible sortie (billeterie). |
|
||||||
|
| Heure | fermeture | >= | Cible sortie. |
|
||||||
|
|
||||||
### Hérédité
|
### 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
**Canicule/Grand Froid** : Réduit le temps de séjour (-30%).
|
**Canicule/Grand Froid** : Réduit le temps de séjour (-30%).
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
| Biome | Compatibilité | Bonus/Malus |
|
||||||
|
|---|---:|---|
|
||||||
|
| Chemin pavés | 100% | fatigue -10%/min |
|
||||||
|
| Boue | 30% | fatigue +20%/min, satisfaction - |
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
| Saison | Effet | Modificateur |
|
||||||
|
|---|---|---|
|
||||||
|
| Été | recherche d’ombre/boutiques | soif + |
|
||||||
|
| Hiver | recherche d’intérieur | fatigue + |
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
| Période | Activité | Visibilité |
|
||||||
|
|---|---|---|
|
||||||
|
| 10h–16h | exploration max | haute |
|
||||||
|
| 17h–19h | achats sortie | moyenne |
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
| Facteur | Effet sur Taux | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Bébés visibles | + | visiteurs restent plus |
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
Voir `visiteur.md` (Départ immédiat).
|
Voir `visiteur.md` (Départ immédiat).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
| Type Nourriture | Gain Santé | Coût | Préférence |
|
||||||
|
|---|---:|---:|---:|
|
||||||
|
| Boisson | soif -50 | 5 | 5 |
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
**Poids des Cibles** :
|
**Poids des Cibles** :
|
||||||
@@ -68,25 +113,39 @@ N/A
|
|||||||
| Banc (si fatigué) | 200 |
|
| Banc (si fatigué) | 200 |
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
| Facteur | Variation Prix | Condition |
|
||||||
|
|---|---:|---|
|
||||||
|
| Visiteur VIP | dépense x2 | si satisfait |
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
| Action | Dépense | Condition |
|
||||||
|
|---|---:|---|
|
||||||
|
| Achat boisson | 5 | soif > 50 |
|
||||||
|
| Achat souvenir | 15-30 | proche sortie |
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
Algorithme de choix de cible pondéré.
|
Algorithme de choix de cible pondéré.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### É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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
@@ -101,26 +160,38 @@ function chooseNextTarget(visitor, zoo):
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Foule (Passif)
|
### Foule (Passif)
|
||||||
**Description UX** : Les visiteurs s'agglutinent devant les animaux les plus intéressants.
|
**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".
|
**Description UI** : Densité de sprites visiteurs plus élevée autour des cases "Stars".
|
||||||
**Emplacement** : Grille Zoo.
|
**Emplacement** : Grille Zoo.
|
||||||
**Intégration** : Comportement IA.
|
**Intégration** : Comportement IA.
|
||||||
**Navigation** : N/A
|
**Navigation** : Aucune (passif). Option debug : toggle “Heatmap foule” dans HUD pour visualiser les zones d’attroupement.
|
||||||
**Événements** : `CROWD_GATHER`.
|
**Événements** : `CROWD_GATHER`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ambience_crowd_dynamic.mp3` (volume selon densité).
|
||||||
- **Sons** : Rumeur de foule (volume variable selon densité).
|
- **Sons** : Rumeur de foule (volume variable selon densité).
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Particules “flash photo”, bulles d’émotion.
|
||||||
- **Images** : N/A
|
- **Images** : `icon_camera.png`, `icon_star.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `crowd_flash.webm` (0.6s loop, optionnel).
|
||||||
- **Animations** : Applaudissements, Photos.
|
- **Animations** : Applaudissements, Photos.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Blanc/Jaune (flash), Or (star).
|
||||||
- **Textes** : N/A
|
- **Textes** : `CROWD_GATHER` = "La foule se rassemble"
|
||||||
- **Formes** : N/A
|
- **Formes** : Bulle BD (émotions).
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ L'attraction est calculée pour chaque couple (Ville, Zoo).
|
|||||||
|
|
||||||
## 1. Données et États
|
## 1. Données et États
|
||||||
### Modèle de Données (JSON)
|
### 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
|
```json
|
||||||
{
|
{
|
||||||
"zoo_id": "uuid",
|
"zoo_id": "uuid",
|
||||||
@@ -30,67 +30,105 @@ Calculé à la volée ou mis en cache.
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### 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
|
### 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
| Condition | Seuil | Opérateur | Résultat |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| Zoo et ville existent | true | Est | Calcul possible. |
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
| Condition | Seuil | Opérateur | Résultat |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| Zoo supprimé | true | Est | Flux devient 0. |
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| Soft reset | Cartographie connue | 100% | Non |
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
| Biome / route | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Montagne (routes lentes) | distance effective + | flux - |
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
**Hiver** : Réduit la volonté de voyager (-20% rayon d'attraction).
|
**Hiver** : Réduit la volonté de voyager (-20% rayon d'attraction).
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
| Période | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Nuit | pas de départs | flux 0 vers billeterie |
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
| Facteur | Effet sur Taux | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Naissances médiatisées | flux + | événement “baby boom” |
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
| Cause | Conséquence | Durée |
|
||||||
|
|---|---|---|
|
||||||
|
| Série de morts | flux - | 24h (décroissance) |
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
| Facteur | Variation | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Prix nourriture élevé | visiteurs budget - | dépense moyenne - |
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
Voir formule.
|
Voir formule.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
| Facteur | Variation | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Ville riche | dépense moyenne + | facteur ville > 1 |
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
| Poste | Coût | Unité | Condition |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| Marketing ville ciblée | 500–5000 | coins | augmente facteur ville temporaire |
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
| Trajet | Condition | Effet | Notes |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Ville→Zoo | calcul distance | flux | distance^2 + plafond rayon |
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### É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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
@@ -104,25 +142,37 @@ function calculateDailyVisitors(zoo, city):
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Visualisation Flux (Consultation)
|
### Visualisation Flux (Consultation)
|
||||||
**Description UX** : Le joueur regarde la carte du monde pour voir d'où viennent ses visiteurs.
|
**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.
|
**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.
|
**Emplacement** : Carte Monde.
|
||||||
**Intégration** : Overlay.
|
**Intégration** : Overlay.
|
||||||
**Navigation** : N/A
|
**Navigation** : Toggle “Flux visiteurs” dans le HUD carte monde → survol d’une ligne → affiche détail (ville, visiteurs/jour, facteur saison, distance).
|
||||||
**Événements** : `VIEW_FLOW`.
|
**Événements** : `VIEW_FLOW`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ambience_world_flow.mp3` (léger, optionnel).
|
||||||
- **Sons** : N/A
|
- **Sons** : `ui_flow_toggle.mp3` (toggle overlay).
|
||||||
- **Graphiques** : Lignes de flux.
|
- **Graphiques** : Lignes de flux.
|
||||||
- **Images** : N/A
|
- **Images** : `flow_dotted_line.png`, `car_particle.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `flow_ants.webm` (1s loop, optionnel).
|
||||||
- **Animations** : Pointillés qui avancent (effet fourmis).
|
- **Animations** : Pointillés qui avancent (effet fourmis).
|
||||||
- **Couleurs** : Blanc ou Vert fluo.
|
- **Couleurs** : Blanc ou Vert fluo.
|
||||||
- **Textes** : "150 visiteurs/jour".
|
- **Textes** : "150 visiteurs/jour".
|
||||||
|
|||||||
520
docs/specs/avatar_joueur.md
Normal file
520
docs/specs/avatar_joueur.md
Normal 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 d’emoji 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 à l’ouverture 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 s’approche |
|
||||||
|
|
||||||
|
#### 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 |
|
||||||
57
docs/specs/banderole_accueil.md
Normal file
57
docs/specs/banderole_accueil.md
Normal 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.
|
||||||
@@ -73,7 +73,7 @@ Voir `animal_generique.md`.
|
|||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### 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
|
### Impact Mort
|
||||||
| Événement | Effet Satisfaction |
|
| Événement | Effet Satisfaction |
|
||||||
@@ -96,26 +96,32 @@ N/A (Un bébé ne se reproduit pas).
|
|||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Soins Vétérinaires** : Coût x2 si malade (Fragilité pédiatrique).
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Aimant** : Priorité absolue pour les visiteurs si le bébé est visible (hors nurserie).
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Croissance** : Passage à l'âge adulte (Notification).
|
* **Croissance** : Passage à l'âge adulte (Notification).
|
||||||
* **Besoin Soin** : Alerte plus fréquente.
|
* **Besoin Soin** : Alerte plus fréquente.
|
||||||
|
* **Premiers Pas** : Petit event mignon (+Satisfaction).
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
```
|
```javascript
|
||||||
function updateBaby(baby, context):
|
function updateBaby(baby, context):
|
||||||
# Fragilité accrue
|
# Fragilité accrue
|
||||||
damageMultiplier = 2.0
|
damageMultiplier = 2.0
|
||||||
@@ -137,25 +143,34 @@ function updateBaby(baby, context):
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Croissance en Nurserie (Passif)
|
### Croissance en Nurserie (Passif)
|
||||||
**Description UX** : Le bébé est visible dans son slot de nurserie. Il grandit visuellement (petite jauge).
|
**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.
|
**Description UI** : Sprite "Bébé" (tête disproportionnée, grands yeux). Jauge de croissance.
|
||||||
**Emplacement** : Modal Nurserie.
|
**Emplacement** : Modal Nurserie.
|
||||||
**Intégration** : Slot.
|
**Intégration** : Slot.
|
||||||
**Navigation** : N/A
|
**Navigation** : Clic Slot Nurserie (Zoom).
|
||||||
**Événements** : `BABY_GROWING`.
|
**Événements** : `BABY_GROWING`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Berceuse (Boîte à musique, boucle 30s).
|
||||||
- **Sons** : Petits bruits aigus.
|
- **Sons** : Petits bruits aigus.
|
||||||
- **Graphiques** : Sprite Bébé.
|
- **Graphiques** : Sprite Bébé.
|
||||||
- **Images** : N/A
|
- **Images** : Photo "Échographie" (si œuf).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Cinématique éclosion (optionnel).
|
||||||
- **Animations** : Respiration (Scale up/down léger).
|
- **Animations** : Respiration (Scale up/down léger).
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Tons pastels.
|
||||||
- **Textes** : "Bébé [Espèce]".
|
- **Textes** : "Bébé [Espèce]".
|
||||||
- **Formes** : N/A
|
- **Formes** : Bulle de protection autour du bébé.
|
||||||
|
|
||||||
### Sortie Prématurée (Action)
|
### Sortie Prématurée (Action)
|
||||||
**Description UX** : Le joueur décide de placer le bébé dans le zoo avant l'âge adulte (risqué).
|
**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`.
|
**Événements** : `PLACE_BABY`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Alerte "Danger" (rythme rapide).
|
||||||
- **Sons** : `warning_beep.mp3`.
|
- **Sons** : `warning_beep.mp3`.
|
||||||
- **Graphiques** : Icône Danger.
|
- **Graphiques** : Icône Danger.
|
||||||
- **Images** : N/A
|
- **Images** : Fond d'écran rouge clignotant (léger).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de tremblement rouge sur le sprite.
|
||||||
- **Animations** : N/A
|
- **Animations** : Tremblement de l'interface.
|
||||||
- **Couleurs** : Rouge.
|
- **Couleurs** : Rouge.
|
||||||
- **Textes** : "Risque de mort élevé !".
|
- **Textes** : "Risque de mort élevé !".
|
||||||
- **Formes** : N/A
|
- **Formes** : Triangle d'avertissement.
|
||||||
|
|
||||||
### Passage Adulte (Événement)
|
### Passage Adulte (Événement)
|
||||||
**Description UX** : Le bébé atteint 100% de croissance. Il se transforme en adulte.
|
**Description UX** : Le bébé atteint 100% de croissance. Il se transforme en adulte.
|
||||||
**Description UI** : Flash lumineux. Le sprite change. Notification "Adulte !".
|
**Description UI** : Flash lumineux. Le sprite change. Notification "Adulte !".
|
||||||
**Emplacement** : Nurserie ou Zoo.
|
**Emplacement** : Nurserie ou Zoo.
|
||||||
**Intégration** : Immédiat.
|
**Intégration** : Immédiat.
|
||||||
**Navigation** : N/A
|
**Navigation** : Auto (Cutscene).
|
||||||
**Événements** : `BECOME_ADULT`.
|
**Événements** : `BECOME_ADULT`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
@@ -189,8 +204,508 @@ function updateBaby(baby, context):
|
|||||||
- **Sons** : `level_up.mp3`.
|
- **Sons** : `level_up.mp3`.
|
||||||
- **Graphiques** : Particules brillantes.
|
- **Graphiques** : Particules brillantes.
|
||||||
- **Images** : Sprite Adulte.
|
- **Images** : Sprite Adulte.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de morphing (shader).
|
||||||
- **Animations** : Morphing ou Fade cross.
|
- **Animations** : Morphing ou Fade cross.
|
||||||
- **Couleurs** : Blanc/Or.
|
- **Couleurs** : Blanc/Or.
|
||||||
- **Textes** : "Adulte".
|
- **Textes** : "Adulte".
|
||||||
- **Formes** : N/A
|
- **Formes** : Rayons de lumière.
|
||||||
|
|
||||||
|
## Définition
|
||||||
|
|
||||||
|
| Champ | Valeur |
|
||||||
|
|---|---|
|
||||||
|
| Concept | Instance d’animal au stade “bébé” (post-éclosion), avec progression de croissance vers l’adulte. |
|
||||||
|
| Rôle | Introduire une phase de fragilité et de soins, visible en nurserie et/ou sur le zoo, avec effets d’attractivité “mignon” et contraintes biologiques (non reproductible). |
|
||||||
|
| Portée | Une entité `Animal` (référence `animal_id`) au sein d’un 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 d’exception 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 qu’un 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 l’adulte |
|
||||||
|
|
||||||
|
#### Impact Saisons (tableau détaillé)
|
||||||
|
|
||||||
|
| Saison | Effet bébé | Notes |
|
||||||
|
|---|---|---|
|
||||||
|
| Hiver | risque froid ↑ | privilégier nurserie |
|
||||||
|
| Été | risque chaud ↑ | besoin d’eau/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, d’autres 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 d’un 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 d’analytics |
|
||||||
|
|
||||||
|
#### 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 | à l’arrivé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é |
|
||||||
|
|||||||
@@ -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" },
|
"position": { "x": "int", "y": "int" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"total_entries": "integer",
|
"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 |
|
| Prix Ticket | 10 pièces |
|
||||||
| Capacité Max | 20 visiteurs |
|
| 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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
| Niveau | Coût (Pièces) | Prix Ticket | Capacité Max | Temps Construction |
|
| 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
```
|
```python
|
||||||
function processEntry(zoo):
|
def process_entry(zoo):
|
||||||
potentialVisitors = calculateAttractionFlow(zoo)
|
potential_visitors = calculate_attraction_flow(zoo)
|
||||||
|
|
||||||
if zoo.currentVisitors >= zoo.billeterie.capacity:
|
# Gestion de la file d'attente
|
||||||
emitEvent("ZOO_FULL")
|
zoo.billeterie.current_queue_length += potential_visitors
|
||||||
return
|
|
||||||
|
|
||||||
actualVisitors = min(potentialVisitors, zoo.billeterie.capacity - zoo.currentVisitors)
|
# 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)
|
||||||
|
|
||||||
for i in 0..actualVisitors:
|
# Vérification capacité zoo
|
||||||
spawnVisitor()
|
if zoo.current_visitors + actual_entries > zoo.billeterie.capacity:
|
||||||
player.addCoins(zoo.billeterie.ticketPrice)
|
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
|
### Messages d'Infos / Alerte
|
||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| `ZOO_FULL` | Alerte | "Le zoo est complet ! Agrandissez la billeterie." |
|
| `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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Consultation
|
### Consultation
|
||||||
**Description UX** : Le joueur clique sur la billeterie pour voir ses statistiques et son niveau.
|
**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.
|
**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.
|
**Emplacement** : Case Billeterie sur la grille du zoo.
|
||||||
**Intégration** : Bâtiment fixe (ne peut pas être déplacé ou supprimé).
|
**Intégration** : Bâtiment fixe.
|
||||||
**Navigation** : Clic -> Ouverture Panneau -> Fermeture (Croix ou clic extérieur).
|
**Navigation** : Clic -> Ouverture Panneau -> Fermeture.
|
||||||
**Événements** : `CLICK_BILLETERIE`.
|
**Événements** : `CLICK_BILLETERIE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Ambiance "Hall de Gare" (brouhaha léger).
|
||||||
- **Sons** : `ui_open.mp3`
|
- **Sons** : `ui_open.mp3`
|
||||||
- **Graphiques** : Pixel Art, style guichet.
|
- **Graphiques** : Pixel Art, style guichet.
|
||||||
- **Images** : `billeterie_lvl[1-7].png`
|
- **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.
|
- **Animations** : Légère surbrillance au survol.
|
||||||
- **Couleurs** : Palette UI standard.
|
- **Couleurs** : Palette UI standard.
|
||||||
- **Textes** : "Billeterie", "Niveau X", "Revenus : Y".
|
- **Textes** : "Billeterie", "Niveau X", "Revenus : Y".
|
||||||
- **Formes** : Carré (case).
|
- **Formes** : Carré (case).
|
||||||
|
|
||||||
### Amélioration (Upgrade)
|
### Vue Isométrique
|
||||||
**Description UX** : Le joueur décide d'améliorer la billeterie pour augmenter la capacité et le prix du ticket.
|
- **File d'attente** : Afficher physiquement les sprites des visiteurs qui attendent devant le guichet.
|
||||||
**Description UI** : Bouton "Améliorer" dans le panneau de consultation, avec coût et prévisualisation des gains.
|
- **Portiques** : Animation d'ouverture/fermeture des barrières.
|
||||||
**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
|
|
||||||
|
|||||||
@@ -33,15 +33,26 @@ Sélection hiérarchique : **Famille** > **Spécialisation**.
|
|||||||
"sell_animal_threshold": "float (price factor)",
|
"sell_animal_threshold": "float (price factor)",
|
||||||
"expand_map_priority": "int (0-10)",
|
"expand_map_priority": "int (0-10)",
|
||||||
"research_priority": "int (0-10)"
|
"research_priority": "int (0-10)"
|
||||||
}
|
},
|
||||||
|
"iso_x": "integer",
|
||||||
|
"iso_y": "integer",
|
||||||
|
"z_index": "integer"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### 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
|
### 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -51,46 +62,72 @@ Activation par joueur (déconnexion) ou Spawn serveur (Bot permanent).
|
|||||||
Connexion joueur.
|
Connexion joueur.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| Profil choisi | Paramètres logique | 100% | Non |
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
| Condition | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Froid/Chaud extrême | Augmente achats régulation/biome | priorité survie + |
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
| Biome | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Biome défavorable à la majorité | Achats “changement milieu” | priorité survie + |
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
| Saison | Effet | Modificateur |
|
||||||
|
|---|---|---|
|
||||||
|
| Printemps | Focus reproduction | priorité éleveur + |
|
||||||
|
| Hiver | Focus survie | priorité conservateur + |
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
| Période | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Nuit | Actions limitées | fréquence + lente |
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
| Facteur | Effet sur Taux | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Score survie élevé | Bot tente reproduction | profil éleveur |
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
| Cause | Conséquence | Durée |
|
||||||
|
|---|---|---|
|
||||||
|
| Série de morts | Bot achète nourriture/soins | 24h |
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
| Facteur | Variation | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Stock bas | Achat immédiat | seuil profil |
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
| Action/État | Gain Attractivité | Rayon d'action |
|
||||||
|
|---|---:|---:|
|
||||||
|
| Placements optimisés | + | zoo du bot |
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
| Facteur | Variation | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Profil commerçant | Valeur cash + | ventes fréquentes |
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
**Fréquence Action** : 1 action toutes les 5 à 60 minutes (selon profil).
|
**Fréquence Action** : 1 action toutes les 5 à 60 minutes (selon profil).
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### 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
|
### Trajet Visiteurs
|
||||||
N/A
|
| Trajet | Règle | Notes |
|
||||||
|
|---|---|---|
|
||||||
|
| Rapport d’absence → 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
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -98,7 +135,10 @@ N/A
|
|||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
@@ -122,6 +162,15 @@ function runBotLogic(bot, zoo):
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Sélection du Profil (Configuration)
|
### Sélection du Profil (Configuration)
|
||||||
**Description UX** : Le joueur choisit comment son zoo sera géré en son absence.
|
**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`.
|
**Événements** : `SELECT_BOT_PROFILE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_bot_family_pick.mp3` (jingle court).
|
||||||
- **Sons** : `card_flip.mp3`.
|
- **Sons** : `card_flip.mp3`.
|
||||||
- **Graphiques** : Illustrations des familles (ex: Conservateur avec bouclier, Commerçant avec bourse).
|
- **Graphiques** : Illustrations des familles (ex: Conservateur avec bouclier, Commerçant avec bourse).
|
||||||
- **Images** : Portraits Bots.
|
- **Images** : Portraits Bots.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `bot_family_cards.webm` (1s loop, optionnel).
|
||||||
- **Animations** : Flip de carte au choix.
|
- **Animations** : Flip de carte au choix.
|
||||||
- **Couleurs** : Code couleur par famille (Vert=Conservateur, Jaune=Commerçant, etc.).
|
- **Couleurs** : Code couleur par famille (Vert=Conservateur, Jaune=Commerçant, etc.).
|
||||||
- **Textes** : Titres et Descriptions courtes.
|
- **Textes** : Titres et Descriptions courtes.
|
||||||
@@ -149,14 +198,13 @@ function runBotLogic(bot, zoo):
|
|||||||
**Intégration** : Bloquant au démarrage.
|
**Intégration** : Bloquant au démarrage.
|
||||||
**Navigation** : Lire -> Fermer.
|
**Navigation** : Lire -> Fermer.
|
||||||
**Événements** : `SHOW_REPORT`.
|
**Événements** : `SHOW_REPORT`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_report_open.mp3` (jingle court).
|
||||||
- **Sons** : `notification.mp3`.
|
- **Sons** : `notification.mp3`.
|
||||||
- **Graphiques** : Icône Robot.
|
- **Graphiques** : Icône Robot.
|
||||||
- **Images** : N/A
|
- **Images** : `icon_robot.png`, `report_bg.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `report_scroll.webm` (0.8s loop, optionnel).
|
||||||
- **Animations** : N/A
|
- **Animations** : Apparition slide-in + highlight des lignes importantes.
|
||||||
- **Couleurs** : Gris/Métal.
|
- **Couleurs** : Gris/Métal.
|
||||||
- **Textes** : Liste des actions.
|
- **Textes** : Liste des actions.
|
||||||
- **Formes** : Liste à puces.
|
- **Formes** : Liste à puces.
|
||||||
|
|||||||
@@ -26,7 +26,10 @@ Bâtiment commercial générant des revenus passifs grâce aux visiteurs.
|
|||||||
"stats": {
|
"stats": {
|
||||||
"revenue_total": "integer",
|
"revenue_total": "integer",
|
||||||
"visitors_served": "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 |
|
| Attractivité | 10 |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Stock** : 100 unités.
|
||||||
|
**Popularité** : 10/100.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Construction par le joueur sur case vide.
|
Construction par le joueur sur case vide.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
Destruction par le joueur (Remboursement partiel ?).
|
Destruction par le joueur (Remboursement 50%).
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Franchise** : Coût construction -10% si 5 boutiques identiques déjà posées (Économie d'échelle).
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Canicule** : Vente Eau x3. Vente Chocolat -50%.
|
||||||
|
**Froid** : Vente Chocolat x3. Vente Glaces -80%.
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### 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
|
### Impact Saisons
|
||||||
| Saison | Modificateur Ventes |
|
| Saison | Modificateur Ventes |
|
||||||
| :--- | :--- |
|
| :--- | :--- |
|
||||||
| Été | +20% (Boissons/Glaces) |
|
| Été | +20% (Boissons/Glaces) |
|
||||||
| Hiver | +10% (Chocolat chaud/Cadeaux) |
|
| Hiver | +10% (Chocolat chaud/Cadeaux) |
|
||||||
|
| Automne | +5% (Parapluies) |
|
||||||
|
| Printemps | Standard |
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
| Heure | Fréquentation |
|
| Heure | Fréquentation |
|
||||||
| :--- | :--- |
|
| :--- | :--- |
|
||||||
| 12h-14h | Pic (Repas) |
|
| 12h-14h | Pic (Repas - Food) |
|
||||||
| 16h-18h | Pic (Souvenirs avant départ) |
|
| 16h-18h | Pic (Souvenirs avant départ - Gifts) |
|
||||||
|
| Nuit | Fermé (0 Ventes) |
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Merchandising** : Vente peluche "Espèce du moment" x2 lors d'une naissance rare.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Deuil** : Ventes -20% dans les boutiques proches d'une mort récente (Ambiance triste).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Concurrence** : Si Stand Nourriture proche (< 3 cases), ventes Food partagées (-10% chacun).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
| Niveau | Rayon Attraction |
|
| Niveau | Rayon Attraction |
|
||||||
| :--- | :--- |
|
| :--- | :--- |
|
||||||
| 1 | 2 cases |
|
| 1 | 2 cases |
|
||||||
| 7 | 10 cases |
|
| 7 | 10 cases (Centre commercial) |
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Revente** : 50% de l'investissement initial + upgrades.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### 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
|
### 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
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Vente** : Gain de pièces.
|
* **Vente** : Gain de pièces.
|
||||||
* **File d'attente** : Si Capacité atteinte, visiteurs frustrés.
|
* **File d'attente** : Si Capacité atteinte, visiteurs frustrés.
|
||||||
|
* **Rupture Stock** : Si stock géré, fermeture temporaire.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
@@ -133,28 +142,38 @@ function processShop(shop, visitors):
|
|||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| `SHOP_FULL` | Warning | "Boutique pleine ! Des clients partent." |
|
| `SHOP_FULL` | Warning | "Boutique pleine ! Des clients partent." |
|
||||||
|
| `SHOP_PROMO` | Info | "Soldes lancées ! Affluence +20%." |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Vente (Passif)
|
### Vente (Passif)
|
||||||
**Description UX** : Les visiteurs entrent dans la boutique, y restent quelques secondes, puis ressortent. Des pièces volent vers le compteur.
|
**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.
|
**Description UI** : Animation de porte qui s'ouvre/ferme. Popups "+15" au-dessus du toit.
|
||||||
**Emplacement** : Case Boutique.
|
**Emplacement** : Case Boutique.
|
||||||
**Intégration** : Automatique.
|
**Intégration** : Automatique.
|
||||||
**Navigation** : N/A
|
**Navigation** : Auto (Comportement).
|
||||||
**Événements** : `SALE_MADE`.
|
**Événements** : `SALE_MADE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Musique d'ambiance "Supermarché" (Muzak).
|
||||||
- **Sons** : `coin_jingle.mp3` (volume bas, pas trop répétitif).
|
- **Sons** : `coin_jingle.mp3` (volume bas, pas trop répétitif).
|
||||||
- **Graphiques** : Sprite Boutique (différents skins selon type : Burger, Cadeaux).
|
- **Graphiques** : Sprite Boutique (différents skins selon type : Burger, Cadeaux).
|
||||||
- **Images** : N/A
|
- **Images** : Icônes Produits (Burger, Peluche, Ballon).
|
||||||
- **Vidéos** : N/A
|
- **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.
|
- **Animations** : Pièce dorée qui monte et disparaît.
|
||||||
- **Couleurs** : Or #FFD700.
|
- **Couleurs** : Or #FFD700.
|
||||||
- **Textes** : "+XX".
|
- **Textes** : "+XX".
|
||||||
- **Formes** : N/A
|
- **Formes** : Bulle de dialogue rectangulaire.
|
||||||
|
|
||||||
### Consultation Stats (Consultation)
|
### Consultation Stats (Consultation)
|
||||||
**Description UX** : Le joueur clique pour voir combien la boutique a rapporté.
|
**Description UX** : Le joueur clique pour voir combien la boutique a rapporté.
|
||||||
@@ -165,15 +184,15 @@ function processShop(shop, visitors):
|
|||||||
**Événements** : `OPEN_SHOP`.
|
**Événements** : `OPEN_SHOP`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Jingle "Caisse" (court).
|
||||||
- **Sons** : `ui_open.mp3`
|
- **Sons** : `ui_open.mp3`
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Graphique en barres simple.
|
||||||
- **Images** : Icône Caisse.
|
- **Images** : Icône Caisse.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Graphique animé des ventes (barres qui montent).
|
||||||
- **Animations** : N/A
|
- **Animations** : Barres qui montent progressivement.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Vert (Profit).
|
||||||
- **Textes** : Chiffres clés.
|
- **Textes** : Chiffres clés.
|
||||||
- **Formes** : N/A
|
- **Formes** : Rectangle arrondi.
|
||||||
|
|
||||||
### Construction (Action)
|
### Construction (Action)
|
||||||
**Description UX** : Le joueur choisit "Boutique" dans le menu construction et la place sur la grille.
|
**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`.
|
**Événements** : `BUILD_SHOP`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Bruit de chantier (marteau, scie).
|
||||||
- **Sons** : `construction_hammer.mp3`.
|
- **Sons** : `construction_hammer.mp3`.
|
||||||
- **Graphiques** : Sprite Fantôme semi-transparent.
|
- **Graphiques** : Sprite Fantôme semi-transparent.
|
||||||
- **Images** : N/A
|
- **Images** : Plan bleu (Blueprint) au sol.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Time-lapse construction (accéléré).
|
||||||
- **Animations** : Petit effet de poussière à la pose.
|
- **Animations** : Petit effet de poussière à la pose.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Bleu (Blueprint).
|
||||||
- **Textes** : N/A
|
- **Textes** : "Construction".
|
||||||
- **Formes** : N/A
|
- **Formes** : Grille de placement.
|
||||||
|
|||||||
@@ -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')",
|
"status": "enum ('idle', 'moving_to_target', 'moving_home')",
|
||||||
"cargo": "animal_uuid | null",
|
"cargo": "animal_uuid | null",
|
||||||
"position": { "x": "float", "y": "float" },
|
"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) |
|
| Confort | Basique (Stress normal) |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Kilométrage** : 0 km.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Démarrage jeu.
|
Démarrage jeu.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Panne** : Immobilisation temporaire si pas d'entretien (Réparation requise).
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Garage** : Conserve les upgrades de vitesse après reset (Véhicule de fonction).
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Tout-terrain** : Bonus vitesse sur terre si pneus adaptés (Upgrade). Ralenti sur Sable.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
**Hiver** : Vitesse réduite de 20% (Neige).
|
**Hiver** : Vitesse réduite de 20% (Neige).
|
||||||
|
**Automne** : Risque de boue (Vitesse -5%).
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### 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
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
@@ -77,13 +82,13 @@ N/A
|
|||||||
Si trajet trop long (> 24h) sans confort, risque de mort (Faim/Stress).
|
Si trajet trop long (> 24h) sans confort, risque de mort (Faim/Stress).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Carburant** : Consomme de l'essence (coût au km) ou électrique (recharge au zoo).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Design** : Un beau camion (Skin) fait "Pro" (+1 Attractivité).
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Occasion** : Valeur de revente du camion (fictive, pour score richesse).
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
@@ -99,15 +104,16 @@ N/A
|
|||||||
| 7 | 200 km/h (Avion/Hélico ?) |
|
| 7 | 200 km/h (Avion/Hélico ?) |
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Entretien** : 10 pièces tous les 1000 km.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Klaxon** : Écarte les visiteurs sur le passage (au zoo) pour éviter les accidents.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Départ** : Camion part.
|
* **Départ** : Camion part.
|
||||||
* **Arrivée** : Camion revient avec marchandise.
|
* **Arrivée** : Camion revient avec marchandise.
|
||||||
|
* **Crevaison** : Retard aléatoire.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
@@ -137,9 +143,19 @@ function updateTruck(truck, deltaTime):
|
|||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| `TRUCK_ARRIVED` | Info | "Le camion est revenu au zoo." |
|
| `TRUCK_ARRIVED` | Info | "Le camion est revenu au zoo." |
|
||||||
|
| `TRUCK_DELAY` | Info | "Le camion a du retard (Météo/Panne)." |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Envoi en Mission (Action)
|
### Envoi en Mission (Action)
|
||||||
**Description UX** : Le joueur achète un animal sur la carte du monde. Le camion part automatiquement le chercher.
|
**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`.
|
**Événements** : `TRUCK_DEPART`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Bruit de moteur au démarrage.
|
||||||
- **Sons** : `engine_start.mp3`, `horn.mp3`.
|
- **Sons** : `engine_start.mp3`, `horn.mp3`.
|
||||||
- **Graphiques** : Sprite Camion (Vue dessus et côté).
|
- **Graphiques** : Sprite Camion (Vue dessus et côté).
|
||||||
- **Images** : N/A
|
- **Images** : Carte routière (Icône).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Zoom caméra sur le camion qui part.
|
||||||
- **Animations** : Roues qui tournent, fumée échappement.
|
- **Animations** : Roues qui tournent, fumée échappement.
|
||||||
- **Couleurs** : Jaune/Noir (Chantier) ou Blanc (Livraison).
|
- **Couleurs** : Jaune/Noir (Chantier) ou Blanc (Livraison).
|
||||||
- **Textes** : "En route vers [Destination]".
|
- **Textes** : "En route vers [Destination]".
|
||||||
- **Formes** : N/A
|
- **Formes** : Flèche de direction.
|
||||||
|
|
||||||
### Suivi Trajet (Passif/Actif)
|
### Suivi Trajet (Passif/Actif)
|
||||||
**Description UX** : Le joueur peut suivre le camion sur la carte du monde.
|
**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`.
|
**Événements** : `TRACK_TRUCK`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Sonar "Ping" régulier.
|
||||||
- **Sons** : Bruit moteur continu (faible).
|
- **Sons** : Bruit moteur continu (faible).
|
||||||
- **Graphiques** : Ligne pointillée (trajet).
|
- **Graphiques** : Ligne pointillée (trajet).
|
||||||
- **Images** : N/A
|
- **Vidéos** : Ligne de trajet qui se dessine.
|
||||||
- **Vidéos** : N/A
|
|
||||||
- **Animations** : Déplacement linéaire.
|
- **Animations** : Déplacement linéaire.
|
||||||
- **Couleurs** : Ligne Blanche.
|
- **Couleurs** : Ligne Blanche.
|
||||||
- **Textes** : "Arrivée dans MM:SS".
|
- **Textes** : "Arrivée dans MM:SS".
|
||||||
- **Formes** : N/A
|
- **Formes** : Cercle autour du camion.
|
||||||
|
|
||||||
### Activité d'Attente (Gameplay)
|
### 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.
|
**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.
|
- **Sons** : `wipe.mp3` (essuie-glace). **Design ASMR** : Bruit d'éponge mouillée ou de raclette satisfaisant.
|
||||||
- **Graphiques** : Taches de boue/insectes.
|
- **Graphiques** : Taches de boue/insectes.
|
||||||
- **Images** : Vue cockpit simplifiée.
|
- **Images** : Vue cockpit simplifiée.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Reflet du soleil sur le pare-brise.
|
||||||
- **Animations** : Essuie-glace qui bouge.
|
- **Animations** : Essuie-glace qui bouge.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Marron (Boue), Vert (Insectes).
|
||||||
- **Textes** : "Boost !"
|
- **Textes** : "Boost !"
|
||||||
- **Formes** : N/A
|
- **Formes** : Éponge (Curseur).
|
||||||
|
|
||||||
### Arrivée (Passif)
|
### Arrivée (Passif)
|
||||||
**Description UX** : Le camion revient au zoo et se gare.
|
**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).
|
**Notification Push** : "Le camion est de retour !" (si application fermée).
|
||||||
**Emplacement** : Case Camion.
|
**Emplacement** : Case Camion.
|
||||||
**Intégration** : Fin cycle.
|
**Intégration** : Fin cycle.
|
||||||
**Navigation** : N/A
|
**Navigation** : Automatique (Cinématique).
|
||||||
**Événements** : `TRUCK_ARRIVE`.
|
**Événements** : `TRUCK_ARRIVE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Bruit de freins pneumatiques "Pschhh".
|
||||||
- **Sons** : `truck_stop.mp3`.
|
- **Sons** : `truck_stop.mp3`.
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Traces de pneus au sol.
|
||||||
- **Images** : N/A
|
- **Vidéos** : Fumée d'échappement qui se dissipe.
|
||||||
- **Vidéos** : N/A
|
|
||||||
- **Animations** : Freinage.
|
- **Animations** : Freinage.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Rouge (Feux stop).
|
||||||
- **Textes** : N/A
|
- **Textes** : "Livraison effectuée".
|
||||||
- **Formes** : N/A
|
- **Formes** : Carré de stationnement.
|
||||||
|
|||||||
@@ -25,15 +25,18 @@ Une carte est une grille de cases représentant un espace de jeu ou de navigatio
|
|||||||
"height": "integer",
|
"height": "integer",
|
||||||
"grid": [
|
"grid": [
|
||||||
[ { "case_ref": "case_id" } ]
|
[ { "case_ref": "case_id" } ]
|
||||||
]
|
],
|
||||||
|
"iso_x": "integer",
|
||||||
|
"iso_y": "integer",
|
||||||
|
"z_index": "integer"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A (Dépendant du type)
|
**Taille** : Définie à la création.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Densité** : 0% occupée.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -43,64 +46,79 @@ Création à l'initialisation du jeu/compte.
|
|||||||
Suppression du compte.
|
Suppression du compte.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Configuration** : La disposition des biomes peut être conservée ou régénérée.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### 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
|
### Impact Saisons
|
||||||
N/A
|
**Cycle** : La carte orchestre le changement de saison pour toutes les entités.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Cycle** : La carte gère l'horloge mondiale.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Population** : La carte suit le nombre total d'animaux pour les limites globales.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Cimetière** : La carte peut garder une trace des morts (statistiques).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Ressources** : La carte gère les stocks globaux si centralisés.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Score Global** : Somme des attractivités locales.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Valorisation** : Valeur totale du terrain.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Temps** : La carte gère le `deltaTime` global.
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Économie** : La carte centralise les flux financiers (optionnel).
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Réseau** : La carte définit le graphe de navigation global.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
N/A
|
* **Tick** : Mise à jour périodique de toutes les entités.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
Voir `agrandissement_carte.md`.
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
N/A
|
```javascript
|
||||||
|
function updateMap(map):
|
||||||
|
foreach entity in map.entities:
|
||||||
|
entity.update()
|
||||||
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `MAP_LOADED` | Info | "Carte chargée avec succès." |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Navigation (Action)
|
### Navigation (Action)
|
||||||
**Description UX** : Le joueur explore la carte.
|
**Description UX** : Le joueur explore la carte.
|
||||||
@@ -114,8 +132,8 @@ N/A
|
|||||||
- **Musiques** : Ambiance calme (Zoo) / Aventure (Monde).
|
- **Musiques** : Ambiance calme (Zoo) / Aventure (Monde).
|
||||||
- **Sons** : Vent léger.
|
- **Sons** : Vent léger.
|
||||||
- **Graphiques** : Grille (Grid lines) subtile.
|
- **Graphiques** : Grille (Grid lines) subtile.
|
||||||
- **Images** : N/A
|
- **Images** : Fond d'écran (Skybox).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Nuages qui passent (Overlay).
|
||||||
- **Animations** : Inertie du mouvement.
|
- **Animations** : Inertie du mouvement.
|
||||||
- **Couleurs** : Fond neutre hors carte.
|
- **Couleurs** : Fond neutre hors carte.
|
||||||
- **Textes** : Coordonnées (Debug).
|
- **Textes** : Coordonnées (Debug).
|
||||||
|
|||||||
@@ -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)",
|
"width": "integer (très grand)",
|
||||||
"height": "integer",
|
"height": "integer",
|
||||||
"sites": [ { "id": "uuid", "type": "zoo|city|lab", "pos": { "x": "int", "y": "int" } } ],
|
"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) |
|
| Nb Labos | 2 (dans rayon départ) |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Score Exploration** : 0% (Carte dévoilée).
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -63,51 +66,52 @@ Unique (Singleton serveur).
|
|||||||
Jamais.
|
Jamais.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Cartographie** : Les zones découvertes restent visibles après un reset (Connaissance acquise).
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Météo Globale** : Nuages, Pluie ou Neige visibles sur la carte (Effet visuel + Gameplay).
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### 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
|
### Impact Saisons
|
||||||
N/A
|
**Visuel** : La carte change de teinte (Blanc en Hiver, Orange en Automne, Vert vif au Printemps).
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### 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
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Migration** : En saison des amours, des troupeaux sauvages (décoratifs) migrent sur la carte.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Cimetière des Éléphants** : Lieu légendaire caché (Easter Egg) donnant un bonus si découvert.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Ressources** : Les villes produisent de la nourriture (Champs autour des villes).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Rayonnement** : Un zoo très attractif (> 10k visiteurs) émet un halo doré visible de loin.
|
||||||
|
|
||||||
### Impact Valeur
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Péages** : Taxe de passage sur certaines routes commerciales (1% valeur cargaison).
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### 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
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Spawn Bot** : Apparition nouveau zoo bot.
|
* **Spawn Bot** : Apparition nouveau zoo bot.
|
||||||
* **Spawn Truck** : Camion visible.
|
* **Spawn Truck** : Camion visible.
|
||||||
|
* **Embouteillage** : Ralentissement sur les routes principales.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
@@ -115,13 +119,33 @@ Voir `agrandissement_carte.md`.
|
|||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Vue Globale (Passif)
|
### Vue Globale (Passif)
|
||||||
**Description UX** : Le joueur voit les autres acteurs et les flux économiques.
|
**Description UX** : Le joueur voit les autres acteurs et les flux économiques.
|
||||||
@@ -136,7 +160,7 @@ N/A
|
|||||||
- **Sons** : Vent, Bruit lointain trafic.
|
- **Sons** : Vent, Bruit lointain trafic.
|
||||||
- **Graphiques** : Fond carte (Biomes flous).
|
- **Graphiques** : Fond carte (Biomes flous).
|
||||||
- **Images** : Icônes Sites.
|
- **Images** : Icônes Sites.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Nuages dynamiques (shader).
|
||||||
- **Animations** : Camions qui bougent.
|
- **Animations** : Camions qui bougent.
|
||||||
- **Couleurs** : Desaturées (pour faire ressortir les icônes).
|
- **Couleurs** : Desaturées (pour faire ressortir les icônes).
|
||||||
- **Textes** : Noms des villes/zoos.
|
- **Textes** : Noms des villes/zoos.
|
||||||
@@ -147,16 +171,16 @@ N/A
|
|||||||
**Description UI** : Nuages ou zone sombre en périphérie.
|
**Description UI** : Nuages ou zone sombre en périphérie.
|
||||||
**Emplacement** : Bords Carte.
|
**Emplacement** : Bords Carte.
|
||||||
**Intégration** : Mask.
|
**Intégration** : Mask.
|
||||||
**Navigation** : N/A
|
**Navigation** : Zoom-out via upgrade carte ; au clic sur une zone masquée, afficher un tooltip “Zone non explorée”.
|
||||||
**Événements** : N/A
|
**Événements** : `FOG_HOVER`, `FOG_CLICK_BLOCKED`
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ambience_fog_soft.mp3` (optionnel, très discret).
|
||||||
- **Sons** : N/A
|
- **Sons** : `fog_whoosh.mp3` (au reveal), `ui_denied.mp3` (clic zone bloquée).
|
||||||
- **Graphiques** : Texture Nuages.
|
- **Graphiques** : Texture Nuages.
|
||||||
- **Images** : N/A
|
- **Images** : Masque alpha (bords flous).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de brume (particules).
|
||||||
- **Animations** : Nuages qui dérivent lentement.
|
- **Animations** : Nuages qui dérivent lentement.
|
||||||
- **Couleurs** : Blanc/Gris.
|
- **Couleurs** : Blanc/Gris.
|
||||||
- **Textes** : "Zone Inexplorée".
|
- **Textes** : "Zone Inexplorée".
|
||||||
- **Formes** : N/A
|
- **Formes** : Zone non cliquable.
|
||||||
|
|||||||
@@ -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.
|
La carte du zoo est l'espace principal de gestion du joueur où il place ses bâtiments et ses animaux.
|
||||||
|
|
||||||
## Structure
|
## Structure
|
||||||
|
- **Vue** : Isométrique (2.5D).
|
||||||
|
- **Affichage** : Plein écran sous la barre du haut, dézoom possible.
|
||||||
- **Grille** : Composée de cases individuelles.
|
- **Grille** : Composée de cases individuelles.
|
||||||
- **Biomes** : Divisée en tiers de largeur :
|
- **Biomes** : Divisée en tiers de largeur :
|
||||||
- Gauche : Prairie
|
- 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",
|
"owner_id": "uuid",
|
||||||
"width": "integer (init 5)",
|
"width": "integer (init 5)",
|
||||||
"height": "integer (init 6)",
|
"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) |
|
| Biomes | 3 (Tiers) |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Score Aménagement** : 0/100 (Utilisation de l'espace).
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Création du compte joueur.
|
Création du compte joueur.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Reset Joueur** : Suppression du compte ou Faillite totale.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Fondations** : Les extensions de terrain achetées sont conservées en cas de "Soft Reset" (Prestige).
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### 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
|
### Impact Saisons
|
||||||
N/A
|
**Décor** : Les arbres (décoration) changent de couleur (Vert -> Orange -> Blanc -> Bourgeons).
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Lumières** : Les lampadaires et bâtiments s'allument la nuit (Ambiance).
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Intimité** : Les buissons (décoration) placés autour d'un enclos augmentent la fertilité (+5%).
|
||||||
|
|
||||||
### Impact Mort
|
### 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
|
### Impact Nourriture
|
||||||
N/A
|
**Pousse** : L'herbe (nourriture gratuite) repousse lentement sur les cases Prairie vides.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Beauté** : +1 Attractivité par élément de décoration (Arbre, Banc, Fontaine).
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Foncier** : Chaque case achetée augmente la valeur théorique du zoo.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Chemins** : Augmentent la vitesse de déplacement des visiteurs (+50%).
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Entretien Espaces Verts** : Coût hebdomadaire pour garder le zoo propre (1 pièce/case).
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### 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
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Agrandissement** : Ajout d'une colonne/ligne ou case adjacente.
|
* **Agrandissement** : Ajout d'une colonne/ligne ou case adjacente.
|
||||||
|
* **Catastrophe** : Inondation (Océan déborde) ou Éboulement (Montagne).
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
@@ -109,7 +138,7 @@ Voir `achat_upgrade_case_zoo.md`.
|
|||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
```
|
```javascript
|
||||||
function initZooMap():
|
function initZooMap():
|
||||||
width = 6
|
width = 6
|
||||||
height = 5
|
height = 5
|
||||||
@@ -120,10 +149,22 @@ function initZooMap():
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `MAP_EXPAND` | Succès | "Le zoo s'agrandit ! Nouvelles terres disponibles." |
|
||||||
|
|
||||||
# Annexes UX/UI
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Interaction Grille (Action)
|
### Interaction Grille (Action)
|
||||||
**Description UX** : Le joueur clique sur une case pour voir son contenu ou construire.
|
**Description UX** : Le joueur clique sur une case pour voir son contenu ou construire.
|
||||||
@@ -134,14 +175,13 @@ N/A
|
|||||||
**Événements** : `CLICK_CASE`.
|
**Événements** : `CLICK_CASE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Son "Pop" discret.
|
||||||
- **Sons** : `click_tile.mp3`.
|
- **Sons** : `click_tile.mp3`.
|
||||||
- **Graphiques** : Cadre de sélection blanc/brillant.
|
- **Graphiques** : Cadre de sélection blanc/brillant.
|
||||||
- **Images** : N/A
|
- **Vidéos** : Effet de "Pop" au clic.
|
||||||
- **Vidéos** : N/A
|
|
||||||
- **Animations** : Pulsation du cadre.
|
- **Animations** : Pulsation du cadre.
|
||||||
- **Couleurs** : Blanc.
|
- **Couleurs** : Blanc.
|
||||||
- **Textes** : N/A
|
- **Textes** : Nom de l'objet sélectionné.
|
||||||
- **Formes** : Carré.
|
- **Formes** : Carré.
|
||||||
|
|
||||||
### Mode Construction (Action)
|
### Mode Construction (Action)
|
||||||
@@ -155,12 +195,11 @@ N/A
|
|||||||
**Événements** : `ENTER_BUILD_MODE`.
|
**Événements** : `ENTER_BUILD_MODE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Musique "Mode Édition" (calme, boucle).
|
||||||
- **Sons** : `grid_snap.mp3`.
|
- **Sons** : `grid_snap.mp3`.
|
||||||
- **Graphiques** : Grille semi-transparente.
|
- **Graphiques** : Grille semi-transparente.
|
||||||
- **Images** : N/A
|
- **Vidéos** : Effet de grille holographique.
|
||||||
- **Vidéos** : N/A
|
|
||||||
- **Animations** : Snap to grid.
|
- **Animations** : Snap to grid.
|
||||||
- **Couleurs** : Vert/Rouge (Alpha 0.5).
|
- **Couleurs** : Vert/Rouge (Alpha 0.5).
|
||||||
- **Textes** : N/A
|
- **Textes** : "Placer ici".
|
||||||
- **Formes** : Carrés.
|
- **Formes** : Carrés.
|
||||||
|
|||||||
@@ -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.
|
- **Couleur (Milieu)** : Définit le biome et l'environnement visuel.
|
||||||
- **Température** : Liée à la couleur/biome.
|
- **Température** : Liée à la couleur/biome.
|
||||||
- **Contenu** : Peut contenir un bâtiment, un animal, un visiteur, ou être vide.
|
- **Contenu** : Peut contenir un bâtiment, un animal, un visiteur, ou être vide.
|
||||||
- **État** : Peut avoir des indicateurs visuels (herbe jaunie, givre).
|
- **État** : Peut avoir des indicateurs visuels (herbe jaunie, givre, fertilité).
|
||||||
|
|
||||||
## Règles
|
|
||||||
- Les transitions de propriétés (couleur, température) entre cases adjacentes doivent être douces.
|
|
||||||
|
|
||||||
# Annexes Techniques
|
# Annexes Techniques
|
||||||
|
|
||||||
@@ -21,102 +18,88 @@ Une case est l'unité élémentaire de la grille (Zoo ou Monde).
|
|||||||
{
|
{
|
||||||
"x": "integer",
|
"x": "integer",
|
||||||
"y": "integer",
|
"y": "integer",
|
||||||
|
"grid_id": "string (stable key: `${x}:${y}`)",
|
||||||
|
"owner_id": "uuid | null (null = carte neutre/monde)",
|
||||||
|
"created_at": "timestamp",
|
||||||
|
"updated_at": "timestamp",
|
||||||
"biome_id": "integer",
|
"biome_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_ref": "uuid | null",
|
||||||
"content_type": "string",
|
"content_type": "enum('empty','animal','building','visitor','staff','decoration','path','bridge','water','fence')",
|
||||||
"state_flags": ["frozen", "dry", "dirty"]
|
"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
|
### Contraintes (Invariants)
|
||||||
N/A
|
* **Unicité** : (`x`,`y`) est unique dans une grille.
|
||||||
|
* **Cohérence contenu** : si `content_type === 'empty'` alors `content_ref === null`.
|
||||||
### Scores Initiaux
|
* **Température** : `temperature_offset` s’applique additivement à la température “biome” et aux modificateurs (saison, jour/nuit).
|
||||||
N/A
|
* **Z-index isométrique** : `z_index` est dérivé principalement de `y` (et secondairement de `x`) pour garantir le recouvrement correct.
|
||||||
|
|
||||||
## 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
|
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Feedback État (Passif)
|
### Fertilisation (Action)
|
||||||
**Description UX** : La case montre son état physique.
|
**Description UX** : Le joueur améliore le sol pour que l'herbe repousse plus vite.
|
||||||
**Description UI** : Overlay de texture (Givre, Craquelures, Boue).
|
**Description UI** : Outil "Sac d'engrais". Clic sur la case.
|
||||||
**Emplacement** : Case.
|
**Emplacement** : Menu Outils -> Case.
|
||||||
**Intégration** : Layer 1 (Au-dessus du fond, sous le contenu).
|
**Intégration** : Curseur.
|
||||||
**Navigation** : N/A
|
**Navigation** : Clic.
|
||||||
**Événements** : `STATE_UPDATE`.
|
**Événements** : `FERTILIZE_SOIL`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ambience_garden_soft.mp3` (léger, discret).
|
||||||
- **Sons** : N/A
|
- **Sons** : `scatter.mp3`.
|
||||||
- **Graphiques** : Textures alpha (Givre blanc, Craquelures marron).
|
- **Graphiques** : Particules vertes/brunes.
|
||||||
- **Images** : N/A
|
- **Images** : Texture terre riche (plus foncée).
|
||||||
- **Vidéos** : N/A
|
- **Animations** : Poussière qui retombe.
|
||||||
- **Animations** : Apparition progressive (Fade).
|
- **Couleurs** : Marron foncé.
|
||||||
- **Couleurs** : Blanc, Marron, Gris.
|
- **Textes** : `TOOL_FERTILIZE` = "Engrais", `CASE_FERTILIZED` = "Sol fertilisé"
|
||||||
- **Textes** : N/A
|
- **Formes** : Curseur rond (outil), surbrillance tuile.
|
||||||
- **Formes** : Carré.
|
|
||||||
|
|||||||
@@ -20,77 +20,93 @@ Hérite de `Case (Générique)`.
|
|||||||
Pas de propriétés supplémentaires spécifiques.
|
Pas de propriétés supplémentaires spécifiques.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### 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
|
### Scores Initiaux
|
||||||
N/A
|
**Trafic** : 0 camions passés.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Génération monde.
|
Génération monde.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Jamais** : La grille est immuable.
|
||||||
|
|
||||||
### Hérédité
|
### 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Fond** : Définit le coût de traversée (Montagne > Plaine).
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Visuel** : La case change de couleur selon la saison globale.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Luminosité** : S'assombrit la nuit.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Faune locale** : Reproduction simulée en arrière-plan pour les animaux sauvages (décoratif).
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Cycle naturel** : Les animaux sauvages meurent et disparaissent.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Ressources** : Certaines cases contiennent des buissons de baies.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Influence** : Si proche d'une ville, la case a une "Valeur de Passage" élevée.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Terrain** : Prix fictif au m² (pour le lore).
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Frottement** : Ralentit les camions selon le biome (Sable = lent).
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Péage** : Traverser certaines zones coûte des pièces.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Flux** : Visualisation des flux migratoires.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
N/A
|
* **Météo** : Orage sur la case.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
| Niveau | Coût | Effet |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| 1 | 1000 | Route pavée (Vitesse +10%) |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
N/A
|
```javascript
|
||||||
|
function getTravelCost(case):
|
||||||
|
return baseCost * biomeMultiplier
|
||||||
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `ZONE_DISCOVERED` | Info | "Nouvelle zone découverte !" |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Survol (Passif)
|
### Survol (Passif)
|
||||||
**Description UX** : Explorer la carte du monde.
|
**Description UX** : Explorer la carte du monde.
|
||||||
@@ -101,12 +117,12 @@ N/A
|
|||||||
**Événements** : `HOVER_WORLD_CASE`.
|
**Événements** : `HOVER_WORLD_CASE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Thème "Exploration".
|
||||||
- **Sons** : N/A
|
- **Sons** : `hover_soft.mp3`.
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Highlight case.
|
||||||
- **Images** : N/A
|
- **Images** : Texture Biome.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de brillance au survol.
|
||||||
- **Animations** : N/A
|
- **Animations** : Légère surbrillance.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Blanc (Alpha).
|
||||||
- **Textes** : N/A
|
- **Textes** : Coordonnées X,Y.
|
||||||
- **Formes** : N/A
|
- **Formes** : Carré/Hexagone.
|
||||||
|
|||||||
@@ -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)`.
|
Hérite de `Case (Générique)`.
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"last_visit_time": "timestamp",
|
"last_visit_time": "timestamp | null",
|
||||||
"quality_score": "float (0-100)"
|
"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éristiques Initiales
|
||||||
| Caractéristique | Valeur Initiale |
|
| Caractéristique | Valeur Initiale |
|
||||||
| :--- | :--- |
|
| :--- | :--- |
|
||||||
@@ -42,17 +58,19 @@ Hérite de `Case (Générique)`.
|
|||||||
| Qualité | 100 |
|
| Qualité | 100 |
|
||||||
|
|
||||||
### Scores Initiaux
|
### 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Génération zoo.
|
Génération zoo.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Jamais** : Une case ne disparaît pas, elle change juste de contenu.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Qualité du Sol** : Un sol bien entretenu (fertilisé) garde ses bonus après un reset partiel.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
@@ -62,40 +80,41 @@ Voir `case_generique.md`.
|
|||||||
Voir `case_generique.md`.
|
Voir `case_generique.md`.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Neige** : La case devient blanche en hiver (si T° < 0).
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Ombres** : Les ombres des objets sur la case tournent avec le soleil.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Lieu de rencontre** : Les cases "Buissons" favorisent les rencontres.
|
||||||
|
|
||||||
### Impact Mort
|
### 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
|
### Impact Nourriture
|
||||||
N/A
|
**Pâturage** : Une case herbeuse peut être broutée (devient terreuse).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Vue** : Une case "Point de Vue" (hauteur) augmente l'attractivité des animaux alentour.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Emplacement** : Une case proche de l'entrée vaut plus cher (emplacement premium pour boutiques).
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Revêtement** : Herbe (Lent), Terre (Moyen), Pavés (Rapide).
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Nettoyage** : Coût si la case est sale (déchets visiteurs).
|
||||||
|
|
||||||
### Trajet 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
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Passage Visiteur** : Met à jour `last_visit_time`.
|
* **Passage Visiteur** : Met à jour `last_visit_time`.
|
||||||
|
* **Salissure** : Apparition d'un déchet.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
@@ -110,10 +129,23 @@ function checkAnimalDisappearance(case):
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Sélection (Action)
|
### Sélection (Action)
|
||||||
**Description UX** : Clic sur une case zoo.
|
**Description UX** : Clic sur une case zoo.
|
||||||
@@ -124,12 +156,12 @@ N/A
|
|||||||
**Événements** : `SELECT_ZOO_CASE`.
|
**Événements** : `SELECT_ZOO_CASE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Son "Click".
|
||||||
- **Sons** : `select_soft.mp3`.
|
- **Sons** : `select_soft.mp3`.
|
||||||
- **Graphiques** : Cadre sélection.
|
- **Graphiques** : Cadre sélection.
|
||||||
- **Images** : N/A
|
- **Images** : Icône Menu Contextuel.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de sélection (contour brillant).
|
||||||
- **Animations** : N/A
|
- **Animations** : Rebondissement léger du contenu.
|
||||||
- **Couleurs** : Blanc.
|
- **Couleurs** : Blanc.
|
||||||
- **Textes** : N/A
|
- **Textes** : "Case [X,Y]".
|
||||||
- **Formes** : Carré.
|
- **Formes** : Carré.
|
||||||
|
|||||||
@@ -25,7 +25,10 @@ Bâtiment produisant des points de science/recherche.
|
|||||||
"stats": {
|
"stats": {
|
||||||
"points_generated": "integer",
|
"points_generated": "integer",
|
||||||
"last_collection": "timestamp"
|
"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) |
|
| Rareté Visible | Niveau 1 (Commun) |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Archives** : 0 découvertes.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -47,36 +50,37 @@ Présent au démarrage.
|
|||||||
Indestructible (ou un seul obligatoire).
|
Indestructible (ou un seul obligatoire).
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Archives** : 10% des points de recherche conservés au reset (Savoir accumulé).
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Surchauffe** : Production -10% si Canicule (Surchauffe serveurs/cerveaux).
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Stabilité** : Terrain stable requis (pas de marais). Si Marais : Coût construction x2.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Rentrée scolaire** : +10% production en Automne (Stagiaires).
|
||||||
|
**Vacances** : -5% production en Été.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
Production continue 24h/24.
|
Production continue 24h/24.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Étude** : +50 pts recherche à chaque naissance rare dans le zoo.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Autopsie** : +20 pts recherche à chaque mort (Triste mais utile).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Cafétéria** : Consomme 5 unités nourriture/jour pour le personnel.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Conférences** : +10 Attractivité le week-end (Vulgarisation scientifique).
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Brevets** : Valeur intrinsèque élevée. Revente impossible (Bien public).
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
@@ -92,14 +96,15 @@ N/A
|
|||||||
| 7 | 600 |
|
| 7 | 600 |
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Subventions** : Coût fonctionnement réduit de 50% si Réputation Zoo > 80.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Musée** : Si module Musée (Niv 4+), attire visiteurs comme une attraction secondaire.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Découverte** : Déblocage d'une nouvelle zone carte monde.
|
* **Découverte** : Déblocage d'une nouvelle zone carte monde.
|
||||||
|
* **Percée** : Gain immédiat de 500 pts (Aléatoire).
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
@@ -128,9 +133,19 @@ function updateResearch(center):
|
|||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| `RESEARCH_UNLOCK` | Info | "Nouvelle zone de carte découverte !" |
|
| `RESEARCH_UNLOCK` | Info | "Nouvelle zone de carte découverte !" |
|
||||||
|
| `RESEARCH_BOOST` | Info | "Percée scientifique ! +500 pts." |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Collecte de Points (Action)
|
### 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é).
|
**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`.
|
**Événements** : `COLLECT_RESEARCH`.
|
||||||
|
|
||||||
#### Assets
|
#### 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.
|
- **Sons** : `bubble_pop.mp3` ou `sci_fi_bloop.mp3`. **Design ASMR** : "Bloop" liquide ou tintement cristallin.
|
||||||
- **Graphiques** : Icône Fiole bleue/violette.
|
- **Graphiques** : Icône Fiole bleue/violette.
|
||||||
- **Images** : N/A
|
- **Images** : Particules d'atomes.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de liquide bouillonnant (shader).
|
||||||
- **Animations** : Flottement (bobbing) de l'icône. Trajectoire courbe des points vers le HUD.
|
- **Animations** : Flottement (bobbing) de l'icône. Trajectoire courbe des points vers le HUD.
|
||||||
- **Couleurs** : Bleu Science #0088FF.
|
- **Couleurs** : Bleu Science #0088FF.
|
||||||
- **Textes** : "+10 RP".
|
- **Textes** : "+10 RP".
|
||||||
@@ -160,11 +175,11 @@ function updateResearch(center):
|
|||||||
**Événements** : `OPEN_RESEARCH`.
|
**Événements** : `OPEN_RESEARCH`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Ambiance "Laboratoire" (bourdonnement machines).
|
||||||
- **Sons** : `ui_open.mp3`
|
- **Sons** : `ui_open.mp3`
|
||||||
- **Graphiques** : Style High-Tech / Labo.
|
- **Graphiques** : Style High-Tech / Labo.
|
||||||
- **Images** : `radar_icon.png`.
|
- **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).
|
- **Animations** : Radar qui balaie (décoratif).
|
||||||
- **Couleurs** : Blanc, Gris, Bleu néon.
|
- **Couleurs** : Blanc, Gris, Bleu néon.
|
||||||
- **Textes** : "Portée Radar : X km".
|
- **Textes** : "Portée Radar : X km".
|
||||||
@@ -179,12 +194,481 @@ function updateResearch(center):
|
|||||||
**Événements** : `UPGRADE_RESEARCH`.
|
**Événements** : `UPGRADE_RESEARCH`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Son "Upgrade" futuriste.
|
||||||
- **Sons** : `upgrade_tech.mp3` (son électronique).
|
- **Sons** : `upgrade_tech.mp3` (son électronique).
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Schéma technique (Blueprint).
|
||||||
- **Images** : N/A
|
- **Images** : Icône Puce Électronique.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Hologramme de construction.
|
||||||
- **Animations** : Flash bleu sur le bâtiment.
|
- **Animations** : Flash bleu sur le bâtiment.
|
||||||
- **Couleurs** : Bleu.
|
- **Couleurs** : Bleu.
|
||||||
- **Textes** : N/A
|
- **Textes** : "Upgrade Terminé".
|
||||||
- **Formes** : N/A
|
- **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 d’affichage, 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 n’est 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
55
docs/specs/chemin.md
Normal 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
531
docs/specs/chercheur.md
Normal 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 n’interagit 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 |
|
||||||
@@ -29,12 +29,15 @@ Mécanisme de vente entre joueurs/bots sur la Carte du Monde.
|
|||||||
"highest_bidder_id": "uuid | null",
|
"highest_bidder_id": "uuid | null",
|
||||||
"end_time": "timestamp",
|
"end_time": "timestamp",
|
||||||
"status": "enum ('active', 'pending_validation', 'finalizing', 'completed', 'cancelled')",
|
"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
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Durée par défaut** : 24h.
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
@@ -59,10 +62,19 @@ function finalizeAuction(auction):
|
|||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| `BID_PLACED` | Info | "Offre placée avec succès." |
|
| `BID_PLACED` | Info | "Offre placée avec succès." |
|
||||||
| `OUTBID` | Alerte | "Vous avez été surenchéri !" |
|
| `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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Consultation des Offres (Consultation)
|
### Consultation des Offres (Consultation)
|
||||||
**Description UX** : Le joueur survole les zoos sur la carte du monde pour voir les offres.
|
**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`.
|
**Événements** : `HOVER_OFFER`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_market_hover.mp3` (jingle discret optionnel).
|
||||||
- **Sons** : `hover_soft.mp3`.
|
- **Sons** : `hover_soft.mp3`.
|
||||||
- **Graphiques** : Cadre Offre (Doré si rare).
|
- **Graphiques** : Cadre Offre (Doré si rare).
|
||||||
- **Images** : Icône Animal.
|
- **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.
|
- **Animations** : Prix qui clignote si nouvelle enchère.
|
||||||
- **Couleurs** : Vert (Abordable), Rouge (Trop cher).
|
- **Couleurs** : Vert (Abordable), Rouge (Trop cher).
|
||||||
- **Textes** : "Lapin Rare - 500$".
|
- **Textes** : "Lapin Rare - 500$".
|
||||||
@@ -92,15 +104,15 @@ function finalizeAuction(auction):
|
|||||||
**Événements** : `PLACE_BID`.
|
**Événements** : `PLACE_BID`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_market_bid.mp3` (jingle court).
|
||||||
- **Sons** : `bid_placed.mp3` (bruit de marteau).
|
- **Sons** : `bid_placed.mp3` (bruit de marteau).
|
||||||
- **Graphiques** : Icône Marteau.
|
- **Graphiques** : Icône Marteau.
|
||||||
- **Images** : Portrait Animal HD.
|
- **Images** : Portrait Animal HD.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `bid_counter_up.webm` (0.8s loop, optionnel).
|
||||||
- **Animations** : Compteur prix qui monte.
|
- **Animations** : Compteur prix qui monte.
|
||||||
- **Couleurs** : Bouton Vert.
|
- **Couleurs** : Bouton Vert.
|
||||||
- **Textes** : "Enchérir".
|
- **Textes** : "Enchérir".
|
||||||
- **Formes** : N/A
|
- **Formes** : Boutons rapides (+10/+50/+100), champ numérique.
|
||||||
|
|
||||||
### Sablier de Validation (Attente)
|
### Sablier de Validation (Attente)
|
||||||
**Description UX** : L'enchère est remportée, le transfert est en cours (10 min).
|
**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.
|
**Notification Push** : "Enchère remportée ! Animal livré." à la fin du timer.
|
||||||
**Emplacement** : Carte Monde & HUD.
|
**Emplacement** : Carte Monde & HUD.
|
||||||
**Intégration** : Statut "En cours".
|
**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`.
|
**Événements** : `TIMER_START`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_timer_soft.mp3` (optionnel, très discret).
|
||||||
- **Sons** : `tick_tock.mp3` (ambiance très discrète si focus).
|
- **Sons** : `tick_tock.mp3` (ambiance très discrète si focus).
|
||||||
- **Graphiques** : Sablier animé.
|
- **Graphiques** : Sablier animé.
|
||||||
- **Images** : N/A
|
- **Images** : `icon_hourglass.png`, `badge_pending.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `hourglass_flow.webm` (1s loop, optionnel).
|
||||||
- **Animations** : Sable qui coule.
|
- **Animations** : Sable qui coule.
|
||||||
- **Couleurs** : Orange.
|
- **Couleurs** : Orange.
|
||||||
- **Textes** : "Validation : MM:SS".
|
- **Textes** : "Validation : MM:SS".
|
||||||
- **Formes** : N/A
|
- **Formes** : Badge rond (HUD), icône sur slot.
|
||||||
|
|
||||||
### Activité "Clic" (Gameplay)
|
### 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.
|
**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`.
|
**Événements** : `CLICK_HOURGLASS`.
|
||||||
|
|
||||||
#### Assets
|
#### 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.
|
- **Sons** : `sand_shake.mp3`. **Design ASMR** : Bruit de sable qui crisse ou petit choc mat.
|
||||||
- **Graphiques** : Particules de sable.
|
- **Graphiques** : Particules de sable.
|
||||||
- **Images** : N/A
|
- **Images** : `sand_particle.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `hourglass_shake.webm` (0.5s non loop, optionnel).
|
||||||
- **Animations** : Secousse.
|
- **Animations** : Secousse.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Doré.
|
||||||
- **Textes** : "+1 XP".
|
- **Textes** : "+1 XP".
|
||||||
- **Formes** : N/A
|
- **Formes** : Bouton rond (tap cible), badge sablier (HUD).
|
||||||
|
|||||||
101
docs/specs/enclos.md
Normal file
101
docs/specs/enclos.md
Normal 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 qu’un `animal_type` nominal. Si une case est convertie, elle déclenche un split/merge.
|
||||||
|
* **Capacité** : `capacity = floor(area * capacity_per_tile)` où `capacity_per_tile` dépend de l’espè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 l’enclos 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 l’enclos mais influence la pose de l’affiche (priorité visibilité).
|
||||||
|
* **Occlusion** : si un segment de clôture masque l’animal (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 d’ajouter un animal d’une autre espèce dans un enclos fusionné → refus + message.
|
||||||
@@ -23,10 +23,10 @@ Liste d'enums ou flags dans l'objet `Animal` ou `Case`.
|
|||||||
`visual_states: ["frozen", "hungry"]`
|
`visual_states: ["frozen", "hungry"]`
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**État par défaut** : Neutre.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Compteur États** : 0 actifs.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -36,7 +36,7 @@ Déclenchés par les seuils de stats (Santé, Faim, T°).
|
|||||||
Retour à la normale des stats.
|
Retour à la normale des stats.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Sensibilité** : Les enfants héritent de la résistance aux états (Froid/Chaud) des parents.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
@@ -46,10 +46,10 @@ Déclencheurs Froid/Chaud.
|
|||||||
Déclencheurs Mauvais Biome.
|
Déclencheurs Mauvais Biome.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Hiver** : Augmente la fréquence de l'état "Froid".
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Nuit** : Augmente la fréquence de l'état "Sommeil".
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
@@ -65,25 +65,41 @@ Déclencheur Faim.
|
|||||||
Les états négatifs (Sale, Malade) repoussent les visiteurs.
|
Les états négatifs (Sale, Malade) repoussent les visiteurs.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Malus** : Un animal avec un état négatif vaut -20% à la vente.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
| Contexte | État | Effet vitesse | Condition | Notes |
|
||||||
|
|---|---|---:|---|---|
|
||||||
|
| Visiteurs | “Confort OK” | x1.0 | Température 5–30°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)
|
### 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
|
### Trajet Visiteurs
|
||||||
N/A
|
**Fuite** : Les visiteurs évitent les animaux avec l'état "Malade".
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
N/A
|
| Event | Déclencheur | Effet | Durée |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `STATE_APPLIED` | Ajout d’un 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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
| Niveau | Effet |
|
||||||
|
| :--- | :--- |
|
||||||
|
| 1 | Détection simple |
|
||||||
|
| 2 | Détection avancée (Prévision) |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
@@ -95,26 +111,37 @@ elif animal.temp > animal.idealTemp + 10:
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `STATE_CRITICAL` | Alerte | "État critique détecté !" |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Lecture Immédiate (Passif)
|
### Lecture Immédiate (Passif)
|
||||||
**Description UX** : Le joueur comprend la situation d'un coup d'œil sans ouvrir de menu.
|
**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.
|
**Description UI** : Pas d'UI. Tout passe par le rendu graphique des entités.
|
||||||
**Emplacement** : Grille Zoo.
|
**Emplacement** : Grille Zoo.
|
||||||
**Intégration** : Moteur de rendu.
|
**Intégration** : Moteur de rendu.
|
||||||
**Navigation** : N/A
|
**Navigation** : Automatique.
|
||||||
**Événements** : `STATE_CHANGE`.
|
**Événements** : `STATE_CHANGE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Nappe sonore (battement cœur).
|
||||||
- **Sons** : N/A
|
- **Sons** : `heartbeat.mp3`.
|
||||||
- **Graphiques** : Shaders (Color Overlay), Systèmes de particules.
|
- **Graphiques** : Shaders (Color Overlay), Systèmes de particules.
|
||||||
- **Images** : N/A
|
- **Images** : Icône État.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Shader overlay.
|
||||||
- **Animations** : Animations spécifiques (Trembler, Boiter).
|
- **Animations** : Animations spécifiques (Trembler, Boiter).
|
||||||
- **Couleurs** : Code universel (Bleu=Froid, Rouge=Chaud, Vert=OK, Jaune=Malade).
|
- **Couleurs** : Code universel (Bleu=Froid, Rouge=Chaud, Vert=OK, Jaune=Malade).
|
||||||
- **Textes** : N/A
|
- **Textes** : Nom de l'état.
|
||||||
- **Formes** : N/A
|
- **Formes** : Icône flottante.
|
||||||
|
|||||||
@@ -48,22 +48,31 @@ function applyImpact(target, impactType, value):
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Feedback Visuel d'Impact (Passif)
|
### Feedback Visuel d'Impact (Passif)
|
||||||
**Description UX** : Le joueur voit les conséquences de ses actions.
|
**Description UX** : Le joueur voit les conséquences de ses actions.
|
||||||
**Description UI** : Popups flottants ("Floating Text") au-dessus des entités concernées.
|
**Description UI** : Popups flottants ("Floating Text") au-dessus des entités concernées.
|
||||||
**Emplacement** : World Space.
|
**Emplacement** : World Space.
|
||||||
**Intégration** : Temporaire (Fade out).
|
**Intégration** : Temporaire (Fade out).
|
||||||
**Navigation** : N/A
|
**Navigation** : Automatique.
|
||||||
**Événements** : `IMPACT_APPLIED`.
|
**Événements** : `IMPACT_APPLIED`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Jingle court.
|
||||||
- **Sons** : `positive.mp3` (montant), `negative.mp3` (descendant).
|
- **Sons** : `positive.mp3` (montant), `negative.mp3` (descendant).
|
||||||
- **Graphiques** : Flèches Vertes (Haut) / Rouges (Bas).
|
- **Graphiques** : Flèches Vertes (Haut) / Rouges (Bas).
|
||||||
- **Images** : N/A
|
- **Images** : Icône Flèche.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Particules.
|
||||||
- **Animations** : Texte qui monte et disparaît.
|
- **Animations** : Texte qui monte et disparaît.
|
||||||
- **Couleurs** : Vert, Rouge.
|
- **Couleurs** : Vert, Rouge.
|
||||||
- **Textes** : "+10 Attractivité", "-5 Santé".
|
- **Textes** : "+10 Attractivité", "-5 Santé".
|
||||||
- **Formes** : N/A
|
- **Formes** : Texte flottant.
|
||||||
|
|||||||
@@ -25,82 +25,114 @@ Table statique `animal_types`.
|
|||||||
"rarity": "int",
|
"rarity": "int",
|
||||||
"ideal_biome": "int",
|
"ideal_biome": "int",
|
||||||
"ideal_temp": "float",
|
"ideal_temp": "float",
|
||||||
"base_value": "int"
|
"base_value": "int",
|
||||||
|
"iso_x": "integer",
|
||||||
|
"iso_y": "integer",
|
||||||
|
"z_index": "integer"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Compteur** : 0 animaux découverts.
|
||||||
|
**Filtre Défaut** : "Tous".
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Score Collectionneur** : 0% (Progression globale).
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
**Découverte** : Premier achat, naissance ou observation d'un animal.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### 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é
|
### 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Indicateur** : L'inventaire affiche l'icône "Froid/Chaud" à côté des animaux qui souffrent actuellement.
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Tri** : Possibilité de trier par Biome d'origine.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Saisonnalité** : Met en avant les animaux "Tendance" de la saison actuelle.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Activité** : Affiche "Dort" si l'animal est nocturne et qu'il fait jour.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Statut** : Affiche "Fertile" ou "Gestante" sur les fiches.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Cimetière** : Les animaux morts apparaissent grisés avec la date de décès.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Alerte** : Badge rouge sur l'icône si Faim > 80%.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Set Complet** : Avoir tous les animaux d'un Biome donne un bonus global +5% Attractivité.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Estimation** : Affiche la valeur totale théorique du cheptel.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Recherche Rapide** : Barre de recherche instantanée.
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Coût Total** : Affiche le coût journalier total en nourriture.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Popularité** : Trie les animaux par nombre de vues visiteurs.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### É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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `COLLECTION_LEVEL_UP` | Succès | "Nouveau rang de collectionneur atteint !" |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Bestiaire / Encyclopédie (Consultation)
|
### Bestiaire / Encyclopédie (Consultation)
|
||||||
**Description UX** : Le joueur consulte les animaux découverts/possédés.
|
**Description UX** : Le joueur consulte les animaux découverts/possédés.
|
||||||
@@ -111,12 +143,12 @@ N/A
|
|||||||
**Événements** : `OPEN_BESTIARY`.
|
**Événements** : `OPEN_BESTIARY`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Thème "Bibliothèque" (calme).
|
||||||
- **Sons** : `page_turn.mp3`.
|
- **Sons** : `page_turn.mp3`.
|
||||||
- **Graphiques** : Fond Livre ancien.
|
- **Graphiques** : Fond Livre ancien.
|
||||||
- **Images** : 75 Icônes Animaux.
|
- **Images** : 75 Icônes Animaux.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Aperçu de l'animal en mouvement (survol).
|
||||||
- **Animations** : N/A
|
- **Animations** : Tourne la page.
|
||||||
- **Couleurs** : Sépia/Papier.
|
- **Couleurs** : Sépia/Papier.
|
||||||
- **Textes** : Lore/Description.
|
- **Textes** : Lore/Description.
|
||||||
- **Formes** : N/A
|
- **Formes** : Marque-page.
|
||||||
|
|||||||
@@ -12,93 +12,111 @@ Pour chaque animal adulte, il existe une version "Bébé".
|
|||||||
Même table que `animal_types` avec flag `is_baby`.
|
Même table que `animal_types` avec flag `is_baby`.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Compteur Bébés** : 0.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Score Maternité** : 0.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
Naissance ou Achat Œuf.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
Croissance (Devient Adulte) ou Mort.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Lien** : Lien cliquable vers les parents depuis la fiche bébé.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Alerte Froid** : Icône "Flocon" clignotante si bébé en danger.
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Filtre** : "Bébés en danger" (Mauvais biome).
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Printemps** : Mise en avant des naissances saisonnières.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Sommeil** : Indique "Dort" (les bébés dorment plus).
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Futur** : Indique le potentiel génétique (Étoiles grisées).
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Historique** : "Mort-né" ou "Mort en bas âge" (Triste mais informatif).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Biberon** : Icône Biberon si faim.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### 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
|
### Impact Valeur
|
||||||
N/A
|
**Potentiel** : Affiche la valeur estimée à l'âge adulte.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Croissance** : Barre de progression temps réel.
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Coût Soins** : Estimation des frais vétérinaires à venir.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Vedette** : Indique si le bébé est le plus regardé du zoo.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
N/A
|
* **Éclosion** : Animation dans l'inventaire.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
*Note : Niveaux de la Nurserie (voir `nurserie.md`).*
|
||||||
|
| Niveau | Nom | Bonus |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| 1 | Mignonnerie | +10% Attractivité |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
N/A
|
```javascript
|
||||||
|
function getBabyBonus(baby):
|
||||||
|
if baby.isCute(): return 1.5 // Multiplicateur attractivité
|
||||||
|
return 1.0
|
||||||
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `BABY_BORN` | Info | "Un nouveau bébé est né !" |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Visualisation Bébé (Passif)
|
### Visualisation Bébé (Passif)
|
||||||
**Description UX** : Différencier les bébés des adultes.
|
**Description UX** : Différencier les bébés des adultes.
|
||||||
**Description UI** : Sprite plus petit (50% taille), tête plus grosse, yeux plus grands.
|
**Description UI** : Sprite plus petit (50% taille), tête plus grosse, yeux plus grands.
|
||||||
**Emplacement** : Grille / Nurserie.
|
**Emplacement** : Grille / Nurserie.
|
||||||
**Intégration** : Sprite.
|
**Intégration** : Sprite.
|
||||||
**Navigation** : N/A
|
**Navigation** : Clic Bébé.
|
||||||
**Événements** : N/A
|
**Événements** : `CLICK_BABY`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Berceuse.
|
||||||
- **Sons** : Cris plus aigus.
|
- **Sons** : Cris plus aigus.
|
||||||
- **Graphiques** : Sprites Chibi.
|
- **Graphiques** : Sprites Chibi.
|
||||||
- **Images** : N/A
|
- **Images** : Icône Tétine.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Vidéo "Premiers pas" (décoratif).
|
||||||
- **Animations** : Démarche maladroite.
|
- **Animations** : Démarche maladroite.
|
||||||
- **Couleurs** : Identiques Adulte.
|
- **Couleurs** : Identiques Adulte.
|
||||||
- **Textes** : N/A
|
- **Textes** : "Bébé".
|
||||||
- **Formes** : N/A
|
- **Formes** : Rond.
|
||||||
|
|||||||
@@ -13,59 +13,59 @@
|
|||||||
Table statique.
|
Table statique.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Heure Départ** : 08:00 (Ouverture).
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Jours passés** : 0.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Cycle perpétuel.
|
Cycle perpétuel.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Jamais** : Le temps ne s'arrête pas (sauf pause).
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Temps de Jeu** : Cumulé sur le profil joueur.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
Voir `temperature.md`.
|
Voir `temperature.md`.
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Lumière** : Les biomes réagissent à la lumière (Bioluminescence).
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Durée Jour** : Variable selon saison.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Cycle** : C'est la définition même.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Nuit** : Bonus fertilité.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Nuit** : Risque froid.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Repas** : Heures fixes (Matin/Soir) pour les animaux.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Horaires** : Zoo fermé la nuit = 0 Visiteurs.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Recette du Jour** : Calculée à la fermeture (20h).
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Temps** : Accélérateur de temps (x1, x2, x3).
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Salaire** : Payé à la journée.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Sortie** : À 19h, tous les visiteurs se dirigent vers la sortie.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -73,33 +73,52 @@ N/A
|
|||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
**Horaires Étendus** (Recherche) :
|
||||||
|
| Niveau | Effet |
|
||||||
|
| :--- | :--- |
|
||||||
|
| 1 | Fermeture 21h |
|
||||||
|
| 2 | Fermeture 22h |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `DAY_START` | Info | "Bonjour ! Le zoo ouvre." |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Cycle Jour/Nuit (Passif)
|
### Cycle Jour/Nuit (Passif)
|
||||||
**Description UX** : La luminosité change progressivement.
|
**Description UX** : La luminosité change progressivement.
|
||||||
**Description UI** : Filtre global de couleur (Bleu nuit -> Orange aube -> Blanc jour -> Orange crépuscule).
|
**Description UI** : Filtre global de couleur (Bleu nuit -> Orange aube -> Blanc jour -> Orange crépuscule).
|
||||||
**Emplacement** : Écran entier.
|
**Emplacement** : Écran entier.
|
||||||
**Intégration** : Layer FX.
|
**Intégration** : Layer FX.
|
||||||
**Navigation** : N/A
|
**Navigation** : Boutons Vitesse (x1, x2, Pause).
|
||||||
**Événements** : `TIME_CHANGE`.
|
**Événements** : `TIME_CHANGE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : Thème Jour / Thème Nuit (plus calme).
|
- **Musiques** : Thème Jour / Thème Nuit (plus calme).
|
||||||
- **Sons** : Coq (Matin), Hibou (Nuit).
|
- **Sons** : Coq (Matin), Hibou (Nuit).
|
||||||
- **Graphiques** : Ombres qui tournent (si 3D ou simulé).
|
- **Graphiques** : Ombres qui tournent (si 3D ou simulé).
|
||||||
- **Images** : N/A
|
- **Images** : Soleil / Lune (HUD).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Timelapse ciel (Skybox).
|
||||||
- **Animations** : Transition couleur.
|
- **Animations** : Transition couleur.
|
||||||
- **Couleurs** : Palette Cycle.
|
- **Couleurs** : Palette Cycle.
|
||||||
- **Textes** : Horloge "14:00".
|
- **Textes** : Horloge "14:00".
|
||||||
- **Formes** : N/A
|
- **Formes** : Cadran.
|
||||||
|
|||||||
@@ -15,10 +15,10 @@
|
|||||||
Table statique.
|
Table statique.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Météo Actuelle** : Ensoleillé (Défaut).
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Durée Météo** : 4h restantes.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -28,36 +28,50 @@ Probabilités selon Saison.
|
|||||||
Changement toutes les X heures ou jours.
|
Changement toutes les X heures ou jours.
|
||||||
|
|
||||||
### Hérédité
|
### 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Réaction** : La pluie remplit les mares (visuel). La neige couvre le sol.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Probabilités** : Neige impossible en Été.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Visibilité** : Orage la nuit = Éclairs très visibles.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Calme** : La pluie favorise l'intimité (Repro +5%).
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Froid** : Neige + Nuit = Danger mortel.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Pousse** : Pluie = Herbe pousse plus vite.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### 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
|
### Impact Valeur
|
||||||
N/A
|
**Ventes** : Parapluies vs Glaces.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
@@ -67,7 +81,7 @@ N/A
|
|||||||
**Pluie** : Augmente vente parapluies/abris.
|
**Pluie** : Augmente vente parapluies/abris.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Abri** : Les visiteurs courent se mettre à l'abri s'il pleut.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -75,11 +89,20 @@ N/A
|
|||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
**Machine Météo** (Endgame) :
|
||||||
|
| Niveau | Effet |
|
||||||
|
| :--- | :--- |
|
||||||
|
| 1 | Déclenche Pluie |
|
||||||
|
| 2 | Déclenche Soleil |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
N/A
|
```javascript
|
||||||
|
function updateWeather(world):
|
||||||
|
if random() < changeChance:
|
||||||
|
world.weather = pickNewWeather(world.season)
|
||||||
|
applyWeatherEffects(world)
|
||||||
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
@@ -88,22 +111,31 @@ N/A
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Ambiance Météo (Passif)
|
### Ambiance Météo (Passif)
|
||||||
**Description UX** : Le joueur ressent la météo actuelle.
|
**Description UX** : Le joueur ressent la météo actuelle.
|
||||||
**Description UI** : Overlay plein écran (Pluie, Neige, Rayons soleil). Nuages qui passent (ombres).
|
**Description UI** : Overlay plein écran (Pluie, Neige, Rayons soleil). Nuages qui passent (ombres).
|
||||||
**Emplacement** : Écran entier.
|
**Emplacement** : Écran entier.
|
||||||
**Intégration** : Layer FX.
|
**Intégration** : Layer FX.
|
||||||
**Navigation** : N/A
|
**Navigation** : Auto.
|
||||||
**Événements** : `WEATHER_FX`.
|
**Événements** : `WEATHER_FX`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Bruit de pluie relaxant.
|
||||||
- **Sons** : Pluie, Vent, Tonnerre.
|
- **Sons** : Pluie, Vent, Tonnerre.
|
||||||
- **Graphiques** : Particules Pluie/Neige.
|
- **Graphiques** : Particules Pluie/Neige.
|
||||||
- **Images** : N/A
|
- **Images** : Icône Météo HUD.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Éclairs (Flash).
|
||||||
- **Animations** : Chute particules.
|
- **Animations** : Chute particules.
|
||||||
- **Couleurs** : Teinte Bleue (Nuit/Pluie), Jaune (Soleil).
|
- **Couleurs** : Teinte Bleue (Nuit/Pluie), Jaune (Soleil).
|
||||||
- **Textes** : N/A
|
- **Textes** : "Il pleut".
|
||||||
- **Formes** : N/A
|
- **Formes** : Gouttes.
|
||||||
|
|||||||
@@ -24,77 +24,107 @@
|
|||||||
Table statique (Reference Data).
|
Table statique (Reference Data).
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### 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
|
### Scores Initiaux
|
||||||
N/A
|
**Surface** : 0 cases.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
Génération carte ou Terraformation.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
Terraformation (Remplacement).
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Mémoire** : Le sol garde des traces de l'ancien biome (fertilité).
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
Chaque milieu a une T° par défaut.
|
**Base** : Chaque milieu a une T° de base.
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Voisinage** : Bonus si adjacent à un biome compatible.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Visuel** : Changement de texture selon saison.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Visuel** : Assombrissement.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Compatibilité** : Requise pour reproduction optimale.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Incompatibilité** : Stress mortel si mauvais biome.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Production** : Certains biomes produisent de la nourriture (Herbe).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Diversité** : Bonus si zoo varié.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Coût** : Prix de terraformation variable.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Terrain** : Vitesse déplacement variable.
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Entretien** : Coût variable (Eau pour Désert).
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Obstacle** : Eau/Montagne infranchissable.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
N/A
|
* **Modification** : Changement de biome.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
Voir `achat_upgrade_case.md`.
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
N/A
|
```javascript
|
||||||
|
function getBiomeEffect(biome):
|
||||||
|
return biomeEffects[biome.id]
|
||||||
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `BIOME_SELECTED` | Info | "Biome sélectionné." |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Palette Biome (Consultation)
|
### Palette Biome (Consultation)
|
||||||
**Description UX** : Le joueur consulte la liste des biomes disponibles pour terraformer.
|
**Description UX** : Le joueur consulte la liste des biomes disponibles pour terraformer.
|
||||||
@@ -105,12 +135,12 @@ N/A
|
|||||||
**Événements** : `SELECT_BIOME`.
|
**Événements** : `SELECT_BIOME`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Sons d'ambiance nature (boucle).
|
||||||
- **Sons** : `select.mp3`.
|
- **Sons** : `select.mp3`.
|
||||||
- **Graphiques** : Carrés de texture.
|
- **Graphiques** : Carrés de texture.
|
||||||
- **Images** : N/A
|
- **Images** : Photos paysage (référence).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Survol drone du biome.
|
||||||
- **Animations** : N/A
|
- **Animations** : Texture animée (Eau, Herbe).
|
||||||
- **Couleurs** : Palette 15 couleurs.
|
- **Couleurs** : Palette 15 couleurs.
|
||||||
- **Textes** : Noms des milieux.
|
- **Textes** : Noms des milieux.
|
||||||
- **Formes** : Carrés.
|
- **Formes** : Carrés.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Liste des Incidents
|
## Liste des Incidents
|
||||||
1. **Soif** : "J'ai soif !" -> Nécessite un stand de boisson ou une boutique proche.
|
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.
|
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é.
|
4. **Frustration** : "On ne voit rien !" -> Animal trop loin ou caché.
|
||||||
5. **Envie** : "Je veux une peluche !" -> Nécessite une boutique de souvenirs.
|
5. **Envie** : "Je veux une peluche !" -> Nécessite une boutique de souvenirs.
|
||||||
@@ -15,10 +15,10 @@
|
|||||||
Table statique.
|
Table statique.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Compteur Incidents** : 0.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Satisfaction Moyenne** : 50%.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -28,46 +28,46 @@ Aléatoire sur Visiteur.
|
|||||||
Résolution ou Départ visiteur.
|
Résolution ou Départ visiteur.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Réputation** : Si beaucoup d'incidents non résolus, la réputation baisse durablement.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
**Canicule** : Augmente probabilité "Soif".
|
**Canicule** : Augmente probabilité "Soif".
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Boue** : Augmente probabilité "Saleté" sur biome Terre/Marais.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Pluie** : Augmente "Inconfort" (si pas de parapluie).
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Nuit** : Augmente "Peur" (si pas de lumière).
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Calme** : Les visiteurs bruyants (incidents) dérangent la reproduction (-5%).
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Choc** : Voir un animal mort crée un incident "Traumatisme".
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Faim** : Incident "J'ai faim".
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Plaintes** : Trop d'incidents = Baisse Attractivité.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Remboursement** : Un visiteur très mécontent peut demander le remboursement.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Opportunité** : Résoudre un incident (ex: Soif) génère souvent une vente.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Détour** : Le visiteur cherche le bâtiment adéquat pour résoudre son problème.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -76,17 +76,36 @@ N/A
|
|||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
**Formation Staff** :
|
||||||
|
| Niveau | Effet |
|
||||||
|
| :--- | :--- |
|
||||||
|
| 1 | Résolution auto lente |
|
||||||
|
| 2 | Résolution auto rapide |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
N/A
|
```javascript
|
||||||
|
function checkVisitorNeeds(visitor):
|
||||||
|
if visitor.thirst > 80:
|
||||||
|
createIncident(visitor, "THIRST")
|
||||||
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `INCIDENT_ALERT` | Warning | "Un visiteur se plaint !" |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Bulles d'Incidents (Action)
|
### Bulles d'Incidents (Action)
|
||||||
**Description UX** : Voir `visiteur.md`.
|
**Description UX** : Voir `visiteur.md`.
|
||||||
@@ -97,12 +116,12 @@ N/A
|
|||||||
**Événements** : `INCIDENT_ICON`.
|
**Événements** : `INCIDENT_ICON`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Brouhaha de foule.
|
||||||
- **Sons** : Variés selon incident (Bruit eau, Bâillement).
|
- **Sons** : Variés selon incident (Bruit eau, Bâillement).
|
||||||
- **Graphiques** : Set d'icônes vectorielles.
|
- **Graphiques** : Set d'icônes vectorielles.
|
||||||
- **Images** : N/A
|
- **Images** : Emotes.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Animation de la bulle (pop).
|
||||||
- **Animations** : Pop.
|
- **Animations** : Pop.
|
||||||
- **Couleurs** : Noir sur Blanc.
|
- **Couleurs** : Noir sur Blanc.
|
||||||
- **Textes** : N/A
|
- **Textes** : "J'ai soif !".
|
||||||
- **Formes** : Bulle.
|
- **Formes** : Bulle.
|
||||||
|
|||||||
@@ -17,15 +17,18 @@
|
|||||||
"objective_type": "string",
|
"objective_type": "string",
|
||||||
"target_value": "int",
|
"target_value": "int",
|
||||||
"reward_coins": "int",
|
"reward_coins": "int",
|
||||||
"is_completed": "boolean"
|
"is_completed": "boolean",
|
||||||
|
"iso_x": "integer",
|
||||||
|
"iso_y": "integer",
|
||||||
|
"z_index": "integer"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Quêtes actives** : 3.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Points de Quête** : 0.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -35,46 +38,46 @@ Reset quotidien (Minuit serveur).
|
|||||||
Complétion ou Reset.
|
Complétion ou Reset.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Série** : Bonus de connexion quotidienne (Streak).
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Quête Météo** : "Vendre 10 glaces pendant une canicule".
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Quête Biome** : "Avoir 50% de cases Océan".
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Quête Saisonnière** : "Planter 10 arbres en Automne".
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Quête Nocturne** : "Observer un animal nocturne".
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Quête Naissance** : "Faire naître un animal Rare".
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Quête Deuil** : "Honorer un animal disparu" (Planter un arbre).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Quête Stock** : "Avoir 1000 unités de nourriture".
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Quête Popularité** : "Atteindre 100 Attractivité".
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Quête Richesse** : "Avoir 10.000 pièces en banque".
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Quête Livraison** : "Livrer 5 animaux en moins de 10 minutes".
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Quête Investissement** : "Dépenser 5000 pièces".
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Quête Flux** : "Optimiser le chemin vers les Lions".
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -82,11 +85,22 @@ N/A
|
|||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### Messages d'Infos / Alerte
|
||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
@@ -95,6 +109,15 @@ N/A
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Suivi Quêtes (Permanent)
|
### Suivi Quêtes (Permanent)
|
||||||
**Description UX** : Le joueur voit ses objectifs en cours.
|
**Description UX** : Le joueur voit ses objectifs en cours.
|
||||||
@@ -105,11 +128,11 @@ N/A
|
|||||||
**Événements** : `QUEST_UPDATE`.
|
**Événements** : `QUEST_UPDATE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Jingle victoire.
|
||||||
- **Sons** : `quest_complete.mp3`.
|
- **Sons** : `quest_complete.mp3`.
|
||||||
- **Graphiques** : Icône Parchemin.
|
- **Graphiques** : Icône Parchemin.
|
||||||
- **Images** : N/A
|
- **Images** : Coffre au trésor (Récompense).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Ouverture du coffre.
|
||||||
- **Animations** : Flash vert à la complétion.
|
- **Animations** : Flash vert à la complétion.
|
||||||
- **Couleurs** : Blanc (En cours), Vert (Fini).
|
- **Couleurs** : Blanc (En cours), Vert (Fini).
|
||||||
- **Textes** : Titre Quête, Progression.
|
- **Textes** : Titre Quête, Progression.
|
||||||
|
|||||||
@@ -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.
|
Table statique.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Saison Départ** : Printemps.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Jours écoulés** : 0.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -65,46 +65,64 @@ Cycle annuel fixe.
|
|||||||
Fin de durée saison.
|
Fin de durée saison.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Calendrier** : Le jour de l'année est conservé entre les sessions.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Adaptation** : Les biomes réagissent visuellement (Neige sur Montagne en Hiver).
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Cycle** : Définit la saison suivante.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Durée Jour** : Plus long en Été, plus court en Hiver.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### 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
|
### 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
|
### Impact Nourriture
|
||||||
N/A
|
**Disponibilité** : Fruits abondants en Été (Prix bas), rares en Hiver (Prix haut).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### 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
|
### Impact Valeur
|
||||||
N/A
|
**Offre/Demande** : Prix des glaces x2 en Été.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Météo** : Risque de tempête en Automne (Ralentissement).
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Chauffage** : Coût en Hiver. **Clim** : Coût en Été.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Préférence** : Les visiteurs restent en intérieur (Boutiques) s'il pleut/neige.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -112,35 +130,55 @@ N/A
|
|||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### Messages d'Infos / Alerte
|
||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
| :--- | :--- | :--- |
|
| 3 | Prévision à 7 jours |
|
||||||
| `SEASON_CHANGE` | Info | "C'est le [Saison] !" |
|
| `SEASON_CHANGE` | Info | "C'est le [Saison] !" |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Ambiance Saisonnière (Passif)
|
### Ambiance Saisonnière (Passif)
|
||||||
**Description UX** : Le décor change selon la saison.
|
**Description UX** : Le décor change selon la saison.
|
||||||
**Description UI** : Tilesets modifiés (Herbe verte -> Herbe jaune -> Feuilles mortes -> Neige).
|
**Description UI** : Tilesets modifiés (Herbe verte -> Herbe jaune -> Feuilles mortes -> Neige).
|
||||||
**Emplacement** : Grille Zoo.
|
**Emplacement** : Grille Zoo.
|
||||||
**Intégration** : Assets graphiques.
|
**Intégration** : Assets graphiques.
|
||||||
**Navigation** : N/A
|
**Navigation** : Auto.
|
||||||
**Événements** : `SEASON_VISUAL_UPDATE`.
|
**Événements** : `SEASON_VISUAL_UPDATE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : Thèmes saisonniers (Vivaldi remix ?).
|
- **Musiques** : Thèmes saisonniers (Vivaldi remix)..
|
||||||
- **Sons** : Vent hivernal, Oiseaux printemps.
|
- **Sons** : Vent hivernal, Oiseaux printemps.
|
||||||
- **Graphiques** : 4 variantes de chaque Tile.
|
- **Graphiques** : 4 variantes de chaque Tile.
|
||||||
- **Images** : Icône Saison HUD.
|
- **Images** : Icône Saison HUD.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Pluie/Neige (Overlay).
|
||||||
- **Animations** : Feuilles qui tombent (Automne).
|
- **Animations** : Feuilles qui tombent (Automne).
|
||||||
- **Couleurs** : Vert, Jaune, Orange, Blanc.
|
- **Couleurs** : Vert, Jaune, Orange, Blanc.
|
||||||
- **Textes** : "Printemps", "Été", etc.
|
- **Textes** : "Printemps", "Été", etc.
|
||||||
- **Formes** : N/A
|
- **Formes** : Icône Soleil/Flocon.
|
||||||
|
|||||||
61
docs/specs/inventaire_skins.md
Normal file
61
docs/specs/inventaire_skins.md
Normal 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.
|
||||||
@@ -16,93 +16,112 @@
|
|||||||
Table statique.
|
Table statique.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**T° Moyenne** : 20°C.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Record Chaud** : 20°C.
|
||||||
|
**Record Froid** : 20°C.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
Constante physique.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Jamais** : La température est toujours présente.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Climat** : Le climat de départ définit la plage de température moyenne.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Auto-référence** : Définit les états (Gel, Vapeur).
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Inertie** : L'eau change de T° moins vite.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Variation** : +10°C en Été, -10°C en Hiver.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Cycle** : +5°C le jour, -5°C la nuit.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Confort** : T° idéale requise.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Extrêmes** : T° mortelle si hors tolérance.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Conservation** : La nourriture pourrit vite si T° > 30°C.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Confort** : Visiteurs aiment 20-25°C.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Coût** : Maintenir une T° artificielle coûte cher.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Gel** : Verglas ralentit les camions.
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Énergie** : Facture chauffage/clim.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Ombre** : Recherche d'ombre si chaud.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
N/A
|
* **Vague de Froid/Chaud** : Event temporaire.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
**Chauffage Central** :
|
||||||
|
| Niveau | Effet |
|
||||||
|
| :--- | :--- |
|
||||||
|
| 1 | Rayon 5 cases |
|
||||||
|
| 2 | Rayon 10 cases |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
N/A
|
```javascript
|
||||||
|
function getTemp(case):
|
||||||
|
return baseTemp + seasonMod + dayMod + heaterMod
|
||||||
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| 7 | Rayon Global (Tout le Zoo) |
|
||||||
|
| `TEMP_CRITICAL` | Alerte | "Température critique !" |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Thermomètre (Consultation)
|
### Thermomètre (Consultation)
|
||||||
**Description UX** : Le joueur voit la température actuelle.
|
**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).
|
**Description UI** : Jauge verticale (Thermomètre) avec mercure rouge. Graduations colorées (Bleu bas, Rouge haut).
|
||||||
**Emplacement** : HUD ou Info Case.
|
**Emplacement** : HUD ou Info Case.
|
||||||
**Intégration** : Widget.
|
**Intégration** : Widget.
|
||||||
**Navigation** : N/A
|
**Navigation** : Clic -> Détail.
|
||||||
**Événements** : `UPDATE_TEMP`.
|
**Événements** : `UPDATE_TEMP`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Bruit de vent glacé / Cigales.
|
||||||
- **Sons** : N/A
|
- **Sons** : `shiver.mp3`.
|
||||||
- **Graphiques** : Sprite Thermomètre.
|
- **Graphiques** : Sprite Thermomètre.
|
||||||
- **Images** : N/A
|
- **Images** : Icône Soleil/Flocon.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de chaleur (ondulation).
|
||||||
- **Animations** : Niveau qui monte/descend.
|
- **Animations** : Niveau qui monte/descend.
|
||||||
- **Couleurs** : Dégradé Bleu/Rouge.
|
- **Couleurs** : Dégradé Bleu/Rouge.
|
||||||
- **Textes** : "20°C".
|
- **Textes** : "20°C".
|
||||||
- **Formes** : N/A
|
- **Formes** : Jauge.
|
||||||
|
|||||||
@@ -34,7 +34,10 @@ L'utilisateur humain.
|
|||||||
"settings": {
|
"settings": {
|
||||||
"music_enabled": "boolean",
|
"music_enabled": "boolean",
|
||||||
"bot_profile_id": "integer"
|
"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) |
|
| Animaux | 3 couples (6 animaux) |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Niveau Joueur** : 1.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -56,46 +59,57 @@ Inscription.
|
|||||||
Suppression compte.
|
Suppression compte.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Héritage** : Le joueur garde son niveau et ses recherches après un reset.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Confort** : Le joueur doit gérer la température pour ses animaux.
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Stratégie** : Le joueur choisit les biomes à développer.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Planification** : Le joueur adapte sa stratégie aux saisons.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Gestion** : Le joueur gère les cycles d'ouverture.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### 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.
|
**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
|
### Impact Mort
|
||||||
N/A
|
**Gestion Crise** : Le joueur doit réagir aux décès.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Logistique** : Le joueur achète la nourriture.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Objectif** : Maximiser l'attractivité.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Finance** : Gérer le budget.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
| Poste | Coût | Unité | Condition | Impact |
|
||||||
|
|---|---:|---|---|---|
|
||||||
|
| Parking | 0–5 | pièces / visite | Selon politique du joueur | Ajuste satisfaction visiteurs et revenus. |
|
||||||
|
| Marketing | 0–5000 | pièces / action | Campagne publicitaire | Augmente affluence temporaire. |
|
||||||
|
| Skins / thèmes | 0–2000 | pièces / item | Achat cosmétique | Aucun impact gameplay (sauf attractivité visuelle si spécifié ailleurs). |
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Design** : Le joueur trace les routes.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -104,11 +118,18 @@ N/A
|
|||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
N/A
|
```javascript
|
||||||
|
function playerAction(action):
|
||||||
|
if checkResources(action.cost):
|
||||||
|
execute(action)
|
||||||
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
@@ -118,6 +139,15 @@ N/A
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### HUD Principal (Permanent)
|
### HUD Principal (Permanent)
|
||||||
**Description UX** : Le joueur voit en permanence ses ressources et accès rapides.
|
**Description UX** : Le joueur voit en permanence ses ressources et accès rapides.
|
||||||
@@ -128,11 +158,11 @@ N/A
|
|||||||
**Événements** : `UI_CLICK`.
|
**Événements** : `UI_CLICK`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_hud_ambience.mp3` (très léger, optionnel, volume 15%).
|
||||||
- **Sons** : `ui_click.mp3`.
|
- **Sons** : `ui_click.mp3`.
|
||||||
- **Graphiques** : Style UI "Bois et Pierre" ou "Moderne Clean".
|
- **Graphiques** : Style UI "Bois et Pierre" ou "Moderne Clean".
|
||||||
- **Images** : Icônes (Pièce, Fiole, Marteau, Carte).
|
- **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.
|
- **Animations** : Compteurs qui défilent quand gain/perte.
|
||||||
- **Couleurs** : Or, Bleu, Blanc.
|
- **Couleurs** : Or, Bleu, Blanc.
|
||||||
- **Textes** : Chiffres, Labels menus.
|
- **Textes** : Chiffres, Labels menus.
|
||||||
@@ -147,12 +177,12 @@ N/A
|
|||||||
**Événements** : `SAVE_PROFILE`.
|
**Événements** : `SAVE_PROFILE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_profile_open.mp3` (jingle court).
|
||||||
- **Sons** : `save_success.mp3`.
|
- **Sons** : `save_success.mp3`.
|
||||||
- **Graphiques** : Portraits de bots.
|
- **Graphiques** : Portraits de bots.
|
||||||
- **Images** : Avatars joueurs.
|
- **Images** : Avatars joueurs.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `profile_avatar_spin.webm` (aperçu rotation/pose, 2s, loop).
|
||||||
- **Animations** : N/A
|
- **Animations** : Checkmark vert.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Bleu UI.
|
||||||
- **Textes** : Description des bots ("Le Conservateur : Achète de la nourriture...").
|
- **Textes** : Description des bots ("Le Conservateur : Achète de la nourriture, évite les risques").
|
||||||
- **Formes** : Cartes de sélection.
|
- **Formes** : Cartes de sélection.
|
||||||
|
|||||||
@@ -1,118 +1,385 @@
|
|||||||
# Spécifications : Laboratoire (Site)
|
# Spécifications : Laboratoire (Site)
|
||||||
|
|
||||||
## Définition
|
## 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
|
## Fonctions
|
||||||
- **Offres Spéciales** : Propose périodiquement des œufs ou bébés animaux rares.
|
| Fonction | Description | Entrées | Sorties |
|
||||||
- **Prix Fixe** : Contrairement aux zoos, les ventes du laboratoire sont souvent à prix fixe, sans enchères (ou règles spécifiques).
|
|---|---|---|---|
|
||||||
- **Icône** : 🔬
|
| 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
|
## Icone de base
|
||||||
- **Achat** : Glisser l'offre du laboratoire vers le camion du joueur.
|
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
|
## Annexes Techniques
|
||||||
### Modèle de Données (JSON)
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "uuid",
|
|
||||||
"type": "lab",
|
|
||||||
"current_offer": { "animal_type": "string", "rarity": "int", "price": "int", "expires_at": "timestamp" }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### 1. Données et États
|
||||||
N/A
|
|
||||||
|
|
||||||
### Scores Initiaux
|
#### Caractéristiques Initiales
|
||||||
N/A
|
| 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
|
#### Scores Initiaux
|
||||||
### Conditions d'Apparition
|
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|
||||||
Génération carte.
|
|---|---|---|---|
|
||||||
|
| 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
|
### 2. Cycles de Vie et Apparition
|
||||||
N/A
|
|
||||||
|
|
||||||
### Hérédité
|
#### Conditions d'Apparition
|
||||||
N/A
|
| 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
|
#### Conditions de Disparition
|
||||||
### Impact Température
|
| Condition | Seuil | Opérateur | Résultat |
|
||||||
N/A
|
|---|---|---|---|
|
||||||
|
| É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)
|
#### Hérédité
|
||||||
N/A
|
| 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
|
### 3. Impacts Environnementaux
|
||||||
N/A
|
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
#### Impact Température
|
||||||
N/A
|
| 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 Milieu (Biome)
|
||||||
### Impact Reproduction
|
| Biome | Compatibilité | Bonus/Malus |
|
||||||
N/A
|
|---|---|---|
|
||||||
|
| Urbain | 100% | Aucun (Emplacement standard) |
|
||||||
|
| Toundra | 80% | Coût maintenance +10% (Chauffage) |
|
||||||
|
| Désert | 70% | Coût maintenance +20% (Climatisation) |
|
||||||
|
|
||||||
### Impact Mort
|
#### Impact Saisons
|
||||||
N/A
|
| 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
|
#### Impact Heure / Jour-Nuit
|
||||||
N/A
|
| 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)
|
### 4. Impacts Biologiques et Sociaux
|
||||||
N/A
|
|
||||||
|
|
||||||
### Impact Valeur
|
#### Impact Reproduction
|
||||||
N/A
|
| 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 l’option \"Synthèse\" est utilisée au lieu d’un cycle de reproduction |
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
#### Impact Mort
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
| Cause | Conséquence | Durée |
|
||||||
**Rotation Offres** : 1 offre toutes les 4h à 24h.
|
|---|---|---|
|
||||||
|
| Échec Synthèse | Perte des fragments ADN | Instantané |
|
||||||
|
| Accident Labo | Fermeture temporaire pour décontamination | 48h |
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
#### Impact Nourriture
|
||||||
N/A
|
| 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
|
#### Impact Attractivité Visiteurs
|
||||||
N/A
|
| 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
|
#### Impact Attractivité Animaux
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
| Espèce | Interaction | Effet Stress |
|
||||||
* **Nouvelle Offre Rare** : Notification globale ou locale.
|
|---|---|---|
|
||||||
|
| Toutes | Prélèvement ADN | +10 (Stress léger) |
|
||||||
|
| Clones | Retour à la vie sauvage | +50 (Stress fort, inadapté) |
|
||||||
|
|
||||||
## 7. Progression
|
#### Impact Valeur
|
||||||
### Tableau des Upgrades
|
| Facteur | Variation Prix | Condition |
|
||||||
N/A
|
|---|---|---|
|
||||||
|
| 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
|
### 5. Impacts Logistiques et Économiques
|
||||||
### Pseudo-code Impacts
|
|
||||||
N/A
|
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
#### Vitesse (Camion)
|
||||||
| ID | Niveau | Message |
|
| Type Route | Vitesse Max | Consommation |
|
||||||
| :--- | :--- | :--- |
|
|---|---|---|
|
||||||
| `LAB_OFFER` | Info | "Le laboratoire propose un spécimen rare !" |
|
| 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)
|
#### Vitesse (Accueil)
|
||||||
### Offre Rare (Passif)
|
| Flux | Visiteurs/Minute | Capacité Max |
|
||||||
**Description UX** : Le laboratoire a un stock spécial.
|
|---|---|---|
|
||||||
**Description UI** : Halo brillant autour du labo. Icône "!" ou "ADN".
|
| Entrée Labo (Visite) | 5 | 50 (Groupe restreint) |
|
||||||
**Emplacement** : Carte Monde.
|
|
||||||
**Intégration** : Effet visuel.
|
|
||||||
**Navigation** : N/A
|
|
||||||
**Événements** : `LAB_GLOW`.
|
|
||||||
|
|
||||||
#### Assets
|
#### Vitesse (Recherche)
|
||||||
- **Musiques** : N/A
|
| Projet | Durée (Jours) | Coût Accélération |
|
||||||
- **Sons** : `sci_fi_hum.mp3`.
|
|---|---|---|
|
||||||
- **Graphiques** : Halo bleu néon.
|
| Séquençage ADN | 2 jours | 1000$ |
|
||||||
- **Images** : N/A
|
| Résurrection Mammouth | 30 jours | 50,000$ |
|
||||||
- **Vidéos** : N/A
|
|
||||||
- **Animations** : Pulsation.
|
#### Vitesse (Labo)
|
||||||
- **Couleurs** : Bleu électrique / Violet.
|
| Analyse | Durée | Fiabilité |
|
||||||
- **Textes** : N/A
|
|---|---|---|
|
||||||
- **Formes** : N/A
|
| 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
65
docs/specs/menu_achats.md
Normal 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.
|
||||||
@@ -7,7 +7,7 @@ Le milieu représente l'environnement écologique d'une case, défini par sa cou
|
|||||||
- **Prairie** (Tiers Gauche)
|
- **Prairie** (Tiers Gauche)
|
||||||
- **Océan** (Tiers Milieu)
|
- **Océan** (Tiers Milieu)
|
||||||
- **Montagne** (Tiers Droite)
|
- **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
|
## 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.
|
- **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",
|
"name": "string",
|
||||||
"color_hex": "string (#RRGGBB)",
|
"color_hex": "string (#RRGGBB)",
|
||||||
"default_temperature": "float",
|
"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 |
|
| 9 | Montagne Basse | #A9A9A9 | 5°C |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Dominance Biome** : % de la surface du zoo (ex: 30% Prairie).
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Génération carte (fixe).
|
Génération carte (fixe).
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Terraformation** : Remplacement par un autre biome via upgrade.
|
||||||
|
|
||||||
### Hérédité
|
### 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
@@ -63,37 +66,37 @@ Référence pour la compatibilité animale.
|
|||||||
| Prairie | Moyenne |
|
| Prairie | Moyenne |
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Bioluminescence** : Certains biomes (Océan profond, Forêt magique) brillent la nuit.
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
**Bonus** : +10% fertilité si animal sur son biome exact.
|
**Bonus** : +10% fertilité si animal sur son biome exact.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Décomposition** : Rapide en Jungle (Chaud/Humide), Lente en Toundra (Froid).
|
||||||
|
|
||||||
### Impact Nourriture
|
### 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)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
**Esthétique** : Un zoo avec des biomes variés est plus attractif (+5% par biome différent utilisé).
|
**Esthétique** : Un zoo avec des biomes variés est plus attractif (+5% par biome différent utilisé).
|
||||||
|
|
||||||
### Impact Valeur
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Terrain difficile** : Sable et Neige ralentissent les visiteurs (-30%).
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Arrosage** : Coût élevé en Désert pour maintenir des plantes.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Vue** : Les visiteurs aiment les panoramas (Montagne = Point de vue).
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
N/A
|
* **Floraison** : Le biome Prairie devient fleuri au printemps (+Attractivité).
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
@@ -105,13 +108,32 @@ N/A
|
|||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### Messages d'Infos / Alerte
|
||||||
N/A
|
| ID | Niveau | Message |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `BIOME_CHANGE` | Succès | "Le biome de la case a été modifié." |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Identification Visuelle (Passif)
|
### Identification Visuelle (Passif)
|
||||||
**Description UX** : Le joueur identifie le biome à la couleur du sol.
|
**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).
|
**Textures** : Motifs discrets (brins d'herbe, cailloux, craquelures) superposés à la couleur pour l'accessibilité (daltonisme).
|
||||||
**Emplacement** : Fond de Case.
|
**Emplacement** : Fond de Case.
|
||||||
**Intégration** : Layer 0 (Background).
|
**Intégration** : Layer 0 (Background).
|
||||||
**Navigation** : N/A
|
**Navigation** : Survol Souris / Toucher Long.
|
||||||
**Événements** : `MAP_RENDER`.
|
**Événements** : `MAP_RENDER`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Ambiance sonore changeante selon biome survolé (Vent, Vagues, Forêt).
|
||||||
- **Sons** : N/A
|
- **Sons** : Bruit de pas spécifique (Craquement, Sable, Herbe).
|
||||||
- **Graphiques** : Tilesets (15 variations de couleur/texture).
|
- **Graphiques** : Tilesets (15 variations de couleur/texture).
|
||||||
- **Images** : N/A
|
- **Images** : Vignettes de biomes pour l'éditeur.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Fond animé de l'eau (shader).
|
||||||
- **Animations** : Eau qui ondule (Océan), Herbe qui bouge (Prairie).
|
- **Animations** : Eau qui ondule (Océan), Herbe qui bouge (Prairie).
|
||||||
- **Couleurs** : Palette 15 couleurs (Cercle chromatique).
|
- **Couleurs** : Palette 15 couleurs (Cercle chromatique).
|
||||||
- **Textes** : Tooltip "Biome : Prairie".
|
- **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".
|
**Description UI** : L'herbe sous l'animal jaunit ou devient boueuse. L'animal a une bulle "Beurk".
|
||||||
**Emplacement** : Case Zoo.
|
**Emplacement** : Case Zoo.
|
||||||
**Intégration** : Overlay Case.
|
**Intégration** : Overlay Case.
|
||||||
**Navigation** : N/A
|
**Navigation** : Auto (Détection).
|
||||||
**Événements** : `BIOME_MISMATCH`.
|
**Événements** : `BIOME_MISMATCH`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Son "Malaise" (basse fréquence).
|
||||||
- **Sons** : N/A
|
- **Sons** : Bruit de dégoût "Yuck".
|
||||||
- **Graphiques** : Overlay "Sol Mort".
|
- **Graphiques** : Overlay "Sol Mort".
|
||||||
- **Images** : N/A
|
- **Images** : Icône "Sol incompatible" (Sens interdit).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de flétrissement (shader).
|
||||||
- **Animations** : Transition lente vers le jaune/marron.
|
- **Animations** : Transition lente vers le jaune/marron.
|
||||||
- **Couleurs** : Jaune paille, Marron.
|
- **Couleurs** : Jaune paille, Marron.
|
||||||
- **Textes** : N/A
|
- **Textes** : "Sol Inadapté !".
|
||||||
- **Formes** : N/A
|
- **Formes** : Croix rouge sur le sol.
|
||||||
|
|||||||
@@ -17,71 +17,83 @@
|
|||||||
Événement loggé.
|
Événement loggé.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Compteur Morts** : 0.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Taux Mortalité Infantile** : 0%.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Voir Causes.
|
Voir Causes.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Oubli** : Le souvenir (et le malus) s'estompe après 7 jours in-game.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Traumatisme** : Les parents ont -50% fertilité pendant 1 semaine (Choc émotionnel).
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
Voir `bebe_animal.md`.
|
Voir `bebe_animal.md`.
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Tombe** : Une petite stèle apparaît temporairement sur la case (décoratif, disparaît au clic).
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Hiver rigoureux** : Cause fréquente de mortalité infantile (Froid).
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Nuit glaciale** : Moment critique (baisse T°).
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Deuil** : Pas de reproduction possible pour les parents pendant 24h.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Effet domino** : Tristesse contagieuse aux animaux proches (Stress +10).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Gaspillage** : La nourriture allouée au bébé est perdue (pourrit).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### 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
|
### Impact Valeur
|
||||||
N/A
|
**Perte sèche** : Valeur potentielle (élevée) perdue définitivement.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Frais d'équarrissage** : 10 pièces pour enlever le corps.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Évitement** : Les visiteurs contournent la zone de mort (Rayon 2 cases).
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Mort Bébé** : Notification critique.
|
* **Mort Bébé** : Notification critique.
|
||||||
|
* **Enterrement** : Animation de disparition.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### Messages d'Infos / Alerte
|
||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
@@ -90,25 +102,34 @@ N/A
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Drame (Événement)
|
### Drame (Événement)
|
||||||
**Description UX** : Le bébé meurt.
|
**Description UX** : Le bébé meurt.
|
||||||
**Description UI** : Le sprite devient gris/fantôme puis disparaît (montée au ciel). Musique triste.
|
**Description UI** : Le sprite devient gris/fantôme puis disparaît (montée au ciel). Musique triste.
|
||||||
**Emplacement** : Case Zoo/Nurserie.
|
**Emplacement** : Case Zoo/Nurserie.
|
||||||
**Intégration** : Immédiat.
|
**Intégration** : Immédiat.
|
||||||
**Navigation** : N/A
|
**Navigation** : Auto (Cinématique).
|
||||||
**Événements** : `DEATH_ANIMATION`.
|
**Événements** : `DEATH_ANIMATION`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : Jingle Triste (Violon).
|
- **Musiques** : Jingle Triste (Violon).
|
||||||
- **Sons** : `gong.mp3` ou vent lugubre.
|
- **Sons** : `gong.mp3` ou vent lugubre.
|
||||||
- **Graphiques** : Fantôme.
|
- **Graphiques** : Fantôme.
|
||||||
- **Images** : N/A
|
- **Images** : Pierre tombale (Sprite).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de pluie (Overlay).
|
||||||
- **Animations** : Opacité 100% -> 0%. Translation Y vers le haut.
|
- **Animations** : Opacité 100% -> 0%. Translation Y vers le haut.
|
||||||
- **Couleurs** : Gris, Noir.
|
- **Couleurs** : Gris, Noir.
|
||||||
- **Textes** : "RIP".
|
- **Textes** : "RIP".
|
||||||
- **Formes** : N/A
|
- **Formes** : Halo sombre.
|
||||||
|
|
||||||
### Notification (Alerte)
|
### Notification (Alerte)
|
||||||
**Description UX** : Le joueur est informé de la perte.
|
**Description UX** : Le joueur est informé de la perte.
|
||||||
@@ -119,12 +140,483 @@ N/A
|
|||||||
**Événements** : `DEATH_ACKNOWLEDGE`.
|
**Événements** : `DEATH_ACKNOWLEDGE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Silence (Coupure son).
|
||||||
- **Sons** : N/A
|
- **Sons** : Bruit de tonnerre lointain.
|
||||||
- **Graphiques** : Crâne (icône).
|
- **Graphiques** : Crâne (icône).
|
||||||
- **Images** : N/A
|
- **Images** : Portrait du bébé avec ruban noir.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `death_alert_glitch.webm` (0.7s loop, optionnel), `black_ribbon_fade.webm` (1.2s non loop).
|
||||||
- **Animations** : N/A
|
- **Animations** : Tremblement de la fenêtre.
|
||||||
- **Couleurs** : Noir #000000.
|
- **Couleurs** : Noir #000000.
|
||||||
- **Textes** : Cause du décès.
|
- **Textes** : Cause du décès.
|
||||||
- **Formes** : N/A
|
- **Formes** : Bordure noire épaisse.
|
||||||
|
|
||||||
|
## Définition
|
||||||
|
|
||||||
|
| Champ | Valeur |
|
||||||
|
|---|---|
|
||||||
|
| Concept | Événement de décès d’un 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 d’ack 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 à l’emplacement | 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 d’analytics |
|
||||||
|
| 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 l’alerte | 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 d’un 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
529
docs/specs/nourisseur.md
Normal 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 d’abord” |
|
||||||
|
|
||||||
|
#### 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 |
|
||||||
56
docs/specs/nourriture_speciale.md
Normal file
56
docs/specs/nourriture_speciale.md
Normal 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.
|
||||||
@@ -24,7 +24,10 @@ Bâtiment dédié à l'éclosion des œufs et à la croissance des bébés anima
|
|||||||
"level": "integer (1-7)",
|
"level": "integer (1-7)",
|
||||||
"slots": [
|
"slots": [
|
||||||
{ "slot_id": 1, "content": "egg_uuid | baby_uuid | null", "timer_end": "timestamp" }
|
{ "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 |
|
| Protection T° | +/- 2°C tolérance |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Taux Survie** : 100% (si conditions respectées).
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -57,29 +60,31 @@ La nurserie régule la température interne.
|
|||||||
| 7 | +/- 10°C (Climatisation parfaite) |
|
| 7 | +/- 10°C (Climatisation parfaite) |
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### 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
|
### Impact Saisons
|
||||||
Protège des effets négatifs des saisons (Hiver/Été).
|
Protège des effets négatifs des saisons (Hiver/Été).
|
||||||
|
**Printemps** : Bonus Vitesse +10% (Nature en éveil).
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
Fonctionne 24h/24.
|
Fonctionne 24h/24. Veilleuse de nuit (pas de malus obscurité).
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### 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
|
### Impact Mort
|
||||||
Réduit drastiquement la mortalité infantile (Santé ne baisse pas sauf si Faim extrême).
|
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
|
### 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)
|
### 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
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
@@ -95,15 +100,16 @@ N/A
|
|||||||
| 7 | x10.0 |
|
| 7 | x10.0 |
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Électricité** : 5 pièces/heure (Chauffage lampes).
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Vitrine** : Les visiteurs s'agglutinent devant la vitre (si module Vitrine installé au Niv 3).
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Éclosion** : Œuf -> Bébé.
|
* **Éclosion** : Œuf -> Bébé.
|
||||||
* **Maturité** : Bébé -> Adulte (prêt à sortir).
|
* **Maturité** : Bébé -> Adulte (prêt à sortir).
|
||||||
|
* **Jumeaux** : 1% chance d'avoir 2 bébés pour 1 œuf.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
@@ -133,9 +139,19 @@ function updateNurserie(nurserie):
|
|||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| `EGG_HATCHED` | Info | "Un œuf a éclos en Nurserie !" |
|
| `EGG_HATCHED` | Info | "Un œuf a éclos en Nurserie !" |
|
||||||
| `NURSERIE_FULL` | Warning | "Nurserie pleine, impossible d'acheter/reproduire." |
|
| `NURSERIE_FULL` | Warning | "Nurserie pleine, impossible d'acheter/reproduire." |
|
||||||
|
| `TWINS` | Info | "Incroyable ! Des jumeaux sont nés !" |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Gestion des Slots (Consultation)
|
### Gestion des Slots (Consultation)
|
||||||
**Description UX** : Le joueur clique sur la nurserie pour voir l'état de ses œufs et bébés.
|
**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`.
|
**Événements** : `OPEN_NURSERIE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Berceuse douce (boîte à musique).
|
||||||
- **Sons** : `ui_open.mp3`
|
- **Sons** : `ui_open.mp3`
|
||||||
- **Graphiques** : Style "Couveuse" ou "Nid douillet".
|
- **Graphiques** : Style "Couveuse" ou "Nid douillet".
|
||||||
- **Images** : `egg_[rarity].png`, `baby_[species].png`.
|
- **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.
|
- **Animations** : Œuf qui tremble légèrement quand proche éclosion.
|
||||||
- **Couleurs** : Tons pastels (rose, bleu clair, jaune paille).
|
- **Couleurs** : Tons pastels (rose, bleu clair, jaune paille).
|
||||||
- **Textes** : "Slot X", "Temps restant : MM:SS".
|
- **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.
|
**Description UI** : Animation de l'œuf "volant" vers la nurserie (si visible) ou simple apparition dans le slot.
|
||||||
**Emplacement** : HUD -> Nurserie.
|
**Emplacement** : HUD -> Nurserie.
|
||||||
**Intégration** : Automatique.
|
**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`.
|
**Événements** : `EGG_ADDED`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Son "Pop" doux.
|
||||||
- **Sons** : `pop_soft.mp3`
|
- **Sons** : `pop_soft.mp3`
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Ombre portée de l'œuf.
|
||||||
- **Images** : N/A
|
- **Images** : Icône Œuf.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de téléportation (particules).
|
||||||
- **Animations** : Fade in + Scale up de l'œuf dans le slot.
|
- **Animations** : Fade in + Scale up de l'œuf dans le slot.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Blanc coquille.
|
||||||
- **Textes** : N/A
|
- **Textes** : "Placé".
|
||||||
- **Formes** : N/A
|
- **Formes** : Cercle.
|
||||||
|
|
||||||
### Éclosion (Action)
|
### É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é.
|
**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`.
|
- **Sons** : `crack_egg.mp3`, `baby_cry.mp3`.
|
||||||
- **Graphiques** : Coquilles brisées.
|
- **Graphiques** : Coquilles brisées.
|
||||||
- **Images** : Sprite bébé.
|
- **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).
|
- **Animations** : Séquence d'éclosion (3 frames).
|
||||||
- **Couleurs** : Rayons dorés/blancs.
|
- **Couleurs** : Rayons dorés/blancs.
|
||||||
- **Textes** : "C'est un [Espèce] [Rareté] !".
|
- **Textes** : "C'est un [Espèce] [Rareté] !".
|
||||||
@@ -204,12 +220,12 @@ function updateNurserie(nurserie):
|
|||||||
**Événements** : `DRAG_START`, `DRAG_DROP`.
|
**Événements** : `DRAG_START`, `DRAG_DROP`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Son "Sélection".
|
||||||
- **Sons** : `pickup.mp3`, `place_ok.mp3` / `place_error.mp3`.
|
- **Sons** : `pickup.mp3`, `place_ok.mp3` / `place_error.mp3`.
|
||||||
- **Graphiques** : Grille de placement overlay.
|
- **Graphiques** : Grille de placement overlay.
|
||||||
- **Images** : Sprite fantôme (translucide) sous le curseur.
|
- **Images** : Sprite fantôme (translucide) sous le curseur.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Pulsation de la case cible.
|
||||||
- **Animations** : N/A
|
- **Animations** : Rebondissement du sprite au drop.
|
||||||
- **Couleurs** : Vert #00FF00 (OK), Rouge #FF0000 (KO).
|
- **Couleurs** : Vert #00FF00 (OK), Rouge #FF0000 (KO).
|
||||||
- **Textes** : Tooltip "Placer ici".
|
- **Textes** : Tooltip "Placer ici".
|
||||||
- **Formes** : N/A
|
- **Formes** : Carré de sélection.
|
||||||
|
|||||||
80
docs/specs/objet_enclos.md
Normal file
80
docs/specs/objet_enclos.md
Normal 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** : l’objet est un obstacle interne à l’enclos (visiteurs ne le traversent pas si l’enclos est visitable ; animaux l’utilisent 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.
|
||||||
522
docs/specs/passe_saisonnier.md
Normal file
522
docs/specs/passe_saisonnier.md
Normal 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 | - |
|
||||||
@@ -17,84 +17,160 @@ Classe abstraite ou interface commune.
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"id": "uuid",
|
"id": "uuid",
|
||||||
"type": "string",
|
"type": "enum('player','bot','visitor','animal','staff')",
|
||||||
|
"created_at": "timestamp",
|
||||||
|
"updated_at": "timestamp",
|
||||||
"position": { "x": "int", "y": "int" },
|
"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
|
### Caractéristiques Initiales
|
||||||
N/A (Spécifique aux sous-types)
|
| Caractéristique | Valeur Initiale | Type | Description |
|
||||||
|
|---|---|---|---|
|
||||||
|
| active | true | bool | L’entité 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
|
### 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
| Condition | Seuil | Opérateur | Résultat |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| Spawn système | true | Est | Création de l’entité (par règle métier). |
|
||||||
|
| Ressources dispo | selon type | >= | Autorise création (ex. staff payé). |
|
||||||
|
|
||||||
### Conditions de Disparition
|
### 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é
|
### 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
| Plage Température | Effet sur l’entité | Bonus/Malus |
|
||||||
|
|---|---|---|
|
||||||
|
| < 0°C | Animations “froid” (si entité sensible) | vitesse -10% (visiteurs) |
|
||||||
|
| > 30°C | Animations “chaud” | soif +20% (visiteurs) |
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### 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
|
### Impact Saisons
|
||||||
N/A
|
| Saison | Effet | Modificateur |
|
||||||
|
|---|---|---|
|
||||||
|
| Été | foule + | visiteurs + |
|
||||||
|
| Hiver | foule - | visiteurs - |
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### 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
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
| Facteur | Effet sur Taux | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Proximité | augmente | si entité = animal |
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
| Cause | Conséquence | Durée |
|
||||||
|
|---|---|---|
|
||||||
|
| État critique | passage dead | selon règles type |
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
| Type Nourriture | Gain Santé | Coût | Préférence |
|
||||||
|
|---|---:|---:|---:|
|
||||||
|
| selon type | variable | variable | 1–5 |
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
| Action/État | Gain Attractivité | Rayon d'action |
|
||||||
|
|---|---:|---:|
|
||||||
|
| entité rare visible | + | 8 cases |
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
| Facteur | Variation Prix | Condition |
|
||||||
|
|---|---:|---|
|
||||||
|
| rareté cosmétique | + | si skin rare |
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
| Poste | Coût | Unité | Condition |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| maintenance entité | variable | /jour | si staff/bâtiment associé |
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
| Trajet | Règle | Priorité | Notes |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| vers POI | A* pondéré | 50 | chemins préférés |
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### É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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
| Niveau | Coût | Prérequis | Bonus Débloqué |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| 1 | 0 | - | comportement de base |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Identification (Passif)
|
### Identification (Passif)
|
||||||
**Description UX** : Reconnaître le type de personnage au premier coup d'œil.
|
**Description UX** : Reconnaître le type de personnage au premier coup d'œil.
|
||||||
@@ -105,12 +181,12 @@ N/A
|
|||||||
**Événements** : `HOVER_CHARACTER`.
|
**Événements** : `HOVER_CHARACTER`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_hover_soft.mp3` (jingle court, optionnel).
|
||||||
- **Sons** : N/A
|
- **Sons** : `ui_hover.mp3`, `ui_select.mp3`.
|
||||||
- **Graphiques** : Silhouettes archétypales.
|
- **Graphiques** : Silhouettes archétypales.
|
||||||
- **Images** : N/A
|
- **Images** : `badge_player.png`, `badge_bot.png`, `badge_visitor.png`, `badge_animal.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `hover_glow.webm` (0.6s loop, optionnel).
|
||||||
- **Animations** : N/A
|
- **Animations** : Glow pulse (hover), pop (select).
|
||||||
- **Couleurs** : Joueur (Bleu), Bot (Rouge/Gris), Visiteur (Multicolore), Animal (Naturel).
|
- **Couleurs** : Joueur (Bleu), Bot (Rouge/Gris), Visiteur (Multicolore), Animal (Naturel).
|
||||||
- **Textes** : Nom, Rôle.
|
- **Textes** : Nom, Rôle.
|
||||||
- **Formes** : N/A
|
- **Formes** : Badge rond + tooltip rect arrondi.
|
||||||
|
|||||||
78
docs/specs/pont.md
Normal file
78
docs/specs/pont.md
Normal 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 d’eau 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 d’affilé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."
|
||||||
@@ -22,17 +22,18 @@
|
|||||||
Logique serveur.
|
Logique serveur.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Fertilité de base** : 50%.
|
||||||
|
**Cooldown** : 24h (in-game) après une naissance.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Taux de natalité du zoo** : 0 naissances/jour.
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
**Saison des amours** : Événement aléatoire ou Printemps.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Ménopause/Vieillesse** : Fin de fertilité à 80% de l'espérance de vie.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
| Parent A | Parent B | Enfant (Probabilités) |
|
| Parent A | Parent B | Enfant (Probabilités) |
|
||||||
@@ -42,87 +43,109 @@ N/A
|
|||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### Impact Milieu (Biome)
|
||||||
**Condition** : Biome doit être "Parfait".
|
**Condition** : Biome doit être "Parfait". Sol confortable requis.
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
**Printemps** : +20% chance réussite.
|
**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
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Nuit** : +20% chance (Intimité, calme).
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Consanguinité** : Risque de malus génétique (Santé max -10%) si parents trop proches (Frère/Sœur).
|
||||||
|
|
||||||
### Impact Mort
|
### 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
|
### Impact Nourriture
|
||||||
**Condition** : Faim < 20%.
|
**Condition** : Faim < 20%. Si Faim > 50%, avortement spontané.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Buzz** : Une naissance rare attire la presse (+Attractivité temporaire "Baby Boom").
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**Lignée** : Un bébé issu de champions (Parents Rareté 5) vaut 2x plus cher.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Suivi Vétérinaire** : 50 pièces prélevées à la conception (Échographie).
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Zone calme requise** : Si > 10 visiteurs autour de l'enclos, Stress monte -> Échec reproduction.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Accouplement** : Tentative.
|
* **Accouplement** : Tentative.
|
||||||
* **Grossesse** : Délai avant naissance.
|
* **Grossesse** : Délai avant naissance.
|
||||||
|
* **Fausse couche** : Si stress trop élevé.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
```
|
```javascript
|
||||||
if checkConditions(parentA, parentB):
|
if checkConditions(parentA, parentB):
|
||||||
chance = baseChance + seasonBonus + zooReproScoreBonus
|
chance = baseChance + seasonBonus + zooReproScoreBonus
|
||||||
|
if isNight(): chance *= 1.2
|
||||||
|
|
||||||
if random() < chance:
|
if random() < chance:
|
||||||
createBaby(parentA, parentB)
|
createBaby(parentA, parentB)
|
||||||
|
else:
|
||||||
|
emitEvent("REPRO_FAIL", "Tentative échouée")
|
||||||
```
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### Messages d'Infos / Alerte
|
||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| `REPRO_SUCCESS` | Succès | "Un couple attend un heureux événement !" |
|
| `REPRO_SUCCESS` | Succès | "Un couple attend un heureux événement !" |
|
||||||
|
| `REPRO_FAIL` | Info | "La tentative de reproduction a échoué." |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Amour (Passif)
|
### Amour (Passif)
|
||||||
**Description UX** : Deux animaux compatibles se rencontrent. Des cœurs apparaissent.
|
**Description UX** : Deux animaux compatibles se rencontrent. Des cœurs apparaissent.
|
||||||
**Description UI** : Particules Cœurs au-dessus des animaux. Ils se rapprochent.
|
**Description UI** : Particules Cœurs au-dessus des animaux. Ils se rapprochent.
|
||||||
**Emplacement** : Case Zoo.
|
**Emplacement** : Case Zoo.
|
||||||
**Intégration** : Animation comportementale.
|
**Intégration** : Animation comportementale.
|
||||||
**Navigation** : N/A
|
**Navigation** : Auto (Animation).
|
||||||
**Événements** : `MATING_START`.
|
**Événements** : `MATING_START`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Musique Romantique (Saxophone soft).
|
||||||
- **Sons** : `kiss.mp3` ou bruit doux.
|
- **Sons** : `kiss.mp3` ou bruit doux.
|
||||||
- **Graphiques** : Cœurs roses.
|
- **Graphiques** : Cœurs roses.
|
||||||
- **Images** : N/A
|
- **Images** : Icône "Love" au-dessus des têtes.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de flou artistique (Bloom).
|
||||||
- **Animations** : Cœurs qui montent.
|
- **Animations** : Cœurs qui montent.
|
||||||
- **Couleurs** : Rose.
|
- **Couleurs** : Rose.
|
||||||
- **Textes** : N/A
|
- **Textes** : "Accouplement en cours".
|
||||||
- **Formes** : Cœur.
|
- **Formes** : Cœur.
|
||||||
|
|
||||||
### Naissance (Événement)
|
### Naissance (Événement)
|
||||||
@@ -137,9 +160,9 @@ if checkConditions(parentA, parentB):
|
|||||||
- **Musiques** : Jingle Naissance.
|
- **Musiques** : Jingle Naissance.
|
||||||
- **Sons** : `tada.mp3`.
|
- **Sons** : `tada.mp3`.
|
||||||
- **Graphiques** : Cigogne (icône).
|
- **Graphiques** : Cigogne (icône).
|
||||||
- **Images** : N/A
|
- **Images** : Photo du bébé.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Feu d'artifice miniature.
|
||||||
- **Animations** : Confettis.
|
- **Animations** : Confettis.
|
||||||
- **Couleurs** : Rose/Bleu.
|
- **Couleurs** : Rose/Bleu.
|
||||||
- **Textes** : "Bienvenue au nouveau [Espèce] !".
|
- **Textes** : "Bienvenue au nouveau [Espèce] !".
|
||||||
- **Formes** : N/A
|
- **Formes** : Étoile explosive.
|
||||||
|
|||||||
@@ -26,30 +26,50 @@ Propriété de `Zoo`.
|
|||||||
| Réputation | 0 |
|
| Réputation | 0 |
|
||||||
|
|
||||||
### Scores Initiaux
|
### 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'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
|
### Conditions de Disparition
|
||||||
N/A
|
| Condition | Seuil | Opérateur | Résultat |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| Zoo supprimé | true | Est | Score supprimé avec le zoo. |
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| Soft reset / prestige | Bonus de départ | 100% | Non |
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
| Biome | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Enclos adaptés | + réputation via survie + satisfaction visiteurs |
|
||||||
|
|
||||||
### Impact Saisons
|
### 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
|
### 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
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
@@ -59,23 +79,33 @@ N/A
|
|||||||
**Malus** : -50 pts par mort (décroissance sur 24h).
|
**Malus** : -50 pts par mort (décroissance sur 24h).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
| Facteur | Variation | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Stock nourriture stable | +1% / jour | Aucun animal en faim critique |
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
C'est la métrique de base de l'attractivité.
|
C'est la métrique de base de l'attractivité.
|
||||||
|
|
||||||
### Impact Valeur
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
| Poste | Coût | Unité | Condition |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| Campagnes image | 1000–5000 | coins | Augmente temporairement la réputation visible |
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
| Mécanisme | Impact | Détail |
|
||||||
|
|---|---|---|
|
||||||
|
| Flux ville→zoo | Direct | Réputation est un facteur principal de flux |
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -83,7 +113,10 @@ N/A
|
|||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
@@ -92,10 +125,22 @@ score = sum(animal.rarity * 10) + (uniqueSpecies * 50) + buildingsValue - deathP
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Affichage Score (Permanent)
|
### Affichage Score (Permanent)
|
||||||
**Description UX** : Le joueur connaît son niveau de prestige.
|
**Description UX** : Le joueur connaît son niveau de prestige.
|
||||||
@@ -106,11 +151,11 @@ N/A
|
|||||||
**Événements** : `SCORE_UPDATE`.
|
**Événements** : `SCORE_UPDATE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `level_up_jingle.mp3` (court), `ui_score_tick.mp3` (optionnel).
|
||||||
- **Sons** : `level_up_jingle.mp3`.
|
- **Sons** : `level_up_jingle.mp3`.
|
||||||
- **Graphiques** : Icône Couronne.
|
- **Graphiques** : Icône Couronne.
|
||||||
- **Images** : N/A
|
- **Images** : `icon_crown.png`, `reputation_star.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `crown_glint.webm` (0.8s non loop, optionnel).
|
||||||
- **Animations** : Brillance quand augmente.
|
- **Animations** : Brillance quand augmente.
|
||||||
- **Couleurs** : Or.
|
- **Couleurs** : Or.
|
||||||
- **Textes** : "Niveau 5 (4500 pts)".
|
- **Textes** : "Niveau 5 (4500 pts)".
|
||||||
|
|||||||
@@ -25,17 +25,27 @@ Propriété de `Zoo`.
|
|||||||
| Survie | 100% |
|
| Survie | 100% |
|
||||||
|
|
||||||
### Scores Initiaux
|
### 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'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
|
### Conditions de Disparition
|
||||||
N/A
|
| Condition | Seuil | Opérateur | Résultat |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| Zoo supprimé | true | Est | Score supprimé avec le zoo. |
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| Soft reset | Bonus de départ (+10) | 100% | Non |
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
@@ -45,10 +55,15 @@ Moyenne des adéquations T°.
|
|||||||
Moyenne des adéquations Biome.
|
Moyenne des adéquations Biome.
|
||||||
|
|
||||||
### Impact Saisons
|
### 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 d’ombre/eau |
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### 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
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
@@ -61,28 +76,47 @@ Seuil critique : < 20% (Risque épidémie).
|
|||||||
Moyenne des Faims.
|
Moyenne des Faims.
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
| État | Effet | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Survie > 90 | Visiteurs satisfaits | bonus attractivité local |
|
||||||
|
| Survie < 50 | Visiteurs inquiets | malus attractivité |
|
||||||
|
|
||||||
### Impact Valeur
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### 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
|
### Trajet Visiteurs
|
||||||
N/A
|
| Mécanisme | Effet | Détail |
|
||||||
|
|---|---|---|
|
||||||
|
| Évitement zones malades | détour | réduit densité autour animaux malades |
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### É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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
@@ -97,6 +131,15 @@ survivalScore = average(allAnimals.health)
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Monitoring Santé (Permanent)
|
### Monitoring Santé (Permanent)
|
||||||
**Description UX** : Le joueur surveille la santé globale de son zoo.
|
**Description UX** : Le joueur surveille la santé globale de son zoo.
|
||||||
@@ -107,11 +150,11 @@ survivalScore = average(allAnimals.health)
|
|||||||
**Événements** : `HEALTH_UPDATE`.
|
**Événements** : `HEALTH_UPDATE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_health_soft.mp3` (jingle discret), `ui_critical_pulse.mp3` (optionnel).
|
||||||
- **Sons** : `heartbeat.mp3` (si critique).
|
- **Sons** : `heartbeat.mp3` (si critique).
|
||||||
- **Graphiques** : Icône Cœur.
|
- **Graphiques** : Icône Cœur.
|
||||||
- **Images** : N/A
|
- **Images** : `icon_heart.png`, `icon_cross.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `heart_pulse.webm` (0.8s loop, optionnel).
|
||||||
- **Animations** : Battement (Pulsation).
|
- **Animations** : Battement (Pulsation).
|
||||||
- **Couleurs** : Vert -> Jaune -> Rouge.
|
- **Couleurs** : Vert -> Jaune -> Rouge.
|
||||||
- **Textes** : "98%".
|
- **Textes** : "98%".
|
||||||
|
|||||||
@@ -22,82 +22,142 @@ Un site est un lieu d'intérêt positionné sur la Carte du Monde.
|
|||||||
"id": "uuid",
|
"id": "uuid",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"name": "string",
|
"name": "string",
|
||||||
"position": { "x": "int", "y": "int" }
|
"position": { "x": "int", "y": "int" },
|
||||||
|
"iso_x": "integer",
|
||||||
|
"iso_y": "integer",
|
||||||
|
"z_index": "integer"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### 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
|
### 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 d’incident. |
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Génération procédurale ou création joueur.
|
Génération procédurale ou création joueur.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### 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é
|
### Hérédité
|
||||||
N/A
|
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| Monde | Découverte | 100% | Non |
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
| Condition | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Tempête régionale | modifie les flux/visites | impact de contexte |
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
| Biome | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Biome ville | type de visiteurs | modifie budget moyen |
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
| Saison | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Hiver | routes plus lentes | dist effective + |
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
| Période | Effet |
|
||||||
|
|---|---|
|
||||||
|
| Nuit | lumières sites | rendu + |
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
| Facteur | Effet sur Taux | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Labo événement | boost génétique | si lab actif |
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
| Cause | Conséquence | Durée |
|
||||||
|
|---|---|---|
|
||||||
|
| Catastrophe sur site | fermeture | 24h |
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
| Facteur | Variation | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Ville agricole | stock nourriture + | économie |
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
| Action/État | Gain Attractivité | Rayon d'action |
|
||||||
|
|---|---:|---:|
|
||||||
|
| Zoo halo | + | visibilité monde |
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
| Facteur | Variation | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Emplacement premium | + | proche villes |
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
| Poste | Coût | Unité | Condition |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| Taxe régionale | 1% | transaction | route commerciale |
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
| Trajet | Condition | Effet | Notes |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Ville→Zoo | attraction | flux | cf. attractivité |
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### É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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### Tableau des Upgrades
|
||||||
N/A
|
| Niveau | Coût | Prérequis | Bonus Débloqué |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| 1 | 0 | - | Tooltips |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### Pseudo-code Impacts
|
||||||
N/A
|
```text
|
||||||
|
onHoverSite(site):
|
||||||
|
showTooltip(site.name, site.type, site.keyMetric)
|
||||||
|
|
||||||
|
onClickSite(site):
|
||||||
|
openDetailPanel(site)
|
||||||
|
```
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Info-bulle (Consultation)
|
### Info-bulle (Consultation)
|
||||||
**Description UX** : Survoler un site donne ses détails.
|
**Description UX** : Survoler un site donne ses détails.
|
||||||
@@ -108,11 +168,11 @@ N/A
|
|||||||
**Événements** : `HOVER_SITE`.
|
**Événements** : `HOVER_SITE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_tooltip_soft.mp3` (jingle discret).
|
||||||
- **Sons** : `pop.mp3` léger.
|
- **Sons** : `pop.mp3` léger.
|
||||||
- **Graphiques** : Fond noir semi-transparent.
|
- **Graphiques** : Fond noir semi-transparent.
|
||||||
- **Images** : N/A
|
- **Images** : `site_icon_zoo.png`, `site_icon_city.png`, `site_icon_lab.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `tooltip_fade.webm` (0.6s loop, optionnel).
|
||||||
- **Animations** : Fade in rapide.
|
- **Animations** : Fade in rapide.
|
||||||
- **Couleurs** : Blanc sur Noir.
|
- **Couleurs** : Blanc sur Noir.
|
||||||
- **Textes** : "Paris (1M hab.)".
|
- **Textes** : "Paris (1M hab.)".
|
||||||
|
|||||||
502
docs/specs/skin.md
Normal file
502
docs/specs/skin.md
Normal 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 l’apparence 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
535
docs/specs/soigneur.md
Normal 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 d’animaux 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 d’effet 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 |
|
||||||
@@ -12,11 +12,16 @@
|
|||||||
### Frontend
|
### Frontend
|
||||||
- **Framework** : React ou Vue.js.
|
- **Framework** : React ou Vue.js.
|
||||||
- **État** : Zustand ou Pinia (léger et performant).
|
- **É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
|
### Infrastructure
|
||||||
- **Cache** : Redis (pour les sessions, les compteurs temps réel et les files d'attente de jobs).
|
- **Cache** : Interdit (aucun cache applicatif, aucune mémorisation). Les lectures doivent refléter l’état courant calculé/stocké, sans couche de cache.
|
||||||
- **Message Broker** : BullMQ (Redis) ou RabbitMQ pour les tâches asynchrones (morts, naissances, enchères).
|
- **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),
|
zoo_id UUID REFERENCES zoos(id),
|
||||||
type VARCHAR(50),
|
type VARCHAR(50),
|
||||||
birth_date TIMESTAMPTZ,
|
birth_date TIMESTAMPTZ,
|
||||||
state JSONB, -- { health, hunger, stress, ... }
|
state JSONB, -- { health, hunger, stress, happiness, lastFedAt, lastVisitedAt }
|
||||||
genetics JSONB, -- { color, rarity, parents... }
|
genetics JSONB, -- { color, rarity, parents, mutations, lineageId }
|
||||||
position JSONB -- { x, y }
|
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)
|
### Exceptions (Workers)
|
||||||
Certains événements doivent arriver même si le joueur est hors ligne (ex: Enchères, Morts impactant le marché).
|
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 à l’heure 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
|
### Système
|
||||||
- `POST /api/auth/login` : Authentification par clé.
|
- `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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Chargement (Feedback)
|
### Chargement (Feedback)
|
||||||
**Description UX** : Le joueur attend le calcul du Lazy Update à la connexion.
|
**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).
|
**Description UI** : Écran de chargement avec barre de progression ou animation (Animal qui marche).
|
||||||
**Emplacement** : Plein écran (Démarrage).
|
**Emplacement** : Plein écran (Démarrage).
|
||||||
**Intégration** : Bloquant.
|
**Intégration** : Bloquant.
|
||||||
**Navigation** : N/A
|
**Navigation** : Aucune (écran d’attente avant accès au jeu).
|
||||||
**Événements** : `APP_LOAD`.
|
**Événements** : `APP_LOAD`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : Thème Principal.
|
- **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.
|
- **Graphiques** : Logo Jeu.
|
||||||
- **Images** : N/A
|
- **Images** : `loading_mascot.png` (mascotte), `loading_background.png` (fond).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `loading_anim.webm` (animation courte, loop).
|
||||||
- **Animations** : Loader.
|
- **Animations** : Loader.
|
||||||
- **Couleurs** : Thème Jeu.
|
- **Couleurs** : Thème Jeu.
|
||||||
- **Textes** : "Calcul de la simulation...", "Rattrapage du temps...".
|
- **Textes** : "Calcul de la simulation", "Rattrapage du temps".
|
||||||
- **Formes** : N/A
|
- **Formes** : Cercle (spinner), barre (progress).
|
||||||
|
|
||||||
### Erreur Connexion (Feedback)
|
### Erreur Connexion (Feedback)
|
||||||
**Description UX** : Perte de connexion ou erreur API.
|
**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`.
|
**Événements** : `NETWORK_ERROR`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Ducking du thème principal (-6 dB) pendant l’affichage de l’erreur.
|
||||||
- **Sons** : `error.mp3`.
|
- **Sons** : `error.mp3`.
|
||||||
- **Graphiques** : Icône Wifi barré.
|
- **Graphiques** : Icône Wifi barré.
|
||||||
- **Images** : N/A
|
- **Images** : `icon_wifi_off.png`, `modal_error_bg.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `network_error_glitch.webm` (optionnel, 0.8s loop).
|
||||||
- **Animations** : Secousse.
|
- **Animations** : Secousse.
|
||||||
- **Couleurs** : Rouge.
|
- **Couleurs** : Rouge.
|
||||||
- **Textes** : "Connexion perdue".
|
- **Textes** : "Connexion perdue".
|
||||||
- **Formes** : N/A
|
- **Formes** : Rectangle arrondi (modal), toast (pill).
|
||||||
|
|||||||
@@ -24,24 +24,28 @@ Propriété de `Case`.
|
|||||||
Définie par le biome (voir `milieu.md`).
|
Définie par le biome (voir `milieu.md`).
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**T° Moyenne** : 20°C (Référence).
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
Système Météo Global.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Permanence** : La température est une constante physique, elle ne disparaît jamais (sauf bug univers).
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Climat** : Le joueur choisit son climat de départ au reset (Tropical, Tempéré, Polaire).
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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 l’eau à 50% de l’amplitude. |
|
||||||
|
| Inertie sol | 1.0 | facteur | Le sol suit l’amplitude complète. |
|
||||||
|
| Lissage | 15 | min in-game | La variation s’applique progressivement sur la durée (évite “saut” visuel brutal). |
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Inertie** : L'eau change de T° moins vite que la terre (Tampon thermique).
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
| Saison | Modificateur Global |
|
| 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).
|
**Froid** : Augmente la consommation de nourriture (+20% par tranche de 5°C sous l'idéal).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### 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
|
### Impact Valeur
|
||||||
N/A
|
**Coût Énergie** : Chauffage/Clim coûte cher (10 pièces/degré corrigé).
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Gel** : Si T° < 0°C, vitesse déplacement -20% (Verglas).
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Facture Énergétique** : Coût mensuel lié aux régulateurs thermiques.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Ombre** : Les visiteurs cherchent l'ombre en été (Pathfinding modifié).
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -94,6 +98,8 @@ N/A
|
|||||||
| Niveau | Coût | Plage Réglage | Temps |
|
| Niveau | Coût | Plage Réglage | Temps |
|
||||||
| :--- | :--- | :--- | :--- |
|
| :--- | :--- | :--- | :--- |
|
||||||
| 1 | 200 | +/- 5°C | 0s |
|
| 1 | 200 | +/- 5°C | 0s |
|
||||||
|
| 2 | 500 | +/- 10°C | 0s |
|
||||||
|
| 3 | 1000 | +/- 20°C | 0s |
|
||||||
| 7 | 2000 | +/- 50°C | 0s |
|
| 7 | 2000 | +/- 50°C | 0s |
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
## 8. Logique et Interfaces
|
||||||
@@ -109,6 +115,15 @@ currentTemp = baseBiomeTemp + seasonMod + dayNightMod + caseRegulatorOffset
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Visualisation Thermique (Passif)
|
### Visualisation Thermique (Passif)
|
||||||
**Description UX** : Le joueur voit la température de chaque case.
|
**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`.
|
**Événements** : `TOGGLE_THERMAL_VIEW`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Sonar "Ping" lors de l'activation.
|
||||||
- **Sons** : `switch.mp3`.
|
- **Sons** : `switch.mp3`.
|
||||||
- **Graphiques** : Overlay dégradé Bleu/Rouge semi-transparent.
|
- **Graphiques** : Overlay dégradé Bleu/Rouge semi-transparent.
|
||||||
- **Images** : N/A
|
- **Images** : Légende thermique (Barre de couleur).
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de chaleur (ondulation de l'air).
|
||||||
- **Animations** : Fade In/Out de l'overlay.
|
- **Animations** : Fade In/Out de l'overlay.
|
||||||
- **Couleurs** : Bleu (#0000FF) -> Rouge (#FF0000).
|
- **Couleurs** : Bleu (#0000FF) -> Rouge (#FF0000).
|
||||||
- **Textes** : "25°C" (sur chaque case).
|
- **Textes** : "25°C" (sur chaque case).
|
||||||
- **Formes** : N/A
|
- **Formes** : Grille colorée.
|
||||||
|
|
||||||
### Feedback Critique (Alerte)
|
### Feedback Critique (Alerte)
|
||||||
**Description UX** : Une case est mortelle pour son occupant.
|
**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).
|
**Description UI** : La case clignote ou a un bord rouge. L'animal tremble (froid) ou transpire (chaud).
|
||||||
**Emplacement** : Case.
|
**Emplacement** : Case.
|
||||||
**Intégration** : Immédiat.
|
**Intégration** : Immédiat.
|
||||||
**Navigation** : N/A
|
**Navigation** : Auto (Alerte).
|
||||||
**Événements** : `TEMP_ALERT`.
|
**Événements** : `TEMP_ALERT`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Sirène "Alerte Météo" (lointaine).
|
||||||
- **Sons** : `shiver.mp3` (dents qui claquent) ou `pant.mp3`.
|
- **Sons** : `shiver.mp3` (dents qui claquent) ou `pant.mp3`.
|
||||||
- **Graphiques** : Particules Givre ou Vapeur.
|
- **Graphiques** : Particules Givre ou Vapeur.
|
||||||
- **Images** : N/A
|
- **Images** : Icône Flocon ou Flamme.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de gel (bords écran blancs).
|
||||||
- **Animations** : Tremblement sprite.
|
- **Animations** : Tremblement sprite.
|
||||||
- **Couleurs** : Bleu Glace / Rouge Feu.
|
- **Couleurs** : Bleu Glace / Rouge Feu.
|
||||||
- **Textes** : N/A
|
- **Textes** : "Danger T° !".
|
||||||
- **Formes** : N/A
|
- **Formes** : Pulsation rouge autour de la case.
|
||||||
|
|||||||
499
docs/specs/theme.md
Normal file
499
docs/specs/theme.md
Normal 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 | - |
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Types de Ventes
|
## Types de Ventes
|
||||||
- **Aux Enchères** : Vers d'autres joueurs (prix potentiellement élevé).
|
- **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
|
## Contraintes
|
||||||
- Un animal malade ou mourant ne peut pas être mis en vente.
|
- Un animal malade ou mourant ne peut pas être mis en vente.
|
||||||
@@ -12,80 +12,151 @@
|
|||||||
|
|
||||||
## 1. Données et États
|
## 1. Données et États
|
||||||
### Modèle de Données (JSON)
|
### 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
|
### Caractéristiques Initiales
|
||||||
N/A
|
**Total Vendu** : 0 animaux.
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Réputation Vendeur** : Neutre (0).
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
N/A
|
**Marché** : Offre publiée par le joueur.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Vente conclue** (Achat par tiers) ou **Annulation** (Retour au zoo).
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Certificat** : L'acheteur voit les parents et l'arbre généalogique.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Transport** : Camion climatisé requis si T° extrême (Coût +10%).
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Export** : Le biome d'origine est indiqué (Bonus adaptation si même biome cible).
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Demande** : Varie selon saison (ex: Rennes très demandés en Hiver, Lapins au Printemps).
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Enchères** : Souvent le soir (18h-22h) pour maximiser les vues (Prime Time).
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Vente Reproducteur** : Un animal fertile vaut 2x plus cher.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Assurance** : Remboursement 50% si mort pendant transport (si assurance payée).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Panier repas** : Coût inclus dans frais vente (L'animal ne doit pas arriver affamé).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
**Perte Star** : Vendre son meilleur animal (Légendaire) baisse l'attractivité du zoo (-10%).
|
||||||
|
|
||||||
### Impact Valeur
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||||||
N/A
|
**Durée Enchère** : 1h, 4h, 24h (au choix).
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Taxe Salle Vente** : 10% du prix final prélevé par le jeu.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
N/A
|
**Départ** : Les visiteurs font signe "au revoir" quand le camion part.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### É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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Libération (Action)
|
### Libération (Action)
|
||||||
**Description UX** : Le joueur relâche un animal (vente système).
|
**Description UX** : Le joueur relâche un animal (vente système).
|
||||||
@@ -96,12 +167,12 @@ N/A
|
|||||||
**Événements** : `RELEASE_ANIMAL`.
|
**Événements** : `RELEASE_ANIMAL`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_warning_soft.mp3` (jingle court à l’ouverture de confirmation).
|
||||||
- **Sons** : `bird_fly_away.mp3` (bruit de nature positif).
|
- **Sons** : `bird_fly_away.mp3` (bruit de nature positif).
|
||||||
- **Graphiques** : Icône Cage ouverte.
|
- **Graphiques** : Icône Cage ouverte.
|
||||||
- **Images** : N/A
|
- **Images** : `icon_release.png`, `modal_confirm.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `release_fade.webm` (1.2s non loop, optionnel).
|
||||||
- **Animations** : Animal s'estompe ou court hors de l'écran.
|
- **Animations** : Animal s'estompe ou court hors de l'écran.
|
||||||
- **Couleurs** : Vert (Nature).
|
- **Couleurs** : Vert (Nature).
|
||||||
- **Textes** : "Libéré !".
|
- **Textes** : "Libéré !".
|
||||||
- **Formes** : N/A
|
- **Formes** : Bouton danger (rouge) + modal arrondie.
|
||||||
|
|||||||
@@ -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`.
|
Identique à `vente_enchere_bebe.md`.
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
### 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
|
### 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 d’incident pendant vente/transport. |
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -30,64 +37,126 @@ Action joueur.
|
|||||||
Vente ou Expiration.
|
Vente ou Expiration.
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| Parents (si connus) | Arbre généalogique | 100% | Non |
|
||||||
|
| Vendeur | “Certificat d’entretien” | 100% | Non |
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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é |
|
||||||
|
| 15–25°C | Stable | 0 |
|
||||||
|
| > 35°C | Fatigue + | Risque incident +5% si pas de camion climatisé |
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### 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
|
### 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
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
| Période | Activité marché | Impact |
|
||||||
|
|---|---|---|
|
||||||
|
| 18h–22h | Prime time | +10% bids |
|
||||||
|
| Nuit | Faible | -15% bids |
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
| Facteur | Effet sur Taux | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Adulte fertile vendu | Prix x2 | Si fertilité > seuil et pas en cooldown |
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
**Risque** : Si `status == expired` et non récupéré sous 24h -> Mort.
|
**Risque** : Si `status == expired` et non récupéré sous 24h -> Mort.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
| Type Nourriture | Gain Santé | Coût | Préférence |
|
||||||
|
|---|---:|---:|---:|
|
||||||
|
| Rations transport | stable | inclus | 3 |
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
N/A
|
| Action/État | Gain Attractivité | Rayon d'action |
|
||||||
|
|---|---:|---:|
|
||||||
|
| Vente star (rare) | -10% attractivité zoo | Global (zoo vendeur) |
|
||||||
|
|
||||||
### Impact Valeur
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### 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
|
### Trajet Visiteurs
|
||||||
N/A
|
| Trajet | Condition | Effet | Notes |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Consultation marché | ouverture UI | tri | pas de visiteurs physiques |
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### É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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### 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 l’animal." | status expired | 4 |
|
||||||
|
| Error | "Impossible de vendre : animal indisponible." | malade/mort proche | 5 |
|
||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Mise en Vente (Action)
|
### Mise en Vente (Action)
|
||||||
**Description UX** : Le joueur sélectionne un animal adulte sur la grille et choisit "Vendre".
|
**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`.
|
**Événements** : `CREATE_AUCTION_ADULT`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_market_open.mp3` (jingle court).
|
||||||
- **Sons** : `cash_register_open.mp3`.
|
- **Sons** : `cash_register_open.mp3`.
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Icône bourse + badge “adulte”.
|
||||||
- **Images** : Portrait Animal.
|
- **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).
|
- **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".
|
- **Textes** : "Mise à prix".
|
||||||
- **Formes** : N/A
|
- **Formes** : Bottom sheet + cartes.
|
||||||
|
|
||||||
### Retour Invendu (Action)
|
### Retour Invendu (Action)
|
||||||
**Description UX** : L'enchère est finie sans acheteur. Le joueur doit récupérer l'animal.
|
**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`.
|
**Événements** : `RECLAIM_ANIMAL`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_fail_soft.mp3` (jingle court).
|
||||||
- **Sons** : `sad_trombone.mp3` (échec).
|
- **Sons** : `sad_trombone.mp3` (échec).
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Icône retour (flèche).
|
||||||
- **Images** : N/A
|
- **Images** : `icon_reclaim.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `reclaim_return.webm` (1.2s non loop, optionnel).
|
||||||
- **Animations** : Retour visuel de l'animal.
|
- **Animations** : Retour visuel de l'animal.
|
||||||
- **Couleurs** : Gris (Désactivé).
|
- **Couleurs** : Gris (Désactivé).
|
||||||
- **Textes** : "Invendu".
|
- **Textes** : "Invendu".
|
||||||
- **Formes** : N/A
|
- **Formes** : Bouton primary “Récupérer”.
|
||||||
|
|||||||
@@ -29,7 +29,10 @@ Processus de vente spécifique pour les bébés animaux nés dans le zoo.
|
|||||||
"current_bid": "int",
|
"current_bid": "int",
|
||||||
"highest_bidder": "uuid | null",
|
"highest_bidder": "uuid | null",
|
||||||
"end_time": "timestamp",
|
"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) |
|
| Délai Validation | 10 min (fixe) |
|
||||||
|
|
||||||
### Scores Initiaux
|
### 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -50,46 +57,79 @@ Action joueur.
|
|||||||
Vente ou Expiration.
|
Vente ou Expiration.
|
||||||
|
|
||||||
### Hérédité
|
### 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
| Biome / Contexte | Compatibilité | Bonus/Malus |
|
||||||
|
|---|---:|---|
|
||||||
|
| Marché (UI) | 100% | Aucun |
|
||||||
|
| Transport long | 80% | Fatigue + |
|
||||||
|
|
||||||
### Impact Saisons
|
### 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
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
| Période | Activité marché | Impact |
|
||||||
|
|---|---|---|
|
||||||
|
| 18h–22h | Prime time | +15% bids |
|
||||||
|
| Nuit | Faible | -20% bids |
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
| Facteur | Effet sur Taux | Condition |
|
||||||
|
|---|---|---|
|
||||||
|
| Bébé rare vendu | +10 réputation | Si `status` devient `sold` puis finalisé |
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
**Risque** : Si `status == expired` et non récupéré sous 1h -> Mort du bébé.
|
**Risque** : Si `status == expired` et non récupéré sous 1h -> Mort du bébé.
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
| Type Nourriture | Gain Santé | Coût | Préférence |
|
||||||
|
|---|---:|---:|---:|
|
||||||
|
| Lait / soin | Stabilise | inclus | 5 |
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### 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
|
### Impact Valeur
|
||||||
**Dépréciation** : Aucune (c'est une enchère).
|
**Dépréciation** : Aucune (c'est une enchère).
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### 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
|
### Trajet Visiteurs
|
||||||
N/A
|
| Trajet | Condition | Effet | Notes |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Consultation acheteurs | ouverture marché | tri par visibilité | pas de visiteurs physiques |
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
@@ -99,11 +139,28 @@ N/A
|
|||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### Messages d'Infos / Alerte
|
||||||
| ID | Niveau | Message |
|
| ID | Niveau | Message |
|
||||||
@@ -113,6 +170,15 @@ N/A
|
|||||||
|
|
||||||
# Annexes UX/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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Mise en Vente (Action)
|
### Mise en Vente (Action)
|
||||||
**Description UX** : Le joueur glisse un bébé depuis la nurserie vers le camion.
|
**Description UX** : Le joueur glisse un bébé depuis la nurserie vers le camion.
|
||||||
@@ -123,12 +189,12 @@ N/A
|
|||||||
**Événements** : `CREATE_AUCTION`.
|
**Événements** : `CREATE_AUCTION`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_market_open.mp3` (jingle court).
|
||||||
- **Sons** : `cash_register_open.mp3`.
|
- **Sons** : `cash_register_open.mp3`.
|
||||||
- **Graphiques** : Icône Bourse/Pièce.
|
- **Graphiques** : Icône Bourse/Pièce.
|
||||||
- **Images** : Portrait Bébé.
|
- **Images** : Portrait Bébé.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `auction_sheet_intro.webm` (0.8s non loop, optionnel).
|
||||||
- **Animations** : N/A
|
- **Animations** : Compteur “mise à prix” qui s’incrémente, pulsation du bouton “Valider”.
|
||||||
- **Couleurs** : Or.
|
- **Couleurs** : Or.
|
||||||
- **Textes** : "Prix de départ", "Durée".
|
- **Textes** : "Prix de départ", "Durée".
|
||||||
- **Formes** : Champs de saisie.
|
- **Formes** : Champs de saisie.
|
||||||
@@ -142,12 +208,12 @@ N/A
|
|||||||
**Événements** : `OPEN_MY_SALES`.
|
**Événements** : `OPEN_MY_SALES`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ui_market_list.mp3` (jingle discret optionnel).
|
||||||
- **Sons** : `notification.mp3` (si offre reçue).
|
- **Sons** : `notification.mp3` (si offre reçue).
|
||||||
- **Graphiques** : N/A
|
- **Graphiques** : Icône cloche + badge compteur.
|
||||||
- **Images** : N/A
|
- **Images** : `icon_hourglass.png`, `icon_bid.png`.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : `bid_badge_pulse.webm` (0.6s loop, optionnel).
|
||||||
- **Animations** : N/A
|
- **Animations** : Badge qui pulse sur nouvelle offre.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Ambre (#F39C12) en attente validation, Vert (#2ECC71) vendu.
|
||||||
- **Textes** : "Meilleure offre : X".
|
- **Textes** : "Meilleure offre : X".
|
||||||
- **Formes** : N/A
|
- **Formes** : Pills (badges), cartes liste.
|
||||||
|
|||||||
@@ -23,7 +23,10 @@ Une ville est une entité sur la Carte du Monde qui génère le flux de visiteur
|
|||||||
"type": "city",
|
"type": "city",
|
||||||
"name": "string",
|
"name": "string",
|
||||||
"population": "integer",
|
"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 |
|
| Richesse | 1.0 |
|
||||||
|
|
||||||
### Scores Initiaux
|
### Scores Initiaux
|
||||||
N/A
|
**Niveau de Bonheur** : 50% (Influence la fréquence des visites).
|
||||||
|
|
||||||
## 2. Cycles de Vie et Apparition
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
Génération carte.
|
Génération carte.
|
||||||
|
|
||||||
### Conditions de Disparition
|
### Conditions de Disparition
|
||||||
N/A
|
**Désastre** : Ville détruite (Event rare "Météorite" ou "Crise Éco").
|
||||||
|
|
||||||
### Hérédité
|
### Hérédité
|
||||||
N/A
|
**Jumelage** : Bonus permanent de flux (+5%) si relation max atteinte avec une ville.
|
||||||
|
|
||||||
## 3. Impacts Environnementaux
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### Impact Température
|
||||||
N/A
|
**Ilot de chaleur** : La ville est toujours +2°C par rapport à la campagne environnante.
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### Impact Milieu (Biome)
|
||||||
N/A
|
**Architecture** : Adaptée au biome (Igloos en Toundra, Tentes en Désert, Gratte-ciels en Plaine).
|
||||||
|
|
||||||
### Impact Saisons
|
### Impact Saisons
|
||||||
N/A
|
**Festivals** : Event saisonnier en ville (+Visiteurs pendant 24h).
|
||||||
|
- Été : Carnaval.
|
||||||
|
- Hiver : Marché de Noël.
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
### Impact Heure / Jour-Nuit
|
||||||
N/A
|
**Lumières** : La ville brille la nuit (Pollution lumineuse visible).
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
N/A
|
**Baby Boom** : Augmente la population de la ville (+Flux) pendant 1 semaine.
|
||||||
|
|
||||||
### Impact Mort
|
### Impact Mort
|
||||||
N/A
|
**Épidémie** : Baisse population temporaire (-Flux).
|
||||||
|
|
||||||
### Impact Nourriture
|
### Impact Nourriture
|
||||||
N/A
|
**Marché** : La ville vend de la nourriture au joueur (Source d'approvisionnement).
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
### Impact Attractivité (Visiteurs/Animaux)
|
||||||
Source du flux. `Flux = Pop * (AttractivitéZoo / Distance²)`.
|
Source du flux. `Flux = Pop * (AttractivitéZoo / Distance²)`.
|
||||||
|
|
||||||
### Impact Valeur
|
### Impact Valeur
|
||||||
N/A
|
**PIB** : Influence le budget des visiteurs (Richesse). Une ville riche envoie des VIP.
|
||||||
|
|
||||||
## 5. Impacts Logistiques et Économiques
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
**Facteur Richesse** : Multiplie le budget des visiteurs issus de cette ville.
|
**Facteur Richesse** : Multiplie le budget des visiteurs issus de cette ville.
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
Point de départ.
|
Point de départ. Les visiteurs arrivent en bus/voiture depuis la ville.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
N/A
|
* **Fête Nationale** : Flux x2.
|
||||||
|
* **Grève** : Flux / 2.
|
||||||
|
|
||||||
## 7. Progression
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Visualisation Taille (Passif)
|
### Visualisation Taille (Passif)
|
||||||
**Description UX** : Distinguer les grandes villes des petites.
|
**Description UX** : Distinguer les grandes villes des petites.
|
||||||
**Description UI** : Taille de l'icône proportionnelle à la population. Gratte-ciels vs Maisons.
|
**Description UI** : Taille de l'icône proportionnelle à la population. Gratte-ciels vs Maisons.
|
||||||
**Emplacement** : Carte Monde.
|
**Emplacement** : Carte Monde.
|
||||||
**Intégration** : Sprite.
|
**Intégration** : Sprite.
|
||||||
**Navigation** : N/A
|
**Navigation** : Zoom sur la carte.
|
||||||
**Événements** : N/A
|
**Événements** : `MAP_ZOOM`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Ambiance urbaine (klaxons lointains, vent).
|
||||||
- **Sons** : N/A
|
- **Sons** : Bruit de trafic faible.
|
||||||
- **Graphiques** : Sprites Ville (Petit, Moyen, Grand).
|
- **Graphiques** : Sprites Ville (Petit, Moyen, Grand).
|
||||||
- **Images** : N/A
|
- **Images** : Silhouette Skyline.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Lumières des fenêtres qui s'allument la nuit (Pixel Art animé).
|
||||||
- **Animations** : N/A
|
- **Animations** : Fumée des cheminées.
|
||||||
- **Couleurs** : Gris/Bleu.
|
- **Couleurs** : Gris/Bleu.
|
||||||
- **Textes** : Nom Ville.
|
- **Textes** : Nom Ville.
|
||||||
- **Formes** : N/A
|
- **Formes** : Cercle d'influence (zone de chalandise).
|
||||||
|
|||||||
506
docs/specs/vip.md
Normal file
506
docs/specs/vip.md
Normal 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 d’accè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 d’analytics) |
|
||||||
|
| 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 n’affecte 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 |
|
||||||
@@ -1,228 +1,416 @@
|
|||||||
# Spécifications : Visiteur
|
# Spécifications : Visiteur
|
||||||
|
|
||||||
## Définition
|
## 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
|
## Fonctions
|
||||||
- **Apparition** : Arrive par la Billeterie (venant d'une Ville).
|
| Fonction | Description | Entrées | Sorties |
|
||||||
- **Déplacement** : Se promène sur la grille, attiré par les animaux et boutiques.
|
|---|---|---|---|
|
||||||
- **Durée** : Reste jusqu'à 1 journée (variable selon attractivité).
|
| Visite | Parcours le zoo pour observer les animaux. | Attractivité, Chemin | Satisfaction, Temps |
|
||||||
- **Dépense** : Paie l'entrée + achats en boutique.
|
| 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
|
## Icone de base
|
||||||
- **Besoins** : Soif, Repos (banc), Propreté (poubelle), Envie de photo.
|
Silhouette humaine simplifiée, couleur variable selon le type (Standard, VIP, Enfant).
|
||||||
- **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).
|
|
||||||
|
|
||||||
## Types
|
## Interactions
|
||||||
- **Standard**
|
| Acteur A | Action | Acteur B | Résultat |
|
||||||
- **Luxe** (8%) : Paie plus cher, plus exigeant.
|
|---|---|---|---|
|
||||||
|
| 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
|
### 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" }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Caractéristiques Initiales
|
#### Caractéristiques Initiales
|
||||||
| Caractéristique | Standard | Luxe (VIP) |
|
| Caractéristique | Valeur Initiale | Type | Description |
|
||||||
| :--- | :--- | :--- |
|
|---|---|---|---|
|
||||||
| Budget | 50 | 200 |
|
| Budget | 50 - 200 | Entier | Argent total disponible pour la visite. |
|
||||||
| Durée Max | 300s (5 min) | 600s (10 min) |
|
| Endurance | 100 | Entier | Capacité à marcher avant de devoir se reposer. |
|
||||||
| Satisfaction | 50 | 50 |
|
| Vitesse Marche | 1.0 | Float | Vitesse de déplacement de base (cases/sec). |
|
||||||
|
|
||||||
### Scores Initiaux
|
#### Scores Initiaux
|
||||||
N/A
|
| 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
|
### 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
|
||||||
| Facteur | Taux |
|
|
||||||
| :--- | :--- |
|
|
||||||
| Attractivité Zoo | `log(Attractivité) * FacteurVille` |
|
|
||||||
| Heure | Pic à 14h, Nul à 22h |
|
|
||||||
|
|
||||||
### Conditions de Disparition
|
#### Conditions d'Apparition
|
||||||
| Cause | Seuil |
|
| Condition | Seuil | Opérateur | Résultat |
|
||||||
| :--- | :--- |
|
|---|---|---|---|
|
||||||
| Temps écoulé | Durée > Max Duration |
|
| Zoo Ouvert | Vrai | Est | Le générateur de visiteurs est actif. |
|
||||||
| Insatisfaction | Satisfaction <= 0 |
|
| Attractivité | > 0 | Est | Probabilité d'apparition > 0. |
|
||||||
| Budget épuisé | Budget <= 0 (Départ normal) |
|
| Capacité Zoo | < Max | Est | Un nouveau visiteur peut entrer. |
|
||||||
|
|
||||||
### Hérédité
|
#### Conditions de Disparition
|
||||||
N/A
|
| 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
|
#### Hérédité
|
||||||
### Impact Température
|
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|
||||||
| Météo | Effet |
|
|---|---|---|---|
|
||||||
| :--- | :--- |
|
| Groupe (Famille) | Type (VIP/Standard) | 100% | Non (Le groupe est homogène) |
|
||||||
| Canicule | Soif augmente 2x plus vite |
|
| Groupe (Famille) | Vitesse | Moyenne du groupe | Non |
|
||||||
| Pluie | Satisfaction baisse plus vite (sauf si abri) |
|
|
||||||
|
|
||||||
### Impact Milieu (Biome)
|
### 3. Impacts Environnementaux
|
||||||
N/A
|
|
||||||
|
|
||||||
### Impact Saisons
|
#### Impact Température
|
||||||
| Saison | Affluence (Multiplicateur) |
|
| Plage Température | Effet sur l'entité | Bonus/Malus |
|
||||||
| :--- | :--- |
|
|---|---|---|
|
||||||
| Printemps | x1.0 |
|
| > 30°C (Chaud) | Soif augmente plus vite | +50% Vitesse Soif |
|
||||||
| Été | x1.5 (Vacances) |
|
| < 5°C (Froid) | Endurance baisse plus vite | +20% Fatigue |
|
||||||
| Automne | x0.8 |
|
| 20°C (Idéal) | Satisfaction stable | Bonus passif +1/min |
|
||||||
| Hiver | x0.6 |
|
|
||||||
|
|
||||||
### Impact Heure / Jour-Nuit
|
#### Impact Milieu (Biome)
|
||||||
| Heure | Flux Entrant |
|
| Biome | Compatibilité | Bonus/Malus |
|
||||||
| :--- | :--- |
|
|---|---|---|
|
||||||
| 08h-10h | Faible |
|
| Asphalte (Allée) | 100% | Vitesse normale |
|
||||||
| 10h-16h | Fort |
|
| Sable | 50% | Vitesse -30% (Marche difficile) |
|
||||||
| 16h-18h | Décroissant |
|
| Herbe | 80% | Satisfaction +5% (Cadre agréable) |
|
||||||
| > 18h | Nul |
|
| Boue | 20% | Satisfaction -10% (Salissant) |
|
||||||
|
|
||||||
## 4. Impacts Biologiques et Sociaux
|
#### Impact Saisons
|
||||||
### Impact Reproduction
|
| Saison | Effet | Modificateur |
|
||||||
N/A
|
|---|---|---|
|
||||||
|
| É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
|
#### Impact Heure / Jour-Nuit
|
||||||
| Événement | Effet Satisfaction |
|
| Période | Activité | Visibilité |
|
||||||
| :--- | :--- |
|
|---|---|---|
|
||||||
| Voir animal mort | -50 (Départ quasi immédiat) |
|
| 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
|
### 4. Impacts Biologiques et Sociaux
|
||||||
N/A (Concerne les animaux, ici c'est "Soif/Faim visiteur" -> Boutiques)
|
|
||||||
|
|
||||||
### Impact Attractivité (Visiteurs/Animaux)
|
#### Impact Reproduction
|
||||||
| Cible | Poids Attraction |
|
| Facteur | Effet sur Taux | Condition |
|
||||||
| :--- | :--- |
|
|---|---|---|
|
||||||
| Animal Légendaire | 100 |
|
| Saison des Amours (Animaux) | +10% Satisfaction | Si des bébés sont visibles |
|
||||||
| Animal Commun | 10 |
|
| Présence Enfants | +20% Vente Ballons | Si le visiteur est accompagné d'enfants |
|
||||||
| Boutique | 50 (si besoin > 50) |
|
|
||||||
|
|
||||||
### Impact Valeur
|
#### Impact Mort
|
||||||
N/A
|
| 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
|
#### Impact Nourriture
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
| Type Nourriture | Gain Santé | Coût | Préférence |
|
||||||
| Paramètre | Valeur |
|
|---|---|---|---|
|
||||||
| :--- | :--- |
|
| Burger | Faim -50 | 12$ | 4/5 (Populaire) |
|
||||||
| Vitesse Marche | 1 case / 2 sec |
|
| Salade | Faim -30 | 10$ | 2/5 (Niche) |
|
||||||
|
| Glace | Soif -10, Satisfaction +5 | 5$ | 5/5 (Été) |
|
||||||
|
|
||||||
### Dépenses (Boutiques/Visiteurs)
|
#### Impact Attractivité Visiteurs
|
||||||
| Action | Dépense |
|
| Action/État | Gain Attractivité | Rayon d'action |
|
||||||
| :--- | :--- |
|
|---|---|---|
|
||||||
| Ticket Entrée | 10 (Standard) / 50 (VIP) |
|
| Foule heureuse | +5 (Ambiance) | 10m |
|
||||||
| Boutique Souvenir | 15-30 |
|
| Foule en colère | -10 (Mauvaise ambiance) | 15m |
|
||||||
| Boisson | 5 |
|
| Vomissement | -20 (Dégoût) | 5m |
|
||||||
|
|
||||||
### Trajet Visiteurs
|
#### Impact Attractivité Animaux
|
||||||
**Algorithme** : `Weighted Random Walk` vers les points d'intérêt (POI) avec decay sur la distance.
|
| 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
|
#### Impact Valeur
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
| Facteur | Variation Prix | Condition |
|
||||||
* **Incident (Bulle)** : Apparition aléatoire (probabilité augmentée si attente joueur).
|
|---|---|---|
|
||||||
* **Achat** : Interaction avec boutique.
|
| Visiteur VIP | Dépense x2 | Si satisfait |
|
||||||
|
| Visiteur Radin | Dépense x0.5 | Toujours |
|
||||||
|
|
||||||
## 7. Progression
|
### 5. Impacts Logistiques et Économiques
|
||||||
### Tableau des Upgrades
|
|
||||||
N/A
|
|
||||||
|
|
||||||
## 8. Logique et Interfaces
|
#### Vitesse (Camion)
|
||||||
### Pseudo-code Impacts
|
| Type Route | Vitesse Max | Consommation |
|
||||||
```
|
|---|---|---|
|
||||||
function updateVisitor(visitor):
|
| Navette Visiteurs | 40 km/h | 15 L/100 |
|
||||||
visitor.satisfaction -= decayRate
|
|
||||||
visitor.needs.thirst += 1
|
|
||||||
|
|
||||||
if visitor.needs.thirst > 80:
|
#### Vitesse (Nurserie)
|
||||||
target = findNearestShop()
|
| Action | Durée de base | Réduction par Upgrade |
|
||||||
if not target:
|
|---|---|---|
|
||||||
visitor.satisfaction -= 5 (Frustration)
|
| Soin Visiteur (Infirmerie) | 15 min | -20% (Médecin expert) |
|
||||||
spawnIncident("Soif")
|
|
||||||
|
|
||||||
if visitor.satisfaction <= 0:
|
#### Vitesse (Accueil)
|
||||||
leaveZoo(visitor)
|
| Flux | Visiteurs/Minute | Capacité Max |
|
||||||
```
|
|---|---|---|
|
||||||
|
| Guichet Manuel | 2 | 10 (File d'attente) |
|
||||||
|
| Portique Auto | 10 | 50 (File d'attente) |
|
||||||
|
|
||||||
### Messages d'Infos / Alerte
|
#### Vitesse (Recherche)
|
||||||
| ID | Niveau | Message |
|
| Projet | Durée (Jours) | Coût Accélération |
|
||||||
| :--- | :--- | :--- |
|
|---|---|---|
|
||||||
| `VISITOR_ANGRY` | Info | "Un visiteur est parti mécontent." |
|
| Étude Comportementale | 5 jours | 2000$ |
|
||||||
| `VISITOR_HAPPY` | Info | "Un visiteur a adoré le zoo !" |
|
|
||||||
|
|
||||||
# Annexes UX/UI
|
#### Vitesse (Labo)
|
||||||
|
| Analyse | Durée | Fiabilité |
|
||||||
|
|---|---|---|
|
||||||
|
| Sondage Satisfaction | 24h | +/- 5% Marge erreur |
|
||||||
|
|
||||||
## 1. Expérience Utilisateur (UX)
|
#### Vitesse (Visite)
|
||||||
### Visite (Passif)
|
| Zone | Temps Moyen | Facteur Ralentissement |
|
||||||
**Description UX** : Le visiteur entre, marche, regarde les animaux, achète, repart.
|
|---|---|---|
|
||||||
**Description UI** : Petit sprite humain. Vêtements colorés.
|
| Enclos Grand | 10 min | Si animal visible |
|
||||||
**Emplacement** : Grille Zoo.
|
| Enclos Petit | 2 min | Si animal caché |
|
||||||
**Intégration** : Foule.
|
| Boutique | 5 min | Si file d'attente |
|
||||||
**Navigation** : N/A
|
|
||||||
**Événements** : `VISITOR_WALK`.
|
|
||||||
|
|
||||||
#### Assets
|
#### Dépenses (Billeterie)
|
||||||
- **Musiques** : N/A
|
| Poste | Coût Hebdo | Maintenance |
|
||||||
- **Sons** : Pas sur l'herbe/béton.
|
|---|---|---|
|
||||||
- **Graphiques** : Sprites variés (H/F/Enfant).
|
| Impression Tickets | 100$ | 10$ |
|
||||||
- **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
|
|
||||||
|
|
||||||
### Incident / Besoin (Action)
|
#### Dépenses (Boutiques)
|
||||||
**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).
|
| Article | Coût Achat | Marge |
|
||||||
**Description UI** : Bulle blanche avec icône noire. Clignote si urgent.
|
|---|---|---|
|
||||||
**Emplacement** : Au-dessus du sprite visiteur.
|
| Souvenirs | 5$ | 300% (Vendu 20$) |
|
||||||
**Intégration** : Overlay World Space.
|
| Nourriture | 2$ | 400% (Vendu 10$) |
|
||||||
**Navigation** : Clic Bulle -> Résolution (Animation + Gain).
|
|
||||||
**Événements** : `INCIDENT_SPAWN`, `INCIDENT_SOLVE`.
|
|
||||||
|
|
||||||
#### Assets
|
#### Dépenses (Visiteurs)
|
||||||
- **Musiques** : N/A
|
| Type Dépense | Montant Moyen | Fréquence |
|
||||||
- **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).
|
| Entrée | 20$ | 1 fois |
|
||||||
- **Images** : N/A
|
| Restauration | 15$ | 1 fois |
|
||||||
- **Vidéos** : N/A
|
| Cadeaux | 30$ | 0.5 fois (1 sur 2) |
|
||||||
- **Animations** : Bulle qui pop. Visiteur qui sourit après résolution.
|
|
||||||
- **Couleurs** : Bulle Blanche/Rouge (Urgent).
|
|
||||||
- **Textes** : "Merci !" (flottant).
|
|
||||||
- **Formes** : Bulle BD.
|
|
||||||
|
|
||||||
### Départ (Passif)
|
#### Dépenses (Employés)
|
||||||
**Description UX** : Le visiteur quitte le zoo.
|
| Rôle | Salaire | Prime |
|
||||||
**Description UI** : Marche vers la sortie et disparaît (Fade out).
|
|---|---|---|
|
||||||
**Emplacement** : Billeterie.
|
| Agent Accueil | 1500$ | Aucune |
|
||||||
**Intégration** : Fin cycle.
|
| Animateur | 1800$ | +50$ par show réussi |
|
||||||
**Navigation** : N/A
|
|
||||||
**Événements** : `VISITOR_EXIT`.
|
|
||||||
|
|
||||||
#### Assets
|
#### Dépenses (Nurseries)
|
||||||
- **Musiques** : N/A
|
| Soin | Coût Matériel | Coût Personnel |
|
||||||
- **Sons** : N/A
|
|---|---|---|
|
||||||
- **Graphiques** : N/A
|
| Pansement (Bobo) | 2$ | 10$ (Temps infirmier) |
|
||||||
- **Images** : N/A
|
|
||||||
- **Vidéos** : N/A
|
#### Dépenses (Nourriture)
|
||||||
- **Animations** : Fade out.
|
| Type | Prix/Kg | Fournisseur |
|
||||||
- **Couleurs** : N/A
|
|---|---|---|
|
||||||
- **Textes** : N/A
|
| Stock Restaurant | 500$ / palette | MetroZoo |
|
||||||
- **Formes** : N/A
|
|
||||||
|
#### 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 d’un 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 |
|
||||||
|
|||||||
@@ -4,7 +4,10 @@
|
|||||||
Représentation d'un zoo (joueur ou bot) sur la Carte du Monde.
|
Représentation d'un zoo (joueur ou bot) sur la Carte du Monde.
|
||||||
|
|
||||||
## Affichage
|
## 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** : 🏠
|
- **Icône** : 🏠
|
||||||
- **Slot d'offre** :
|
- **Slot d'offre** :
|
||||||
- Pour les autres zoos : Affiche l'œuf/bébé/animal en vente (Type + Prix).
|
- 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",
|
"attractiveness": "int",
|
||||||
"reproduction": "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 |
|
| Reproduction | 0 |
|
||||||
|
|
||||||
### Scores Initiaux
|
### 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
|
## 2. Cycles de Vie et Apparition
|
||||||
### Conditions d'Apparition
|
### Conditions d'Apparition
|
||||||
@@ -53,84 +66,144 @@ Création compte.
|
|||||||
Suppression compte.
|
Suppression compte.
|
||||||
|
|
||||||
### Hérédité
|
### 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
|
## 3. Impacts Environnementaux
|
||||||
### Impact Température
|
### 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)
|
### 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
|
### 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
|
### 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
|
## 4. Impacts Biologiques et Sociaux
|
||||||
### Impact Reproduction
|
### Impact Reproduction
|
||||||
Score visible publiquement.
|
Score visible publiquement.
|
||||||
|
|
||||||
### Impact Mort
|
### 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
|
### 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)
|
### 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
|
### 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
|
## 5. Impacts Logistiques et Économiques
|
||||||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
### 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)
|
### Dépenses (Boutiques/Visiteurs)
|
||||||
N/A
|
**Maintenance** : 10 pièces / jour par bâtiment construit (Coûts fixes).
|
||||||
|
|
||||||
### Trajet Visiteurs
|
### Trajet Visiteurs
|
||||||
Destination possible.
|
Destination possible. Algorithme de *Pathfinding* (A*) depuis l'entrée vers les Enclos et Boutiques.
|
||||||
|
|
||||||
## 6. Événements
|
## 6. Événements
|
||||||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||||||
* **Nouvelle Offre** : Mise en vente.
|
* **Nouvelle Offre** : Mise en vente.
|
||||||
* **Vente** : Offre achetée.
|
* **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
|
## 7. Progression
|
||||||
### Tableau des Upgrades
|
### 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
|
## 8. Logique et Interfaces
|
||||||
### Pseudo-code Impacts
|
### 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
|
### 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
|
# 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)
|
## 1. Expérience Utilisateur (UX)
|
||||||
### Visualisation Offre (Passif)
|
### Visualisation Offre (Passif)
|
||||||
**Description UX** : Voir ce que vend un autre joueur.
|
**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.
|
**Description UI** : Une "bulle" ou un "panneau" accroché sous l'icône du zoo. Affiche l'animal (sprite) et le prix.
|
||||||
**Emplacement** : Carte Monde.
|
**Emplacement** : Carte Monde.
|
||||||
**Intégration** : World Space UI.
|
**Intégration** : World Space UI.
|
||||||
**Navigation** : N/A
|
**Navigation** : Clic sur Bulle -> Détails Offre.
|
||||||
**Événements** : `OFFER_UPDATE`.
|
**Événements** : `OFFER_UPDATE`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : `ambience_zoo_busy.mp3` (bruit de fond léger).
|
||||||
- **Sons** : N/A
|
- **Sons** : `ui_hover.mp3`.
|
||||||
- **Graphiques** : Cadre Offre.
|
- **Graphiques** : Cadre Offre (Bois/Or).
|
||||||
- **Images** : Sprite Animal.
|
- **Images** : Sprite Animal.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Animal qui bouge (GIF/WebM).
|
||||||
- **Animations** : Prix qui clignote si bas.
|
- **Animations** : Prix qui clignote si bas.
|
||||||
- **Couleurs** : Or (Prix).
|
- **Couleurs** : Or (Prix), Vert (Rareté).
|
||||||
- **Textes** : "500".
|
- **Textes** : "500".
|
||||||
- **Formes** : Bulle.
|
- **Formes** : Bulle BD.
|
||||||
|
|
||||||
### Interaction Achat (Action)
|
### Interaction Achat (Action)
|
||||||
**Description UX** : Acheter l'animal.
|
**Description UX** : Acheter l'animal.
|
||||||
@@ -142,12 +215,12 @@ N/A
|
|||||||
**Événements** : `DRAG_OFFER`.
|
**Événements** : `DRAG_OFFER`.
|
||||||
|
|
||||||
#### Assets
|
#### Assets
|
||||||
- **Musiques** : N/A
|
- **Musiques** : Jingle `purchase_success.mp3`.
|
||||||
- **Sons** : `pickup.mp3`.
|
- **Sons** : `pickup.mp3`, `coin_register.mp3`.
|
||||||
- **Graphiques** : Fantôme offre sous curseur.
|
- **Graphiques** : Fantôme offre sous curseur.
|
||||||
- **Images** : N/A
|
- **Images** : Icône Pièce animée.
|
||||||
- **Vidéos** : N/A
|
- **Vidéos** : Effet de transaction (flux de données).
|
||||||
- **Animations** : N/A
|
- **Animations** : Traînée d'étincelles lors du drag.
|
||||||
- **Couleurs** : N/A
|
- **Couleurs** : Jaune brillant.
|
||||||
- **Textes** : N/A
|
- **Textes** : "-500".
|
||||||
- **Formes** : N/A
|
- **Formes** : Curseur Main fermée.
|
||||||
|
|||||||
2
package-lock.json
generated
2
package-lock.json
generated
@@ -260,7 +260,6 @@
|
|||||||
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
|
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"acorn": "bin/acorn"
|
"acorn": "bin/acorn"
|
||||||
},
|
},
|
||||||
@@ -469,7 +468,6 @@
|
|||||||
"integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==",
|
"integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/eslint-utils": "^4.8.0",
|
"@eslint-community/eslint-utils": "^4.8.0",
|
||||||
"@eslint-community/regexpp": "^4.12.1",
|
"@eslint-community/regexpp": "^4.12.1",
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "eslint web/js server --ignore-pattern '**/node_modules/**'",
|
"lint": "eslint web/js server --ignore-pattern '**/node_modules/**'",
|
||||||
"lint:web": "eslint web/js",
|
"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": {
|
"devDependencies": {
|
||||||
"eslint": "^9.15.0",
|
"eslint": "^9.15.0",
|
||||||
|
|||||||
227
server/db-core.js
Normal file
227
server/db-core.js
Normal 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
267
server/db-sales.js
Normal 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;
|
||||||
|
}
|
||||||
516
server/db.js
516
server/db.js
@@ -1,489 +1,29 @@
|
|||||||
import pg from "pg";
|
export {
|
||||||
import parse from "pg-connection-string";
|
pool,
|
||||||
import { createInitialBotState } from "./bot-state.js";
|
getMapParams,
|
||||||
|
getAccountByPublicKey,
|
||||||
|
createAccount,
|
||||||
|
updateLastSeen,
|
||||||
|
getZooByAccountId,
|
||||||
|
getAllZoos,
|
||||||
|
createZoo,
|
||||||
|
getZooById,
|
||||||
|
updateZooGameState,
|
||||||
|
countPlayerZoos,
|
||||||
|
createBotZoo,
|
||||||
|
getBotZoosForTick,
|
||||||
|
updateBotZooState,
|
||||||
|
} from "./db-core.js";
|
||||||
|
|
||||||
const { Pool } = pg;
|
export {
|
||||||
|
createSaleListing,
|
||||||
const connectionString = process.env.DATABASE_URL || "postgres://localhost/builazoo";
|
getSaleListingById,
|
||||||
const parsed = parse(connectionString);
|
getActiveSaleListings,
|
||||||
const poolConfig = {
|
getSalesForZoo,
|
||||||
host: parsed.host || "localhost",
|
placeBid,
|
||||||
port: Number(parsed.port) || 5432,
|
acceptSale,
|
||||||
database: parsed.database || "builazoo",
|
processValidatedSales,
|
||||||
user: parsed.user,
|
rejectSale,
|
||||||
password: typeof parsed.password === "string" ? parsed.password : "",
|
markSaleDelivered,
|
||||||
};
|
expireSaleListings,
|
||||||
if (process.env.PGPASSWORD !== undefined && process.env.PGPASSWORD !== null) poolConfig.password = String(process.env.PGPASSWORD);
|
} from "./db-sales.js";
|
||||||
|
|
||||||
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 };
|
|
||||||
|
|||||||
@@ -17,6 +17,35 @@ import { verifySignature, buildSignMessage, hashBody } from "../auth.js";
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
const TIMESTAMP_TOLERANCE_MS = 5 * 60 * 1000;
|
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() {
|
function requireSignature() {
|
||||||
return (req, res, next) => {
|
return (req, res, next) => {
|
||||||
const publicKey = req.headers["x-public-key"];
|
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" });
|
res.status(401).json({ error: "Missing X-Public-Key, X-Signature, or X-Timestamp" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const now = Date.now();
|
if (!isTimestampValid(timestamp)) {
|
||||||
const ts = new Date(timestamp).getTime();
|
|
||||||
if (Number.isNaN(ts) || Math.abs(now - ts) > TIMESTAMP_TOLERANCE_MS) {
|
|
||||||
res.status(401).json({ error: "Invalid or expired timestamp" });
|
res.status(401).json({ error: "Invalid or expired timestamp" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const body = req.bodyRaw !== undefined && req.bodyRaw !== null ? req.bodyRaw : "";
|
if (!isSignatureValid(req, publicKey, signature, timestamp)) {
|
||||||
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)) {
|
|
||||||
res.status(401).json({ error: "Invalid signature" });
|
res.status(401).json({ error: "Invalid signature" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -60,17 +83,7 @@ function optionalSignature() {
|
|||||||
next();
|
next();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const now = Date.now();
|
if (!isTimestampValid(timestamp) || !isSignatureValid(req, publicKey, signature, timestamp)) {
|
||||||
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)) {
|
|
||||||
next();
|
next();
|
||||||
return;
|
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.
|
||||||
router.get("/", optionalSignature(), async (req, res, next) => {
|
* @param {import("express").Request} req
|
||||||
try {
|
* @returns {Promise<{ active: Array<object> } | { asSeller: Array<object>, asBuyerUndelivered: Array<object>, active: Array<object> }>}
|
||||||
|
*/
|
||||||
|
async function getSalesResponse(req) {
|
||||||
await expireSaleListings();
|
await expireSaleListings();
|
||||||
if (req.account) {
|
if (!req.account) {
|
||||||
|
const active = await getActiveSaleListings();
|
||||||
|
return { active };
|
||||||
|
}
|
||||||
await processValidatedSales();
|
await processValidatedSales();
|
||||||
const zoo = await getZooByAccountId(req.account.id);
|
const zoo = await getZooByAccountId(req.account.id);
|
||||||
if (!zoo) {
|
if (!zoo) {
|
||||||
res.json({ asSeller: [], asBuyerUndelivered: [], active: await getActiveSaleListings() });
|
return { asSeller: [], asBuyerUndelivered: [], active: await getActiveSaleListings() };
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
const data = await getSalesForZoo(zoo.id);
|
return getSalesForZoo(zoo.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
router.get("/", optionalSignature(), async (req, res, next) => {
|
||||||
|
try {
|
||||||
|
const data = await getSalesResponse(req);
|
||||||
res.json(data);
|
res.json(data);
|
||||||
return;
|
|
||||||
}
|
|
||||||
const active = await getActiveSaleListings();
|
|
||||||
res.json({ active });
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
next(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? }. */
|
/** POST /api/sales — create listing (auth). Body: { animalId, isBaby, price, endAt, reproductionScoreAtSale? }. */
|
||||||
router.post("/", requireSignature(), async (req, res, next) => {
|
router.post("/", requireSignature(), async (req, res, next) => {
|
||||||
try {
|
try {
|
||||||
@@ -111,32 +158,18 @@ router.post("/", requireSignature(), async (req, res, next) => {
|
|||||||
res.status(404).json({ error: "No zoo for this account" });
|
res.status(404).json({ error: "No zoo for this account" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { animalId, isBaby, price, endAt, reproductionScoreAtSale } = req.body ?? {};
|
const parsed = parseCreateListingBody(req.body);
|
||||||
if (typeof animalId !== "string" || !animalId.trim()) {
|
if (!parsed.ok) {
|
||||||
res.status(400).json({ error: "animalId required" });
|
res.status(parsed.status).json({ error: parsed.error });
|
||||||
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)" });
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { id } = await createSaleListing({
|
const { id } = await createSaleListing({
|
||||||
sellerZooId: zoo.id,
|
sellerZooId: zoo.id,
|
||||||
animalId: animalId.trim(),
|
animalId: parsed.animalId,
|
||||||
isBaby,
|
isBaby: parsed.isBaby,
|
||||||
initialPrice,
|
initialPrice: parsed.initialPrice,
|
||||||
endAt: endAtDate.toISOString(),
|
endAt: parsed.endAtDate.toISOString(),
|
||||||
reproductionScoreAtSale: reproductionScoreAtSale != null ? Number(reproductionScoreAtSale) : undefined,
|
reproductionScoreAtSale: parsed.reproductionScoreAtSale,
|
||||||
});
|
});
|
||||||
res.status(201).json({ id });
|
res.status(201).json({ id });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -15,6 +15,23 @@ import { verifySignature, buildSignMessage, hashBody } from "../auth.js";
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
const TIMESTAMP_TOLERANCE_MS = 5 * 60 * 1000;
|
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() {
|
function requireSignature() {
|
||||||
return (req, res, next) => {
|
return (req, res, next) => {
|
||||||
const publicKey = req.headers["x-public-key"];
|
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" });
|
res.status(401).json({ error: "Missing X-Public-Key, X-Signature, or X-Timestamp" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const now = Date.now();
|
if (!isTimestampValid(timestamp)) {
|
||||||
const ts = new Date(timestamp).getTime();
|
|
||||||
if (Number.isNaN(ts) || Math.abs(now - ts) > TIMESTAMP_TOLERANCE_MS) {
|
|
||||||
res.status(401).json({ error: "Invalid or expired timestamp" });
|
res.status(401).json({ error: "Invalid or expired timestamp" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const body = req.bodyRaw !== undefined && req.bodyRaw !== null ? req.bodyRaw : "";
|
if (!isSignatureValid(req, publicKey, signature, timestamp)) {
|
||||||
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)) {
|
|
||||||
res.status(401).json({ error: "Invalid signature" });
|
res.status(401).json({ error: "Invalid signature" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -49,9 +60,9 @@ function requireSignature() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/** GET /api/zoos — list zoos for map (no auth). Ensures minZoos with bots. */
|
/** @returns {Promise<{ zoos: Array<object>, mapWidth: number, mapHeight: number }>}
|
||||||
router.get("/", async (req, res, next) => {
|
*/
|
||||||
try {
|
async function getZoosForMap() {
|
||||||
const params = await getMapParams();
|
const params = await getMapParams();
|
||||||
let zoos = await getAllZoos();
|
let zoos = await getAllZoos();
|
||||||
await countPlayerZoos();
|
await countPlayerZoos();
|
||||||
@@ -63,6 +74,17 @@ router.get("/", async (req, res, next) => {
|
|||||||
await createBotZoo(x, y, weights);
|
await createBotZoo(x, y, weights);
|
||||||
}
|
}
|
||||||
if (need > 0) zoos = await getAllZoos();
|
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 { zoos, mapWidth, mapHeight } = await getZoosForMap();
|
||||||
const worldZoos = zoos.map((z) => ({
|
const worldZoos = zoos.map((z) => ({
|
||||||
id: z.id,
|
id: z.id,
|
||||||
name: z.name,
|
name: z.name,
|
||||||
@@ -71,7 +93,7 @@ router.get("/", async (req, res, next) => {
|
|||||||
animalWeights: z.animal_weights,
|
animalWeights: z.animal_weights,
|
||||||
game_state: z.game_state ?? null,
|
game_state: z.game_state ?? null,
|
||||||
}));
|
}));
|
||||||
res.json({ worldZoos, mapWidth: params.mapWidth, mapHeight: params.mapHeight });
|
res.json({ worldZoos, mapWidth, mapHeight });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
next(e);
|
next(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1374,6 +1374,30 @@ body.bg-phase-night.bg-weather-rain { background: linear-gradient(160deg, #080a0
|
|||||||
font-weight: 600;
|
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 {
|
.cell .cell-emoji {
|
||||||
font-size: 1.4rem;
|
font-size: 1.4rem;
|
||||||
display: block;
|
display: block;
|
||||||
@@ -1445,6 +1469,18 @@ body.bg-phase-night.bg-weather-rain { background: linear-gradient(160deg, #080a0
|
|||||||
min-height: 0;
|
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 */
|
/* Bulles d'aide */
|
||||||
.help-wrap {
|
.help-wrap {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|||||||
101
web/js/animal-visual-state.js
Normal file
101
web/js/animal-visual-state.js
Normal 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 };
|
||||||
|
}
|
||||||
@@ -8,16 +8,14 @@ export const BIOMES = ["Meadow", "Freshwater", "Ocean", "Forest", "Mountain"];
|
|||||||
/**
|
/**
|
||||||
* Base biome from grid position (5 zones by column).
|
* Base biome from grid position (5 zones by column).
|
||||||
* @param {number} width
|
* @param {number} width
|
||||||
* @param {number} height
|
* @param {number} _height
|
||||||
* @param {number} x 1-based column
|
* @param {number} x 1-based column
|
||||||
* @param {number} y 1-based row
|
* @param {number} _y 1-based row
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
export function getCellBiome(width, height, x, y) {
|
export function getCellBiome(width, _height, x, _y) {
|
||||||
const w = Math.max(1, width);
|
const w = Math.max(1, width);
|
||||||
const h = Math.max(1, height);
|
|
||||||
const col = Math.max(1, Math.min(w, Math.floor(x)));
|
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 t = Math.floor((col - 1) / (w / 5));
|
||||||
const index = Math.min(4, Math.max(0, t));
|
const index = Math.min(4, Math.max(0, t));
|
||||||
return BIOMES[index] ?? "Meadow";
|
return BIOMES[index] ?? "Meadow";
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user