@betorigami/game-wheel 0.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));let c=require("@betorigami/guard"),l=require("@betorigami/game-engine"),u=require("big.js");u=s(u,1);let d=function(e){return e.LOW_RISK=`LOW_RISK`,e.MEDIUM_RISK=`MEDIUM_RISK`,e.HIGH_RISK=`HIGH_RISK`,e}({}),f=function(e){return e[e.TEN=10]=`TEN`,e[e.TWENTY=20]=`TWENTY`,e[e.THIRTY=30]=`THIRTY`,e[e.FORTY=40]=`FORTY`,e[e.FIFTY=50]=`FIFTY`,e}({});const p=[`ZERO`,`A`,`B`,`C`,`D`,`E`],m=[`LOW_RISK`,`MEDIUM_RISK`,`HIGH_RISK`],h=[10,20,30,40,50],g=m.flatMap(e=>h.map(t=>({riskLevel:e,segments:t}))),_=e=>m.some(t=>t===e),v=e=>h.some(t=>t===e),y=new l.MultiplierContainer(new Map([[1,{LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}}],[2,{LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}}],[3,{LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}}],[4,{LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}}],[8,{LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}}]])),b={LOW_RISK:{10:[`B`,`A`,`A`,`A`,`ZERO`,`A`,`A`,`A`,`A`,`ZERO`],20:[`B`,`A`,`A`,`A`,`ZERO`,`A`,`A`,`A`,`A`,`ZERO`,`B`,`A`,`A`,`A`,`ZERO`,`A`,`A`,`A`,`A`,`ZERO`],30:`B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO`.split(`.`),40:`B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO`.split(`.`),50:`B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO`.split(`.`)},MEDIUM_RISK:{10:[`ZERO`,`B`,`ZERO`,`A`,`ZERO`,`C`,`ZERO`,`A`,`ZERO`,`D`],20:[`A`,`ZERO`,`C`,`ZERO`,`B`,`ZERO`,`C`,`ZERO`,`C`,`ZERO`,`A`,`ZERO`,`C`,`ZERO`,`C`,`ZERO`,`D`,`ZERO`,`C`,`ZERO`],30:`A.ZERO.C.ZERO.A.ZERO.C.ZERO.D.ZERO.B.ZERO.A.ZERO.C.ZERO.A.ZERO.C.ZERO.A.ZERO.C.ZERO.E.ZERO.A.ZERO.C.ZERO`.split(`.`),40:`C.ZERO.A.ZERO.D.ZERO.C.ZERO.A.ZERO.C.ZERO.A.ZERO.D.ZERO.C.ZERO.A.ZERO.B.ZERO.A.ZERO.D.ZERO.C.ZERO.A.ZERO.C.ZERO.A.ZERO.D.ZERO.C.ZERO.A.ZERO`.split(`.`),50:`A.ZERO.B.ZERO.A.ZERO.C.ZERO.A.ZERO.B.ZERO.A.ZERO.B.ZERO.A.ZERO.C.ZERO.A.ZERO.B.ZERO.A.ZERO.B.ZERO.A.ZERO.C.ZERO.A.ZERO.B.ZERO.A.ZERO.B.ZERO.A.ZERO.D.ZERO.A.ZERO.B.ZERO.A.ZERO`.split(`.`)},HIGH_RISK:{10:[...Array(9).fill(`ZERO`),`A`],20:[...Array(19).fill(`ZERO`),`A`],30:[...Array(29).fill(`ZERO`),`A`],40:[...Array(39).fill(`ZERO`),`A`],50:[...Array(49).fill(`ZERO`),`A`]}},x=(e,t)=>b[e][t],S=({riskLevel:e,segments:t})=>{c.Guard.against(!_(e),()=>l.GameError.createValidationError(`Invalid risk level ${String(e)}`)),c.Guard.against(!v(t),()=>l.GameError.createValidationError(`Invalid segments value ${String(t)}`))},C=({riskLevel:e,segments:t})=>b[e][t],w=({riskLevel:e,segments:t},n)=>y.getMultipliers(n)[e][t],T=(e,t)=>{let n=e[t];return c.Guard.againstUndefined(n,`No multiplier found for slot ${t}`),(0,u.default)(n)},E=(e,t)=>{let n=w(e,t);return C(e).map(e=>T(n,e))},D=(e,t)=>{let n=C(e),r=w(e,t),i=new Map;for(let e of n)i.set(e,(i.get(e)??0)+1);return{outcomes:Array.from(i,([e,t])=>({slot:e,multiplier:T(r,e),weight:t})).sort((e,t)=>e.multiplier.cmp(t.multiplier)),totalWeight:n.length}},O=(e,t)=>(t===void 0?g:[t]).map(t=>(0,l.maxMultiplierOf)(D(t,e))).reduce((e,t)=>t.gt(e)?t:e),k=(e,t)=>(0,l.rtpOf)(D(e,t));var A=class extends l.SingleActionGame{constructor(){super(l.OrigamiGame.WHEEL)}get supportedEdgeConfigurations(){return[1,2,3,4,8]}getBetAmount(e){return e.betAmount}describeOutcomes(e,t){return D(e,t)}determineGameResult({generator:e,gameInputs:t,edge:n}){S(t);let r=C(t),i=w(t,n),a=e.getRandomInt({min:0,max:r.length-1}),o=r[a.value];c.Guard.againstUndefined(o,`No slot found at index ${a.value} for ${t.segments} segments`);let s=T(i,o);return{isFinished:!0,payout:{legs:[{amount:t.betAmount.mul(s)}]},payoutMultiplier:s,outputs:{result:a.values},randomValues:a}}};const j={id:l.OrigamiGame.WHEEL,create:()=>new A,suppliesOwnBetAmount:!1};exports.FIXED_PATTERNS=b,exports.WHEEL_RISK_LEVELS=m,exports.WHEEL_SEGMENT_OPTIONS=h,exports.WHEEL_SELECTIONS=g,exports.WHEEL_SLOTS=p,exports.Wheel=A,exports.WheelRiskLevel=d,exports.WheelSegments=f,exports.calculateWheelRtpFraction=k,exports.describeWheelOutcomes=D,exports.getFullWheelPattern=x,exports.getWheelMaxMultiplier=O,exports.getWheelPattern=C,exports.getWheelSegmentMultipliers=E,exports.getWheelSlotMultiplier=T,exports.getWheelSlotValues=w,exports.isWheelRiskLevel=_,exports.isWheelSegments=v,exports.validateWheelSelection=S,exports.wheelDescriptor=j,exports.wheelMultipliers=y;
@@ -0,0 +1,70 @@
1
+ import Big$1, { Big } from "big.js";
2
+ import { DescribesOutcomes, GameDescriptor, GameResult, GetGameResultRequest, MultiplierContainer, Outcome, OutcomeDistribution, SingleActionGame } from "@betorigami/game-engine";
3
+ //#region src/wheel.constants.d.ts
4
+ export declare enum WheelRiskLevel {
5
+ LOW_RISK = "LOW_RISK",
6
+ MEDIUM_RISK = "MEDIUM_RISK",
7
+ HIGH_RISK = "HIGH_RISK"
8
+ }
9
+ export declare enum WheelSegments {
10
+ TEN = 10,
11
+ TWENTY = 20,
12
+ THIRTY = 30,
13
+ FORTY = 40,
14
+ FIFTY = 50
15
+ }
16
+ export declare const WHEEL_SLOTS: readonly ["ZERO", "A", "B", "C", "D", "E"];
17
+ export type WheelSlot = (typeof WHEEL_SLOTS)[number];
18
+ export declare const WHEEL_RISK_LEVELS: readonly WheelRiskLevel[];
19
+ export declare const WHEEL_SEGMENT_OPTIONS: readonly WheelSegments[];
20
+ export type WheelSelection = Readonly<{
21
+ riskLevel: WheelRiskLevel;
22
+ segments: WheelSegments;
23
+ }>;
24
+ export declare const WHEEL_SELECTIONS: readonly WheelSelection[];
25
+ export declare const isWheelRiskLevel: (value: unknown) => value is WheelRiskLevel;
26
+ export declare const isWheelSegments: (value: unknown) => value is WheelSegments;
27
+ //#endregion
28
+ //#region src/wheel.multipliers.d.ts
29
+ type WheelSlotValues = Partial<Record<WheelSlot, number>>;
30
+ export declare const wheelMultipliers: MultiplierContainer<Record<WheelRiskLevel, Record<WheelSegments, Partial<Record<"ZERO" | "A" | "B" | "C" | "D" | "E", number>>>>>;
31
+ //#endregion
32
+ //#region src/wheel.outcomes.d.ts
33
+ export type WheelOutcome = Outcome<WheelSlot>;
34
+ export type WheelOutcomeDistribution = OutcomeDistribution<WheelSlot>;
35
+ export declare const validateWheelSelection: ({ riskLevel, segments }: WheelSelection) => void;
36
+ export declare const getWheelPattern: ({ riskLevel, segments }: WheelSelection) => readonly WheelSlot[];
37
+ export declare const getWheelSlotValues: ({ riskLevel, segments }: WheelSelection, edge: number) => WheelSlotValues;
38
+ export declare const getWheelSlotMultiplier: (slotValues: WheelSlotValues, slot: WheelSlot) => Big$1;
39
+ export declare const getWheelSegmentMultipliers: (selection: WheelSelection, edge: number) => Big$1[];
40
+ export declare const describeWheelOutcomes: (selection: WheelSelection, edge: number) => WheelOutcomeDistribution;
41
+ export declare const getWheelMaxMultiplier: (edge: number, selection?: WheelSelection) => Big$1;
42
+ /**
43
+ * The return to player of a selection as a fraction of the stake, kept exact.
44
+ *
45
+ * @example
46
+ * calculateWheelRtpFraction(selection, 2); // Big('0.98') for a nominal 2% edge, not 98
47
+ * calculateWheelRtpFraction(selection, 2).times(100).toFixed(2); // '98.00', only at the point of display
48
+ */
49
+ export declare const calculateWheelRtpFraction: (selection: WheelSelection, edge: number) => Big$1;
50
+ //#endregion
51
+ //#region src/wheel.d.ts
52
+ export interface WheelGameInputs {
53
+ segments: WheelSegments;
54
+ riskLevel: WheelRiskLevel;
55
+ betAmount: Big;
56
+ }
57
+ export declare class Wheel extends SingleActionGame<WheelGameInputs> implements DescribesOutcomes<WheelSelection, WheelSlot> {
58
+ constructor();
59
+ get supportedEdgeConfigurations(): [number, ...number[]];
60
+ getBetAmount(gameInputs: WheelGameInputs): Big;
61
+ describeOutcomes(selection: WheelSelection, edge: number): WheelOutcomeDistribution;
62
+ protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
63
+ }
64
+ export declare const wheelDescriptor: GameDescriptor<WheelGameInputs>;
65
+ //#endregion
66
+ //#region src/wheel.patterns.d.ts
67
+ export declare const FIXED_PATTERNS: Record<WheelRiskLevel, Record<WheelSegments, readonly WheelSlot[]>>;
68
+ export declare const getFullWheelPattern: (riskLevel: WheelRiskLevel, segment: WheelSegments) => readonly ("ZERO" | "A" | "B" | "C" | "D" | "E")[];
69
+ //#endregion
70
+ export type { WheelSlotValues };
@@ -0,0 +1,70 @@
1
+ import { DescribesOutcomes, GameDescriptor, GameResult, GetGameResultRequest, MultiplierContainer, Outcome, OutcomeDistribution, SingleActionGame } from "@betorigami/game-engine";
2
+ import Big$1, { Big } from "big.js";
3
+ //#region src/wheel.constants.d.ts
4
+ export declare enum WheelRiskLevel {
5
+ LOW_RISK = "LOW_RISK",
6
+ MEDIUM_RISK = "MEDIUM_RISK",
7
+ HIGH_RISK = "HIGH_RISK"
8
+ }
9
+ export declare enum WheelSegments {
10
+ TEN = 10,
11
+ TWENTY = 20,
12
+ THIRTY = 30,
13
+ FORTY = 40,
14
+ FIFTY = 50
15
+ }
16
+ export declare const WHEEL_SLOTS: readonly ["ZERO", "A", "B", "C", "D", "E"];
17
+ export type WheelSlot = (typeof WHEEL_SLOTS)[number];
18
+ export declare const WHEEL_RISK_LEVELS: readonly WheelRiskLevel[];
19
+ export declare const WHEEL_SEGMENT_OPTIONS: readonly WheelSegments[];
20
+ export type WheelSelection = Readonly<{
21
+ riskLevel: WheelRiskLevel;
22
+ segments: WheelSegments;
23
+ }>;
24
+ export declare const WHEEL_SELECTIONS: readonly WheelSelection[];
25
+ export declare const isWheelRiskLevel: (value: unknown) => value is WheelRiskLevel;
26
+ export declare const isWheelSegments: (value: unknown) => value is WheelSegments;
27
+ //#endregion
28
+ //#region src/wheel.multipliers.d.ts
29
+ type WheelSlotValues = Partial<Record<WheelSlot, number>>;
30
+ export declare const wheelMultipliers: MultiplierContainer<Record<WheelRiskLevel, Record<WheelSegments, Partial<Record<"ZERO" | "A" | "B" | "C" | "D" | "E", number>>>>>;
31
+ //#endregion
32
+ //#region src/wheel.outcomes.d.ts
33
+ export type WheelOutcome = Outcome<WheelSlot>;
34
+ export type WheelOutcomeDistribution = OutcomeDistribution<WheelSlot>;
35
+ export declare const validateWheelSelection: ({ riskLevel, segments }: WheelSelection) => void;
36
+ export declare const getWheelPattern: ({ riskLevel, segments }: WheelSelection) => readonly WheelSlot[];
37
+ export declare const getWheelSlotValues: ({ riskLevel, segments }: WheelSelection, edge: number) => WheelSlotValues;
38
+ export declare const getWheelSlotMultiplier: (slotValues: WheelSlotValues, slot: WheelSlot) => Big$1;
39
+ export declare const getWheelSegmentMultipliers: (selection: WheelSelection, edge: number) => Big$1[];
40
+ export declare const describeWheelOutcomes: (selection: WheelSelection, edge: number) => WheelOutcomeDistribution;
41
+ export declare const getWheelMaxMultiplier: (edge: number, selection?: WheelSelection) => Big$1;
42
+ /**
43
+ * The return to player of a selection as a fraction of the stake, kept exact.
44
+ *
45
+ * @example
46
+ * calculateWheelRtpFraction(selection, 2); // Big('0.98') for a nominal 2% edge, not 98
47
+ * calculateWheelRtpFraction(selection, 2).times(100).toFixed(2); // '98.00', only at the point of display
48
+ */
49
+ export declare const calculateWheelRtpFraction: (selection: WheelSelection, edge: number) => Big$1;
50
+ //#endregion
51
+ //#region src/wheel.d.ts
52
+ export interface WheelGameInputs {
53
+ segments: WheelSegments;
54
+ riskLevel: WheelRiskLevel;
55
+ betAmount: Big;
56
+ }
57
+ export declare class Wheel extends SingleActionGame<WheelGameInputs> implements DescribesOutcomes<WheelSelection, WheelSlot> {
58
+ constructor();
59
+ get supportedEdgeConfigurations(): [number, ...number[]];
60
+ getBetAmount(gameInputs: WheelGameInputs): Big;
61
+ describeOutcomes(selection: WheelSelection, edge: number): WheelOutcomeDistribution;
62
+ protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
63
+ }
64
+ export declare const wheelDescriptor: GameDescriptor<WheelGameInputs>;
65
+ //#endregion
66
+ //#region src/wheel.patterns.d.ts
67
+ export declare const FIXED_PATTERNS: Record<WheelRiskLevel, Record<WheelSegments, readonly WheelSlot[]>>;
68
+ export declare const getFullWheelPattern: (riskLevel: WheelRiskLevel, segment: WheelSegments) => readonly ("ZERO" | "A" | "B" | "C" | "D" | "E")[];
69
+ //#endregion
70
+ export type { WheelSlotValues };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{Guard as e}from"@betorigami/guard";import{GameError as t,MultiplierContainer as n,OrigamiGame as r,SingleActionGame as i,maxMultiplierOf as a,rtpOf as o}from"@betorigami/game-engine";import s from"big.js";let c=function(e){return e.LOW_RISK=`LOW_RISK`,e.MEDIUM_RISK=`MEDIUM_RISK`,e.HIGH_RISK=`HIGH_RISK`,e}({}),l=function(e){return e[e.TEN=10]=`TEN`,e[e.TWENTY=20]=`TWENTY`,e[e.THIRTY=30]=`THIRTY`,e[e.FORTY=40]=`FORTY`,e[e.FIFTY=50]=`FIFTY`,e}({});const u=[`ZERO`,`A`,`B`,`C`,`D`,`E`],d=[`LOW_RISK`,`MEDIUM_RISK`,`HIGH_RISK`],f=[10,20,30,40,50],p=d.flatMap(e=>f.map(t=>({riskLevel:e,segments:t}))),m=e=>d.some(t=>t===e),h=e=>f.some(t=>t===e),g=new n(new Map([[1,{LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}}],[2,{LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}}],[3,{LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}}],[4,{LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}}],[8,{LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}}]])),_={LOW_RISK:{10:[`B`,`A`,`A`,`A`,`ZERO`,`A`,`A`,`A`,`A`,`ZERO`],20:[`B`,`A`,`A`,`A`,`ZERO`,`A`,`A`,`A`,`A`,`ZERO`,`B`,`A`,`A`,`A`,`ZERO`,`A`,`A`,`A`,`A`,`ZERO`],30:`B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO`.split(`.`),40:`B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO`.split(`.`),50:`B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO.B.A.A.A.ZERO.A.A.A.A.ZERO`.split(`.`)},MEDIUM_RISK:{10:[`ZERO`,`B`,`ZERO`,`A`,`ZERO`,`C`,`ZERO`,`A`,`ZERO`,`D`],20:[`A`,`ZERO`,`C`,`ZERO`,`B`,`ZERO`,`C`,`ZERO`,`C`,`ZERO`,`A`,`ZERO`,`C`,`ZERO`,`C`,`ZERO`,`D`,`ZERO`,`C`,`ZERO`],30:`A.ZERO.C.ZERO.A.ZERO.C.ZERO.D.ZERO.B.ZERO.A.ZERO.C.ZERO.A.ZERO.C.ZERO.A.ZERO.C.ZERO.E.ZERO.A.ZERO.C.ZERO`.split(`.`),40:`C.ZERO.A.ZERO.D.ZERO.C.ZERO.A.ZERO.C.ZERO.A.ZERO.D.ZERO.C.ZERO.A.ZERO.B.ZERO.A.ZERO.D.ZERO.C.ZERO.A.ZERO.C.ZERO.A.ZERO.D.ZERO.C.ZERO.A.ZERO`.split(`.`),50:`A.ZERO.B.ZERO.A.ZERO.C.ZERO.A.ZERO.B.ZERO.A.ZERO.B.ZERO.A.ZERO.C.ZERO.A.ZERO.B.ZERO.A.ZERO.B.ZERO.A.ZERO.C.ZERO.A.ZERO.B.ZERO.A.ZERO.B.ZERO.A.ZERO.D.ZERO.A.ZERO.B.ZERO.A.ZERO`.split(`.`)},HIGH_RISK:{10:[...Array(9).fill(`ZERO`),`A`],20:[...Array(19).fill(`ZERO`),`A`],30:[...Array(29).fill(`ZERO`),`A`],40:[...Array(39).fill(`ZERO`),`A`],50:[...Array(49).fill(`ZERO`),`A`]}},v=(e,t)=>_[e][t],y=({riskLevel:n,segments:r})=>{e.against(!m(n),()=>t.createValidationError(`Invalid risk level ${String(n)}`)),e.against(!h(r),()=>t.createValidationError(`Invalid segments value ${String(r)}`))},b=({riskLevel:e,segments:t})=>_[e][t],x=({riskLevel:e,segments:t},n)=>g.getMultipliers(n)[e][t],S=(t,n)=>{let r=t[n];return e.againstUndefined(r,`No multiplier found for slot ${n}`),s(r)},C=(e,t)=>{let n=x(e,t);return b(e).map(e=>S(n,e))},w=(e,t)=>{let n=b(e),r=x(e,t),i=new Map;for(let e of n)i.set(e,(i.get(e)??0)+1);return{outcomes:Array.from(i,([e,t])=>({slot:e,multiplier:S(r,e),weight:t})).sort((e,t)=>e.multiplier.cmp(t.multiplier)),totalWeight:n.length}},T=(e,t)=>(t===void 0?p:[t]).map(t=>a(w(t,e))).reduce((e,t)=>t.gt(e)?t:e),E=(e,t)=>o(w(e,t));var D=class extends i{constructor(){super(r.WHEEL)}get supportedEdgeConfigurations(){return[1,2,3,4,8]}getBetAmount(e){return e.betAmount}describeOutcomes(e,t){return w(e,t)}determineGameResult({generator:t,gameInputs:n,edge:r}){y(n);let i=b(n),a=x(n,r),o=t.getRandomInt({min:0,max:i.length-1}),s=i[o.value];e.againstUndefined(s,`No slot found at index ${o.value} for ${n.segments} segments`);let c=S(a,s);return{isFinished:!0,payout:{legs:[{amount:n.betAmount.mul(c)}]},payoutMultiplier:c,outputs:{result:o.values},randomValues:o}}};const O={id:r.WHEEL,create:()=>new D,suppliesOwnBetAmount:!1};export{_ as FIXED_PATTERNS,d as WHEEL_RISK_LEVELS,f as WHEEL_SEGMENT_OPTIONS,p as WHEEL_SELECTIONS,u as WHEEL_SLOTS,D as Wheel,c as WheelRiskLevel,l as WheelSegments,E as calculateWheelRtpFraction,w as describeWheelOutcomes,v as getFullWheelPattern,T as getWheelMaxMultiplier,b as getWheelPattern,C as getWheelSegmentMultipliers,S as getWheelSlotMultiplier,x as getWheelSlotValues,m as isWheelRiskLevel,h as isWheelSegments,y as validateWheelSelection,O as wheelDescriptor,g as wheelMultipliers};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betorigami/game-wheel",
3
- "version": "0.0.0",
3
+ "version": "1.0.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
@@ -27,7 +27,7 @@
27
27
  "vitest": "^3.2.4"
28
28
  },
29
29
  "dependencies": {
30
- "@betorigami/game-engine": "0.0.0-sha-d6d1f10-20260907014734",
30
+ "@betorigami/game-engine": "1.0.0",
31
31
  "@betorigami/guard": "^2.0.7",
32
32
  "big.js": "^7.0.1"
33
33
  },