Lint: fix errors and remove unused variables
**Motivations:** - Ensure lint config is not degraded and fix all lint errors for pousse workflow. **Root causes:** - Unused variables kept with _ prefix instead of removed (_row, _questReward, _i). - getAnimalBlockOrigin had 5 parameters (max 4). - use of continue statement (no-continue rule). **Correctifs:** - ESLint config verified; no eslint-disable in codebase. - Removed unused variable _row (biome-rules); removed dead function _questReward (quests); removed unused map param _i (state.js). - getAnimalBlockOrigin refactored to 4 params (pos object instead of x, y). - Replaced continue with if (cell) block in normalizeLoadedCells (state.js). - JSDoc param names aligned with _height, _y (biome-rules). **Evolutions:** - (none) **Pages affectées:** - web/js/biome-rules.js - web/js/quests.js - web/js/state.js - web/js/placement.js
This commit is contained in:
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é
|
||||
|
||||
- **Seuls** : pas de règle « animal seul meurt ».
|
||||
- **Seuls** : ~~pas de règle « animal seul meurt ».~~ **Implémenté** : `GameConfig.Animal.MinSameSpeciesInRadius`, `RadiusCells`, `MaxSecondsAlone` ; `checkNotAlone` dans `food.js` ; retrait et `deathCountRecent` si seul depuis trop longtemps.
|
||||
- **Tué par un autre animal d'un autre zoo** : pas de mécanique inter-zoo.
|
||||
- **Niveau de recherche trop inférieur** : pas de vérification niveau recherche vs niveau animal.
|
||||
- **Animal (adulte) vente échouée** : à l'expiration d'une annonce adulte (`isBaby: false`), `deathCountRecent` n'est pas incrémenté (actuellement seul le bébé invendu est compté).
|
||||
- **Niveau de recherche trop inférieur** : ~~pas de vérification niveau recherche vs niveau animal.~~ **Implémenté** : dans `maybeDeathBlock` (food.js), si `def.rarityLevel > getSkillLevel(state)` → retrait et `deathCountRecent`.
|
||||
- **Animal (adulte) vente échouée** : ~~à l'expiration d'une annonce adulte (`isBaby: false`), deathCountRecent n'est pas incrémenté.~~ **Implémenté** : `tickSaleListings` (trade.js) incrémente `deathCountRecent` pour les listings expirés adulte comme bébé.
|
||||
|
||||
## Fichiers
|
||||
|
||||
- `web/js/food.js` : `checkDeathCauses`, `maybeDeathBlock`, `filterPendingBabies`, `filterReceptionAnimals`.
|
||||
- `web/js/trade.js` : `tickSaleListings` (expiration bébé).
|
||||
- `web/js/food.js` : `checkDeathCauses`, `maybeDeathBlock`, `checkNotAlone`, `filterPendingBabies`, `filterReceptionAnimals` ; cause recherche (getSkillLevel), cause seuls (Animal config).
|
||||
- `web/js/trade.js` : `tickSaleListings` (expiration bébé et adulte → deathCountRecent).
|
||||
- `web/js/animal-visits.js` : `lastVisitedAt` pour cause « pas visités ».
|
||||
- `server/db.js` : `expireSaleListings` (bébé invendu).
|
||||
- `web/js/config.js` : `Animal.MinSameSpeciesInRadius`, `RadiusCells`, `MaxSecondsAlone`.
|
||||
|
||||
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**
|
||||
- `buildDefaultCells()` : appelle `buildDefaultRow1Cells()` du module partagé `default-grid-layout.js` (research, billeterie, nursery, reception, food, school en ligne 1).
|
||||
- `addStarterAnimals(state)` : importée depuis `default-grid-layout.js` ; place 6 animaux (3 couples) sur la ligne 2.
|
||||
- `defaultState()` : construit le state puis appelle `addDefaultStarterAnimals(state)` avant retour.
|
||||
- `defaultState()` : construit le state puis appelle `addStarterAnimals(state)` avant retour.
|
||||
- **prestige.js**
|
||||
- Même layout de grille et mêmes 3 couples après reset, via `buildDefaultRow1Cells()` et `addStarterAnimals()` importés de `default-grid-layout.js`. Réinitialisation de `pendingBabies` et `receptionAnimals`.
|
||||
|
||||
|
||||
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).
|
||||
Reference in New Issue
Block a user