@swrpg-online/monte-carlo
Version:
A library for performing Monte Carlo simulations with the Star Wars RPG narrative dice system by Fantasy Flight Games
157 lines (156 loc) • 4.29 kB
TypeScript
import { DicePool } from "@swrpg-online/dice";
import { DiceResult } from "@swrpg-online/dice/dist/types";
export { DicePool };
export interface ModifierConfig {
automaticSuccesses?: number;
automaticFailures?: number;
automaticAdvantages?: number;
automaticThreats?: number;
automaticTriumphs?: number;
automaticDespairs?: number;
automaticLightSide?: number;
automaticDarkSide?: number;
upgradeAbility?: number;
upgradeDifficulty?: number;
downgradeProficiency?: number;
downgradeChallenge?: number;
}
export interface SimulationConfig {
dicePool: DicePool;
iterations?: number;
modifiers?: ModifierConfig;
playerModifiers?: ModifierConfig;
oppositionModifiers?: ModifierConfig;
}
export interface ModifierAnalysis {
automaticSymbolContribution: {
successes: number;
failures: number;
advantages: number;
threats: number;
triumphs: number;
despairs: number;
lightSide: number;
darkSide: number;
};
rolledSymbolContribution: {
successes: number;
failures: number;
advantages: number;
threats: number;
triumphs: number;
despairs: number;
lightSide: number;
darkSide: number;
};
upgradeImpact: {
abilityUpgrades: number;
difficultyUpgrades: number;
proficiencyDowngrades: number;
challengeDowngrades: number;
};
}
export declare class MonteCarloError extends Error {
constructor(message: string);
}
export interface HistogramData {
netSuccesses: {
[key: number]: number;
};
netAdvantages: {
[key: number]: number;
};
triumphs: {
[key: number]: number;
};
despairs: {
[key: number]: number;
};
failures: {
[key: number]: number;
};
threats: {
[key: number]: number;
};
lightSide: {
[key: number]: number;
};
darkSide: {
[key: number]: number;
};
netForce: {
[key: number]: number;
};
}
export interface DistributionAnalysis {
skewness: number;
kurtosis: number;
outliers: number[];
modes: number[];
percentiles: {
[key: number]: number;
};
}
export interface MonteCarloResult {
averages: DiceResult;
medians: DiceResult;
standardDeviations: DiceResult;
successProbability: number;
criticalSuccessProbability: number;
criticalFailureProbability: number;
netPositiveProbability: number;
forceStatistics: {
averageNetForce: number;
medianNetForce: number;
standardDeviationNetForce: number;
maxForcePipsProbability: number;
};
histogram: HistogramData;
analysis: {
netSuccesses: DistributionAnalysis;
netAdvantages: DistributionAnalysis;
triumphs: DistributionAnalysis;
despairs: DistributionAnalysis;
lightSide: DistributionAnalysis;
darkSide: DistributionAnalysis;
netForce: DistributionAnalysis;
};
modifierAnalysis?: ModifierAnalysis;
}
export declare class MonteCarlo {
private readonly dicePool;
private readonly iterations;
private readonly modifiers?;
private readonly config?;
private histogram;
private maxForcePips;
private hasForceDice;
private static readonly MIN_ITERATIONS;
private static readonly MAX_ITERATIONS;
private statsCache;
private modifierStats;
private runningStats;
private results;
constructor(dicePoolOrConfig: DicePool | SimulationConfig, iterations?: number, runSimulate?: boolean);
private isSimulationConfig;
private mergeModifiers;
private applyModifiers;
private validateDicePool;
private validateIterations;
private calculateHistogramStats;
private calculateSkewness;
private calculateKurtosis;
private findOutliers;
private analyzeDistribution;
private average;
private standardDeviation;
private resetRunningStats;
private resetModifierStats;
private trackModifierContribution;
private updateHistogram;
simulate(): MonteCarloResult;
private resetHistogram;
private calculateMedianFromHistogram;
private findModes;
private calculatePercentiles;
}