feat: progressive Level-Kurve + atomarer /auth/progress-Vertrag
- levelForEp/levelInfo (Level 1 bei 20 EP statt fixer 500/Level), src/lib/leveling.js - /auth/me liefert level + ep_into_level + ep_to_next_level - /auth/progress liefert prev_level, streak_increased, daily_ep, daily_goal_ep, goal_just_reached (CTE fängt die Pre-Update-Werte, damit Level-Up/Streak-Up atomar erkennbar sind) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
30
src/lib/leveling.js
Normal file
30
src/lib/leveling.js
Normal file
@@ -0,0 +1,30 @@
|
||||
// Progressive Level-Kurve — Single Source of Truth fürs Backend.
|
||||
// Kumulative EP, die für Level n nötig sind: 5·n·(n+3).
|
||||
// Level 1 → 20 EP, Level 2 → 50, Level 3 → 90, Level 4 → 140, Level 5 → 200 …
|
||||
// Früh schnelle Level (erste Level fallen in der ersten Session), danach sanft steiler.
|
||||
function epForLevel(level) {
|
||||
if (level <= 0) return 0;
|
||||
return 5 * level * (level + 3);
|
||||
}
|
||||
|
||||
// Höchstes n mit 5n²+15n ≤ ep → n ≤ (−15 + √(225 + 20·ep)) / 10
|
||||
function levelForEp(ep) {
|
||||
const e = Math.max(0, ep || 0);
|
||||
return Math.floor((-15 + Math.sqrt(225 + 20 * e)) / 10);
|
||||
}
|
||||
|
||||
// Level + Fortschritt innerhalb des Levels (für Momentum-Anzeige im Client).
|
||||
function levelInfo(ep) {
|
||||
const e = Math.max(0, ep || 0);
|
||||
const level = levelForEp(e);
|
||||
const base = epForLevel(level);
|
||||
const next = epForLevel(level + 1);
|
||||
return {
|
||||
level,
|
||||
ep_into_level: e - base,
|
||||
ep_to_next_level: next - e,
|
||||
ep_for_next_level: next - base,
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = { epForLevel, levelForEp, levelInfo };
|
||||
Reference in New Issue
Block a user