package com.spaceshipproject; /** * Calcule la taille effective d'un spaceship en fonction de son niveau. * * Regle : * - level 1 = taille de creation * - chaque level-up alterne +1 sur x puis +1 sur z (x en premier) * - tous les 4 level-ups : +1 sur y * - les valeurs sont plafonnees a la taille maximale configuree. */ public final class ShipSizing { private ShipSizing() {} /** Renvoie [sizeX, sizeY, sizeZ] pour le niveau donne. */ public static int[] sizeForLevel(ConfigManager cfg, int level) { if (level < 1) level = 1; int additions = level - 1; int xAdds = (additions + 1) / 2; // ceil(additions / 2) int zAdds = additions / 2; int yAdds = additions / 4; int sx = clamp(cfg.defaultSizeX() + xAdds, cfg.defaultSizeX(), cfg.maxSizeX()); int sy = clamp(cfg.defaultSizeY() + yAdds, cfg.defaultSizeY(), cfg.maxSizeY()); int sz = clamp(cfg.defaultSizeZ() + zAdds, cfg.defaultSizeZ(), cfg.maxSizeZ()); return new int[]{sx, sy, sz}; } /** Niveau a partir duquel toutes les dimensions atteignent leur max. */ public static int maxUsefulLevel(ConfigManager cfg) { int xLevels = (cfg.maxSizeX() - cfg.defaultSizeX()) * 2; // x = ceil(adds/2) int zLevels = (cfg.maxSizeZ() - cfg.defaultSizeZ()) * 2 + 1; // z = floor(adds/2) int yLevels = (cfg.maxSizeY() - cfg.defaultSizeY()) * 4; return 1 + Math.max(Math.max(xLevels, zLevels), yLevels); } private static int clamp(int v, int min, int max) { return Math.max(min, Math.min(max, v)); } }