Fortuna
A TypeScript module for random events and gacha (random sampling with weights).
Install / Use
/learn @retraigo/FortunaREADME
Fortuna
The quick solution for everything random!
A Gacha-like system to roll random items with weights.
Usage
More weight = more common. Think of it as in terms of probability.
// Deno
import { GachaMachine } from "https://deno.land/x/fortuna/mod.ts"
// JSR
import { GachaMachine } from "jsr:@nekooftheabyss/fortuna@4.2.0"
// Node
import { GachaMachine } from "@nekooftheabyss/fortuna"
// esm.sh
import { GachaMachine } from "https://esm.sh/jsr/@nekooftheabyss/fortuna@4.2.0"
const items = [
{ result: "SSR cool character", chance: 1 },
{ result: "Kinda rare character", chance: 3 },
{ result: "Mob character #1", chance: 5 },
{ result: "Mob character #2", chance: 5 },
{ result: "Mob character #3", chance: 5 },
]
const machine = new GachaMachine(items)
machine.get(10) // Rolls 10x
/*
My result:
[
"Kinda rare character",
"Mob character #1",
"Mob character #3",
"Mob character #3",
"Mob character #1",
"Kinda rare character",
"Mob character #2",
"Mob character #2" ,
"Mob character #1",
"Mob character #2"
]
*/
Rolling distinct elements
You can roll distinct elements using the LimitedGachaMachine. It is slower
than GachaMachine but there shouldn't be much noticeable difference.
The "distinct" behavior only applies to within a single .get() call. It
doesn't affect the pool of items used when initializing new LimitedGachaMachine().
import { LimitedGachaMachine } from "https://deno.land/x/fortuna/mod.ts"
// JSR
import { LimitedGachaMachine } from "jsr:@nekooftheabyss/fortuna@4.2.0"
const items = [
{ result: "SSR cool character", chance: 1 },
{ result: "Kinda rare character", chance: 3 },
{ result: "Mob character #1", chance: 5 },
{ result: "Mob character #2", chance: 5 },
{ result: "Mob character #3", chance: 5 },
]
const machine = new LimitedGachaMachine(items)
machine.get(4) // Rolls 4x
/*
My result:
[
"Kinda rare character",
"Mob character #1",
"Mob character #3",
"Mob character #2",
]
*/
Plain weighted random selection
You probably don't need all complicated stuff. Here's a quick way to just create a simple weight-based gacha system: (Only works on v3.0.1 and above)
import { roll } from "jsr:@nekooftheabyss/fortuna@4.2.0/roll"; // wherever you are importing from.
const items = [
{ result: "SSR cool character", chance: 1 },
{ result: "Kinda rare character", chance: 3 },
{ result: "Mob character #1", chance: 5 },
{ result: "Mob character #2", chance: 5 },
{ result: "Mob character #3", chance: 5 },
];
roll(items); // Rolls one item from the list of items using linear search.
You can also provide two individual arrays for choices and weights.
import { roll } from "jsr:@nekooftheabyss/fortuna@4.2.0/roll"; // wherever you are importing from.
const items = [
"SSR cool character",
"Kinda rare character",
"Mob character #1",
"Mob character #2",
"Mob character #3",
];
const chances = [1, 3, 5, 5, 5];
roll(items, chances); // Rolls one item from the list of items using linear search.
Providing the total chance may result in faster rolls.
import { roll } from "jsr:@nekooftheabyss/fortuna@4.2.0/roll"; // wherever you are importing from.
const items = [
{ result: "SSR cool character", chance: 1 },
{ result: "Kinda rare character", chance: 3 },
{ result: "Mob character #1", chance: 5 },
{ result: "Mob character #2", chance: 5 },
{ result: "Mob character #3", chance: 5 },
];
roll(items, 19); // Rolls one item from the list of items using linear search.
import { roll } from "jsr:@nekooftheabyss/fortuna@4.2.0/roll"; // wherever you are importing from.
const items = [
"SSR cool character",
"Kinda rare character",
"Mob character #1",
"Mob character #2",
"Mob character #3",
];
const chances = [1, 3, 5, 5, 5];
roll(items, chances, 19); // Rolls one item from the list of items using linear search.
Documentation
Documentation for the latest version can be found in jsr:@nekooftheabyss/fortuna
Related Skills
node-connect
349.7kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
109.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
Writing Hookify Rules
109.7kThis skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
review-duplication
100.4kUse this skill during code reviews to proactively investigate the codebase for duplicated functionality, reinvented wheels, or failure to reuse existing project best practices and shared utilities.
