Curva de XP por nível com presets matemáticos, expressões customizadas e simulação.
xpBalance#
Define a curva de XP que rege o avanço de nível do jogador (ou de qualquer entidade que tenha progressão). Suporta presets matemáticos comuns (linear, exponencial, soft-cap, plateau) ou expressões customizadas pra fórmulas únicas.
Por que importa#
A curva de XP é uma das decisões de design mais difíceis de iterar sem ferramenta — você muda o growth de 1.15 pra 1.20 e precisa simular 100 níveis na cabeça. Aqui o app gera a curva, mostra cumulative value, average step, plateaus, picks de balanceamento. Editar é trivial.
E como o resultado vira BalancePoint[] (array de {level, value}), outras tabelas/skills/itens podem referenciar essa curva pra escalar valores junto.
Onde costuma viver#
- Página de tipo
📈 Balanceamento de XP. Esse é o caminho principal. - Página de
👤 Personagens(vem como addon recomendado, junto com Profile).
Singleton — 1 curva por página.
Schema#
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
idSim | string | ID interno. | |
nameSim | string | Nome amigável (ex.: Curva de XP do Herói). | |
modeSim | "preset" | "advanced" | preset: usa um dos 7 templates. advanced: você escreve a expressão. | |
presetSim | "linear" | "exponential" | "tiered" | "softCap" | "hardCap" | "diminishingReturns" | "piecewise" | Qual preset, quando mode=preset. | |
expressionSim | string | Expressão matemática quando mode=advanced. Suporta level, operadores básicos, pow(), min(), max(). | |
startLevelSim | number | Primeiro nível da curva (geralmente 1). | |
endLevelSim | number | Último nível. | |
decimalsSim | number | Casas decimais ao arredondar valores gerados. | |
clampMin | number | Piso mínimo absoluto (opcional). | |
clampMax | number | Teto máximo absoluto (opcional). | |
paramsSim | BalanceFormulaParams | Parâmetros do preset (base, growth, offset, tierStep, etc.). | |
profile | "rpg" | "idle" | "roguelite" | "casual" | Perfil de gênero — pré-configura defaults razoáveis ao trocar. | |
comparisonBaseline | BalancePoint[] | Curva de comparação (ex.: do jogo anterior do estúdio) renderizada por trás da curva atual no gráfico. | |
simulationInput | BalanceSimulationInput | Inputs pra simular tempo até cada nível dado XP/min, win rate, duração de match. | |
target | BalanceTargetInput | Meta pretendida (ex.: jogador chegar no nível 50 em 20h). O painel sugere ajustes pra atingir. |
Os 7 presets#
| Preset | Fórmula |
|---|---|
linear | base + (level − 1) × step |
exponential | base × growth^(level − 1) |
tiered | Linear até tierStep, multiplica por tierMultiplier por tier |
softCap | Cresce normal até capValue, depois cresce devagar |
hardCap | Cresce normal até capValue, depois para |
diminishingReturns | Cresce com retornos decrescentes |
piecewise | Linear com plateau no meio (plateauStartLevel, plateauFactor) |
Exemplo: curva exponencial clássica#
XP do nível N = 100 × 1.15^(N−1), do nível 1 ao 100:
{
"id": "xp-hero",
"name": "Curva de XP do Herói",
"mode": "preset",
"preset": "exponential",
"expression": "",
"startLevel": 1,
"endLevel": 100,
"decimals": 0,
"params": {
"base": 100,
"growth": 1.15,
"offset": 0,
"tierStep": 0,
"tierMultiplier": 1,
"capValue": 0,
"capStrength": 0,
"plateauStartLevel": 0,
"plateauFactor": 1
},
"profile": "rpg"
}
Resultado: nível 1 = 100 XP, nível 10 = 351, nível 50 = 108k, nível 100 = 117M XP. (Provavelmente alto demais — você ajusta growth pra 1.10 ou usa softCap.)
Simulação#
Se você preencher simulationInput, o app calcula automaticamente:
- Minutos por nível — quanto tempo o jogador leva pra subir cada nível dado o input
- Horas até milestones — tempo cumulativo pra chegar nos níveis 10, 25, 50, 100
- Calendar days — útil pra jogos que limitam XP por sessão
Permite responder "o jogador chega no nível 50 em quantos dias se jogar 1h/dia?" sem cálculo manual.
Wizard#
A page type 📈 Balanceamento de XP cria este addon com defaults razoáveis (preset exponential, growth 1.15, levels 1-100). Você ajusta no painel.
Quem aponta pra xpBalance#
craftTable.unlock.level.xpAddonRef— receitas desbloqueadas por nível.skills.unlock.level.xpAddonRef— skills desbloqueadas por nível.progressionTable(indiretamente) — quando suas colunas escalam com nível, frequentemente a curva de referência é uma de XP.