Initial commit

**Motivations:**
- Initialisation du versionning git pour le projet

**Root causes:**
- N/A (Nouveau projet)

**Correctifs:**
- N/A

**Evolutions:**
- Structure initiale du projet
- Ajout du .gitignore

**Pages affectées:**
- Tous les fichiers
This commit is contained in:
2026-03-03 22:24:17 +01:00
commit e031c9a1d2
155 changed files with 22334 additions and 0 deletions

306
web/js/economy.js Normal file
View File

@@ -0,0 +1,306 @@
import { GameConfig } from "./config.js";
/**
* @param {number} baseCost
* @param {number} growth
* @param {number} level
* @returns {number}
*/
export function exponentialCost(baseCost, growth, level) {
const exponent = Math.max(0, level - 1);
return Math.floor(baseCost * Math.pow(growth, exponent) + 0.5);
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getConveyorUpgradeCost(currentLevel) {
return exponentialCost(
GameConfig.Conveyor.BaseUpgradeCost,
GameConfig.Conveyor.UpgradeGrowth,
currentLevel
);
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getTruckUpgradeCost(currentLevel) {
return exponentialCost(
GameConfig.Truck.BaseUpgradeCost,
GameConfig.Truck.UpgradeGrowth,
currentLevel
);
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getSchoolUpgradeCost(currentLevel) {
return exponentialCost(
GameConfig.School.BaseUpgradeCost,
GameConfig.School.UpgradeGrowth,
currentLevel
);
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getWorldMapUpgradeCost(currentLevel) {
const cfg = GameConfig.WorldMap && GameConfig.WorldMap.MapUpgrade;
if (!cfg) return 9999;
return exponentialCost(cfg.BaseUpgradeCost, cfg.UpgradeGrowth, currentLevel);
}
/**
* Research points required to upgrade world map level (phase 9: agrandissement en unités de recherche).
* @param {number} currentLevel
* @returns {number}
*/
export function getWorldMapUpgradeResearchCost(currentLevel) {
const cfg = GameConfig.WorldMap && GameConfig.WorldMap.MapUpgrade;
if (!cfg || cfg.BaseResearchCost === null || cfg.BaseResearchCost === undefined) return 9999;
const growth = cfg.ResearchUpgradeGrowth ?? 1.6;
return exponentialCost(cfg.BaseResearchCost, growth, currentLevel);
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getPlotUpgradeCost(currentLevel) {
return exponentialCost(
GameConfig.Plot.BaseUpgradeCost,
GameConfig.Plot.UpgradeGrowth,
currentLevel
);
}
/**
* @returns {number}
*/
export function getNurseryBuildCost() {
return GameConfig.Nursery?.BuildCost ?? 200;
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getNurseryUpgradeCost(currentLevel) {
const cfg = GameConfig.Nursery;
if (!cfg) return 9999;
return exponentialCost(cfg.BaseUpgradeCost, cfg.UpgradeGrowth, currentLevel);
}
/**
* @returns {number}
*/
export function getSouvenirShopBuildCost() {
return GameConfig.SouvenirShop?.BuildCost ?? 250;
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getSouvenirShopUpgradeCost(currentLevel) {
const cfg = GameConfig.SouvenirShop;
if (!cfg) return 9999;
return exponentialCost(cfg.BaseUpgradeCost, cfg.UpgradeGrowth, currentLevel);
}
/**
* @returns {number}
*/
export function getResearchBuildCost() {
return GameConfig.Research?.BuildCost ?? 300;
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getResearchUpgradeCost(currentLevel) {
const cfg = GameConfig.Research;
if (!cfg) return 9999;
return exponentialCost(cfg.BaseUpgradeCost, cfg.UpgradeGrowth, currentLevel);
}
/**
* @returns {number}
*/
export function getBilleterieBuildCost() {
return GameConfig.Billeterie?.BuildCost ?? 280;
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getBilleterieUpgradeCost(currentLevel) {
const cfg = GameConfig.Billeterie;
if (!cfg) return 9999;
return exponentialCost(cfg.BaseUpgradeCost, cfg.UpgradeGrowth, currentLevel);
}
/**
* @returns {number}
*/
export function getFoodBuildCost() {
return GameConfig.Food?.BuildCost ?? 260;
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getFoodUpgradeCost(currentLevel) {
const cfg = GameConfig.Food;
if (!cfg) return 9999;
return exponentialCost(cfg.BaseUpgradeCost, cfg.UpgradeGrowth, currentLevel);
}
/**
* @returns {number}
*/
export function getReceptionBuildCost() {
return GameConfig.Reception?.BuildCost ?? 240;
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getReceptionUpgradeCost(currentLevel) {
const cfg = GameConfig.Reception;
if (!cfg) return 9999;
return exponentialCost(cfg.BaseUpgradeCost, cfg.UpgradeGrowth, currentLevel);
}
/**
* @returns {number}
*/
export function getBiomeChangeColorBuildCost() {
return GameConfig.BiomeChangeColor?.BuildCost ?? 340;
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getBiomeChangeColorUpgradeCost(currentLevel) {
const cfg = GameConfig.BiomeChangeColor;
if (!cfg) return 9999;
return exponentialCost(cfg.BaseUpgradeCost, cfg.UpgradeGrowth, currentLevel);
}
/**
* @returns {number}
*/
export function getBiomeChangeTempBuildCost() {
return GameConfig.BiomeChangeTemp?.BuildCost ?? 340;
}
/**
* @param {number} currentLevel
* @returns {number}
*/
export function getBiomeChangeTempUpgradeCost(currentLevel) {
const cfg = GameConfig.BiomeChangeTemp;
if (!cfg) return 9999;
return exponentialCost(cfg.BaseUpgradeCost, cfg.UpgradeGrowth, currentLevel);
}
/** Building kinds that use the same build/upgrade pattern (7 levels). */
export const BUILDING_KINDS = [
"research",
"billeterie",
"food",
"reception",
"biomeChangeColor",
"biomeChangeTemp",
];
/**
* @param {typeof BUILDING_KINDS[number]} kind
* @returns {number}
*/
export function getBuildingBuildCost(kind) {
switch (kind) {
case "research":
return getResearchBuildCost();
case "billeterie":
return getBilleterieBuildCost();
case "food":
return getFoodBuildCost();
case "reception":
return getReceptionBuildCost();
case "biomeChangeColor":
return getBiomeChangeColorBuildCost();
case "biomeChangeTemp":
return getBiomeChangeTempBuildCost();
default:
return 9999;
}
}
/**
* @param {typeof BUILDING_KINDS[number]} kind
* @param {number} currentLevel
* @returns {number}
*/
export function getBuildingUpgradeCost(kind, currentLevel) {
switch (kind) {
case "research":
return getResearchUpgradeCost(currentLevel);
case "billeterie":
return getBilleterieUpgradeCost(currentLevel);
case "food":
return getFoodUpgradeCost(currentLevel);
case "reception":
return getReceptionUpgradeCost(currentLevel);
case "biomeChangeColor":
return getBiomeChangeColorUpgradeCost(currentLevel);
case "biomeChangeTemp":
return getBiomeChangeTempUpgradeCost(currentLevel);
default:
return 9999;
}
}
/**
* @param {typeof BUILDING_KINDS[number]} kind
* @returns {number}
*/
export function getBuildingMaxLevel(kind) {
const key = kind.charAt(0).toUpperCase() + kind.slice(1);
const cfg = GameConfig[key];
return cfg?.MaxLevel ?? 7;
}
/**
* @param {number} level
* @returns {number}
*/
export function getLevelMultiplier(level) {
const current = level ?? 1;
return 1 + 0.1 * Math.max(0, current - 1);
}
/**
* @param {number} baseIncomePerSecond
* @param {number} level
* @param {number} mutationMultiplier
* @param {number} sellFactor
* @returns {number}
*/
export function getSellValue(baseIncomePerSecond, level, mutationMultiplier, sellFactor) {
const levelMult = getLevelMultiplier(level);
return Math.floor(baseIncomePerSecond * mutationMultiplier * levelMult * sellFactor + 0.5);
}