feat: VANITY d6-pool rule-pack

This commit is contained in:
2026-07-20 16:22:13 +01:00
parent 605b107c77
commit 95833bd2c1
3 changed files with 70 additions and 1 deletions
+2 -1
View File
@@ -1,7 +1,8 @@
import { yearZero } from './year-zero.js';
import { cocD100 } from './coc-d100.js';
import { vanityD6 } from './vanity-d6.js';
const packs = new Map([[yearZero.id, yearZero], [cocD100.id, cocD100]]);
const packs = new Map([[yearZero.id, yearZero], [cocD100.id, cocD100], [vanityD6.id, vanityD6]]);
export function getRulePack(id) { return packs.get(id) || null; }
export function registerRulePack(pack) { packs.set(pack.id, pack); }
+31
View File
@@ -0,0 +1,31 @@
// VANITY (Draft 13) core roll: 5-6 = Success; Stumble = 0 successes with 2+ ones.
export const vanityD6 = {
id: 'vanity-d6',
label: 'd6 Pool (VANITY)',
params: [{ key: 'difficulty', label: 'Successes needed', default: 1 }],
interpret(results, params = {}) {
let successes = 0, ones = 0;
for (const r of results) {
if (r.value >= 5) successes += 1;
if (r.value === 1) ones += 1;
}
const difficulty = params.difficulty ?? 1;
const isSuccess = successes >= difficulty;
return {
successes,
ones,
difficulty,
isSuccess,
stumble: successes === 0 && ones >= 2,
twist: ones >= 1,
style: successes > difficulty,
canPush: true,
};
},
summary(v) {
const base = `${v.successes} success${v.successes === 1 ? '' : 'es'}`;
const verdict = v.isSuccess ? '' : ' — fail';
const stumble = v.stumble ? ' · STUMBLE (+1 Bane)' : (v.twist ? ' · a 1 (GM twist)' : '');
return `${base}${verdict}${stumble}`;
},
};