feat(renown): add the Renown power-curve table and reputation-rank resolver

This commit is contained in:
Bastian Wagner
2026-08-21 08:42:29 +02:00
parent e14f6dcbce
commit 88b98aa605
4 changed files with 116 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
import { RENOWN_BASE_STATS, RENOWN_MAX, RENOWN_MIN } from './renown-base-stats';
describe('RENOWN_BASE_STATS', () => {
it('spans exactly Renown 1 through 15', () => {
expect(RENOWN_MIN).toBe(1);
expect(RENOWN_MAX).toBe(15);
expect(Object.keys(RENOWN_BASE_STATS).map(Number).sort((a, b) => a - b)).toEqual(
Array.from({ length: 15 }, (_, i) => i + 1),
);
});
it('matches the exact V1 reference table from spec §4', () => {
expect(RENOWN_BASE_STATS[1]).toEqual({ baseHp: 100, baseAttack: 6 });
expect(RENOWN_BASE_STATS[5]).toEqual({ baseHp: 114, baseAttack: 8 });
expect(RENOWN_BASE_STATS[10]).toEqual({ baseHp: 132, baseAttack: 10 });
expect(RENOWN_BASE_STATS[15]).toEqual({ baseHp: 148, baseAttack: 12 });
});
it('is monotonically non-decreasing in both stats as Renown increases', () => {
for (let renown = 2; renown <= 15; renown += 1) {
expect(RENOWN_BASE_STATS[renown].baseHp).toBeGreaterThanOrEqual(
RENOWN_BASE_STATS[renown - 1].baseHp,
);
expect(RENOWN_BASE_STATS[renown].baseAttack).toBeGreaterThanOrEqual(
RENOWN_BASE_STATS[renown - 1].baseAttack,
);
}
});
});

View File

@@ -0,0 +1,24 @@
export const RENOWN_MIN = 1;
export const RENOWN_MAX = 15;
// Verbatim from Playable Slice 0.6.5 spec §4. Distributes the old Level 1-7
// total base-stat progression (100 HP / 6 Attack -> 148 HP / 12 Attack)
// across Renown 1-15. RenownService looks this up on every milestone
// completion; it is never incremented, only reassigned by rank (design R2).
export const RENOWN_BASE_STATS: Record<number, { baseHp: number; baseAttack: number }> = {
1: { baseHp: 100, baseAttack: 6 },
2: { baseHp: 104, baseAttack: 6 },
3: { baseHp: 107, baseAttack: 7 },
4: { baseHp: 111, baseAttack: 7 },
5: { baseHp: 114, baseAttack: 8 },
6: { baseHp: 118, baseAttack: 8 },
7: { baseHp: 121, baseAttack: 9 },
8: { baseHp: 125, baseAttack: 9 },
9: { baseHp: 128, baseAttack: 9 },
10: { baseHp: 132, baseAttack: 10 },
11: { baseHp: 135, baseAttack: 10 },
12: { baseHp: 139, baseAttack: 11 },
13: { baseHp: 142, baseAttack: 11 },
14: { baseHp: 145, baseAttack: 11 },
15: { baseHp: 148, baseAttack: 12 },
};