@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 +1 -0
- package/dist/index.d.cts +70 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.mjs +1 -0
- package/package.json +2 -2
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;
|
package/dist/index.d.cts
ADDED
|
@@ -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 };
|
package/dist/index.d.ts
ADDED
|
@@ -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": "
|
|
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": "
|
|
30
|
+
"@betorigami/game-engine": "1.0.0",
|
|
31
31
|
"@betorigami/guard": "^2.0.7",
|
|
32
32
|
"big.js": "^7.0.1"
|
|
33
33
|
},
|