diff --git a/src/common/rpg/components/random.ts b/src/common/rpg/components/random.ts index d5f289f..c20f901 100644 --- a/src/common/rpg/components/random.ts +++ b/src/common/rpg/components/random.ts @@ -1,19 +1,49 @@ -import { type RNGState, SeededRandom } from "@common/random"; +import { type NameOptions, type RNGState, SeededRandom } from "@common/random"; import { Component, World } from "../core/world"; import { component } from "../utils/decorators"; @component -export class Random extends Component<{ random: RNGState }> { +export class Random extends Component<{ random: RNGState }> implements Omit { private rng?: SeededRandom; constructor(random: SeededRandom | string | number | RNGState = Date.now()) { super({ random: (() => { - this.rng = random instanceof SeededRandom ? random : new SeededRandom(random); - return this.rng.getState(); + const rng = random instanceof SeededRandom ? random : new SeededRandom(random); + return rng.getState(); })() }); } + nextFloat(): number { + return this.use((rng) => rng.nextFloat()); + } + nextInt(min: number, max: number): number; + nextInt(max: number): number; + nextInt(minOrMax: number, max?: number): number { + return this.use((rng) => rng.nextInt(minOrMax, max as number)); + } + nextBool(): boolean { + return this.use((rng) => rng.nextBool()); + } + nextName(options?: NameOptions): string { + return this.use((rng) => rng.nextName(options)); + } + choice(iterable: Iterable): T; + choice(iterable: Iterable, k: number): T[]; + choice(iterable: Iterable, k?: number): T | T[] { + return this.use((rng) => rng.choice(iterable, k as number)); + } + weightedChoice(items: readonly T[], weights: readonly number[]): T; + weightedChoice(items: readonly T[], weights: readonly number[], k: number): T[]; + weightedChoice(items: readonly T[], weights: readonly number[], k?: number): T | T[] { + return this.use((rng) => rng.weightedChoice(items, weights, k as number)); + } + shuffle(arr: T[]): T[] { + return this.use((rng) => rng.shuffle(arr)); + } + toShuffled(arr: readonly T[]): T[] { + return this.use((rng) => rng.toShuffled(arr)); + } use(fn: (rng: SeededRandom) => T): T { if (this.rng) {