@betorigami/game-calculations 0.0.0-sha-13931c3-20251102233803 → 0.0.0-sha-0123787-20251113225519
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 -1
- package/dist/index.d.ts +43 -27
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Le=Object.create;var{getPrototypeOf:be,defineProperty:y,getOwnPropertyNames:X,getOwnPropertyDescriptor:Ae}=Object,Z=Object.prototype.hasOwnProperty;var w=(t,e,r)=>{r=t!=null?Le(be(t)):{};let i=e||!t||!t.__esModule?y(r,"default",{value:t,enumerable:!0}):r;for(let o of X(t))if(!Z.call(i,o))y(i,o,{get:()=>t[o],enumerable:!0});return i},Q=new WeakMap,Ie=(t)=>{var e=Q.get(t),r;if(e)return e;if(e=y({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")X(t).map((i)=>!Z.call(e,i)&&y(e,i,{get:()=>t[i],enumerable:!(r=Ae(t,i))||r.enumerable}));return Q.set(t,e),e};var _e=(t,e)=>{for(var r in e)y(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(i)=>e[r]=()=>i})};var De={};_e(De,{WheelSegments:()=>T,WheelRiskLevel:()=>D,Wheel:()=>ye,VALID_SUITS:()=>te,VALID_RANKS:()=>re,VALID_EUROPEAN_STREETS:()=>F,VALID_EUROPEAN_STRAIGHTS:()=>x,VALID_EUROPEAN_SPLITS:()=>U,VALID_EUROPEAN_DOUBLE_STREETS:()=>Y,VALID_EUROPEAN_CORNERS:()=>q,VALID_AMERICAN_STREETS:()=>$,VALID_AMERICAN_STRAIGHTS:()=>g,VALID_AMERICAN_SPLITS:()=>z,VALID_AMERICAN_DOUBLE_STREETS:()=>J,VALID_AMERICAN_CORNERS:()=>j,Roulette:()=>Ee,PlinkoRiskLevel:()=>V,Plinko:()=>he,Parity:()=>A,OrigamiGame:()=>B,Mines:()=>fe,Limbo:()=>Be,KenoRiskLevel:()=>ce,Keno:()=>de,Half:()=>_,Game:()=>u,Dozen:()=>M,DiceDirection:()=>ae,Dice:()=>ue,DiamondsResultType:()=>le,Diamonds:()=>se,Column:()=>G,Color:()=>I,BaccaratOutcome:()=>ie,Baccarat:()=>oe,AdvancedDice:()=>ee,AMERICAN_BASKET:()=>C});module.exports=Ie(De);var B;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(B||={});class u{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}var R=require("big.js"),Ge=(t,e)=>e>=t.lower&&e<=t.upper,Me=(t)=>t.upper-t.lower+1,W=(t,e)=>e>t.lower&&e<t.upper,P=(t)=>t.upper-t.lower-1,L={min:0,max:1e4,effectiveRange:10001};class ee extends u{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(L),o=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,o,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,o,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,o,e)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!W(t,e))return R.Big(0);let i=P(t),o=R.Big(i).div(L.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Ge(t,e))return R.Big(0);let i=L.effectiveRange-Me(t),o=R.Big(i).div(L.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!W(t,r)&&!W(e,r))return R.Big(0);let o=P(t)+P(e),n=R.Big(o).div(L.effectiveRange).mul(100);return R.Big(100-i).div(n)}}var h=w(require("big.js"));var te=["Clubs","Diamonds","Hearts","Spades"],re=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ie;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(ie||={});class oe extends u{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let i=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=i.values,n=o.slice(0,3),s=o.slice(3,6),d=[],m=0;for(let c of n.slice(0,2)){let p=this.mapRandomValueToCard(c),O=this.mapRandomValueToCardValue(c);d.push(p),m=(m+O)%10}let v=[],a=0;for(let c of s.slice(0,2)){let p=this.mapRandomValueToCard(c),O=this.mapRandomValueToCardValue(c);v.push(p),a=(a+O)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),p=null;if(c)p=this.mapRandomValueToCardValue(n[2]),d.push(this.mapRandomValueToCard(n[2])),m=(m+p)%10;if(this.shouldDrawThirdBankerCard(a,p))v.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let f;if(m===a)f="TIE";else f=m>a?"PLAYER_WIN":"BANKER_WIN";let S=new h.default(0).add(e.playerBets.reduce((c,p)=>c.add(p.amount),new h.default(0))).add(e.tieBets.reduce((c,p)=>c.add(p.amount),new h.default(0))).add(e.bankerBets.reduce((c,p)=>c.add(p.amount),new h.default(0))),k=new h.default(0).add(e.playerBets.filter((c)=>f==="PLAYER_WIN").reduce((c,p)=>c.add(p.amount.mul(2)),new h.default(0))).add(e.tieBets.filter((c)=>f==="TIE").reduce((c,p)=>c.add(p.amount.mul(8)),new h.default(0))).add(e.bankerBets.filter((c)=>f==="BANKER_WIN").reduce((c,p)=>c.add(p.amount.mul(1.95)),new h.default(0)));return{isFinished:!0,payoutMultiplier:S.gt(0)?k.div(S):new h.default(0),outputs:{playerCards:d,playerHandValue:m,bankerCards:v,bankerHandValue:a,gameOutcome:f,result:i.values},randomValues:i}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=te[Math.floor(t/13)],r=re[t%13];return{suit:e,rank:r}}isNaturalWin(t,e){let r=[8,9];return r.includes(t)||r.includes(e)}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}var ne=w(require("big.js")),le;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(le||={});var ke={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Oe={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class se extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ke}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({generator:t,edge:e}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let i=r.values,o=this.calculatePayoutMultiplier(i);return{isFinished:!0,payoutMultiplier:ne.default(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=Oe[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}var K=w(require("big.js"));var ae;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(ae||={});class ue extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,d=i.max-o+1-1,m=r.direction==="ABOVE"?d-r.selectedValue:r.selectedValue,v=new K.default(m).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K.default(100-e).div(v):new K.default(0),outputs:{result:i.values},randomValues:i}}}var H=w(require("big.js"));var ce;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(ce||={});var Ke={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class de extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ke}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of r.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((s)=>i.values.includes(s));return{isFinished:!0,payoutMultiplier:o.length>0?new H.default(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new H.default(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}var E=w(require("big.js"));var pe=(t,e)=>{return t.gt(e)?t:e};var me=(t,e)=>{return t.lt(e)?t:e};class Be extends u{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new E.default(16777216),s=new E.default(1),d=new E.default(1e6),m=i.value,v=new E.default(m-1).div(o),a=(100-e)/100,f=n.div(v.mul(n).plus(1)).mul(a),S=pe(s,me(f,d));return{isFinished:!0,payoutMultiplier:S.gte(r.targetMultiplier)?new E.default(r.targetMultiplier):new E.default(0),outputs:{randomMultiplier:S,result:i.values},randomValues:i}}}var b=w(require("big.js"));var N=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class fe extends u{constructor(){super("MINES")}determineGameResult({generator:t,edge:e,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),d=s.values.some((k)=>r.selectedTiles.includes(k)),m=r.hasCashedOut||d,v=(100-e)/100,a=new b.default(N(25-r.minesCount,r.selectedTiles.length)).div(new b.default(N(25,r.selectedTiles.length))),S=r.hasCashedOut&&!d?new b.default(v).div(a):new b.default(0);return{isFinished:m,payoutMultiplier:S,outputs:{result:s.values},randomValues:s}}}var Re=require("big.js");var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var xe=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class he extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??xe}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=t.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),n=i.values.reduce((d,m)=>d+m,0);return{isFinished:!0,payoutMultiplier:new Re.Big(this.multipliers.find((d)=>d.rows===e.numberOfRows)?.payout[e.riskLevel][n]??0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(V);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}var l=require("big.js");var x=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],g=[37,...x],U=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],z=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],F=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],$=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],q=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],j=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],C=[0,1,2,3,37],Y=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],J=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var I;((r)=>{r.RED="RED";r.BLACK="BLACK"})(I||={});var _;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(_||={});var G;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(G||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});class ve extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:36}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return x.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return U.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return F.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return q.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Y.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Se extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:37}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return z.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return $.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return j.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return J.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>C.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!C.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Ee extends u{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ve,this.americanGame=new Se}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o,result:i.outputs.result}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var we=require("big.js");var D;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(D||={});var T;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(T||={});var Ce=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class ye extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ce}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(T).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(D).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((d)=>d.segments===e.segments);if(o===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let n=o.payout[e.riskLevel][i.value];if(n===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${i.value}`);return{isFinished:!0,payoutMultiplier:new we.Big(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(T).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(D);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}
|
|
1
|
+
var Wr=Object.create;var{getPrototypeOf:jr,defineProperty:K,getOwnPropertyNames:ir,getOwnPropertyDescriptor:qr}=Object,nr=Object.prototype.hasOwnProperty;var C=(e,r,o)=>{o=e!=null?Wr(jr(e)):{};let i=r||!e||!e.__esModule?K(o,"default",{value:e,enumerable:!0}):o;for(let n of ir(e))if(!nr.call(i,n))K(i,n,{get:()=>e[n],enumerable:!0});return i},or=new WeakMap,Fr=(e)=>{var r=or.get(e),o;if(r)return r;if(r=K({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")ir(e).map((i)=>!nr.call(r,i)&&K(r,i,{get:()=>e[i],enumerable:!(o=qr(e,i))||o.enumerable}));return or.set(e,r),r};var Yr=(e,r)=>{for(var o in r)K(e,o,{get:r[o],enumerable:!0,configurable:!0,set:(i)=>r[o]=()=>i})};var de={};Yr(de,{wheelMultipliers:()=>Pr,validateRouletteGameInputs:()=>le,plinkoMultipliers:()=>Mr,calculateRouletteBetAmount:()=>ce,calculateBaccaratBetAmount:()=>ar,WheelSegments:()=>er,WheelRiskLevel:()=>rr,Wheel:()=>Ur,VALID_SUITS:()=>lr,VALID_RANKS:()=>Er,VALID_EUROPEAN_STREETS:()=>Q,VALID_EUROPEAN_STRAIGHTS:()=>k,VALID_EUROPEAN_SPLITS:()=>z,VALID_EUROPEAN_DOUBLE_STREETS:()=>m,VALID_EUROPEAN_CORNERS:()=>Z,VALID_AMERICAN_STREETS:()=>X,VALID_AMERICAN_STRAIGHTS:()=>$,VALID_AMERICAN_SPLITS:()=>J,VALID_AMERICAN_DOUBLE_STREETS:()=>g,VALID_AMERICAN_CORNERS:()=>b,Roulette:()=>Or,RollType:()=>tr,PlinkoRiskLevel:()=>Rr,Plinko:()=>Cr,Parity:()=>s,OrigamiGame:()=>S,Mines:()=>Gr,Limbo:()=>sr,KenoRiskLevel:()=>hr,Keno:()=>yr,Half:()=>u,GameErrorCode:()=>Dr,GameError:()=>E,Game:()=>f,Dozen:()=>M,DiceDirection:()=>Lr,Dice:()=>_r,DiamondsResultType:()=>pr,Diamonds:()=>Ar,Column:()=>R,Color:()=>G,BaccaratOutcome:()=>dr,BaccaratBetType:()=>fr,Baccarat:()=>Br,AdvancedDice:()=>cr,AMERICAN_BASKET:()=>H});module.exports=Fr(de);var S;((d)=>{d.DICE="DICE";d.MINES="MINES";d.KENO="KENO";d.LIMBO="LIMBO";d.ADVANCED_DICE="ADVANCED_DICE";d.BACCARAT="BACCARAT";d.DIAMONDS="DIAMONDS";d.PLINKO="PLINKO";d.ROULETTE="ROULETTE";d.WHEEL="WHEEL"})(S||={});class f{gameId;constructor(e){this.gameId=e}getGameResult(e){return this.determineGameResult(e)}}var L=require("big.js"),Ir=(e,r)=>r>=e.lower&&r<=e.upper,$r=(e)=>e.upper-e.lower+1,q=(e,r)=>r>e.lower&&r<e.upper,F=(e)=>e.upper-e.lower-1,tr;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(tr||={});var v={min:0,max:1e4,effectiveRange:10001};class cr extends f{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt(v),n=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(o.bounds,n,r);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(o.bounds,n,r);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(o.firstBounds,o.secondBounds,n,r)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(e,r,o){if(!q(e,r))return L.Big(0);let i=F(e),n=L.Big(i).div(v.effectiveRange).mul(100);return L.Big(100-o).div(n)}calculateRollOutsidePayoutMultiplier(e,r,o){if(Ir(e,r))return L.Big(0);let i=v.effectiveRange-$r(e),n=L.Big(i).div(v.effectiveRange).mul(100);return L.Big(100-o).div(n)}calculateRollBetweenTwoPayoutMultiplier(e,r,o,i){if(!q(e,o)&&!q(r,o))return L.Big(0);let n=F(e)+F(r),t=L.Big(n).div(v.effectiveRange).mul(100);return L.Big(100-i).div(t)}}var D=C(require("big.js"));var lr=["Clubs","Diamonds","Hearts","Spades"],Er=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],dr;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(dr||={});var fr;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(fr||={});var zr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},ar=(e)=>{return new D.default(0).add(e.bets.reduce((o,i)=>o.add(i.amount),new D.default(0)))};class Br extends f{constructor(){super("BACCARAT")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(r);let i=e.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=i.values,t=n.slice(0,3),l=n.slice(3,6),B=[],a=0;for(let A of t.slice(0,2)){let _=this.mapRandomValueToCard(A),P=this.mapRandomValueToCardValue(A);B.push(_),a=(a+P)%10}let p=[],d=0;for(let A of l.slice(0,2)){let _=this.mapRandomValueToCard(A),P=this.mapRandomValueToCardValue(A);p.push(_),d=(d+P)%10}if(!this.isNaturalWin(a,d)){let A=this.shouldDrawThirdPlayerCard(a),_=null;if(A)_=this.mapRandomValueToCardValue(t[2]),B.push(this.mapRandomValueToCard(t[2])),a=(a+_)%10;if(this.shouldDrawThirdBankerCard(d,_))p.push(this.mapRandomValueToCard(l[2])),d=(d+this.mapRandomValueToCardValue(l[2]))%10}let h;if(a===d)h="TIE";else h=a>d?"PLAYER_WIN":"BANKER_WIN";let y=ar(r),{betType:V,multiplier:kr}=zr[h],Hr=new D.default(0).add(r.bets.filter((A)=>A.type===V).reduce((A,_)=>A.add(_.amount.mul(kr)),new D.default(0)));return{isFinished:!0,payoutMultiplier:y.gt(0)?Hr.div(y):new D.default(0),outputs:{playerCards:B,playerHandValue:a,bankerCards:p,bankerHandValue:d,gameOutcome:h,result:i.values},randomValues:i}}validateGameInputs(e){if(e.bets.length===0)throw new Error("Must place at least a single bet.");if(!e.bets.every((r)=>r.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(e){let r=lr[Math.floor(e/13)],o=Er[e%13];return{suit:r,rank:o}}isNaturalWin(e,r){let o=[8,9];return o.includes(e)||o.includes(r)}mapRandomValueToCardValue(e){let r=e%13;if(r===0)return 1;if(r>=10)return 10;return r+1}shouldDrawThirdPlayerCard(e){return e<=5}shouldDrawThirdBankerCard(e,r){if(r===null)return e<=5;if(e<=2)return!0;if(e===3)return r!==8;if(e===4)return[2,3,4,5,6,7].includes(r);if(e===5)return[4,5,6,7].includes(r);if(e===6)return[6,7].includes(r);return!1}}var Sr=C(require("big.js"));class T{multipliers;constructor(e){this.multipliers=e}getMultipliers(e){let r=this.multipliers.get(e);if(r===void 0)throw new Error(`Multipliers for ${e} not found`);return r}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([e,r])=>({edge:e,multipliers:r}))}}var pr;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(pr||={});var Jr={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Qr=new T(new Map([[2,Jr]])),Xr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Ar extends f{constructor(){super("DIAMONDS")}determineGameResult({generator:e,edge:r}){let o=e.getRandomIntsWithReplacement({min:0,max:6,count:5}),i=Qr.getMultipliers(r),n=o.values,t=this.calculatePayoutMultiplier(i,n);return{isFinished:!0,payoutMultiplier:Sr.default(t),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(e,r){let o=new Map;for(let t of r){let l=o.get(t)||0;o.set(t,l+1)}let i=[...o.values()].filter((t)=>t>1),n=this.classifyResult(i);return n===null?0:e[n]}classifyResult(e){if(e.length>2)throw new Error(`Unexpected number of repeats ${e.length}`);let[r,o]=e;if(r===void 0)return null;if(o===void 0){let i=Xr[r];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${r}`);return i}return r===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var U=C(require("big.js"));var Lr;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Lr||={});class _r extends f{constructor(){super("DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:0,max:1e4}),n=i.min,B=i.max-n+1-1,a=o.direction==="ABOVE"?B-o.selectedValue:o.selectedValue,p=new U.default(a).div(B).mul(100);return{isFinished:!0,payoutMultiplier:(o.direction==="ABOVE"?i.value>o.selectedValue:i.value<o.selectedValue)?new U.default(100-r).div(p):new U.default(0),outputs:{result:i.values},randomValues:i}}}var Y=C(require("big.js"));var hr;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(hr||={});var Zr={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class yr extends f{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Zr}constructor(e){super("KENO");this.multiplierOverrides=e;if(e)this.validateMultiplierOverrides(e)}determineGameResult({generator:e,edge:r,gameInputs:o}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(o.selectedNumbers.length===0)throw new Error("No numbers selected");if(o.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let l of o.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=e.getUniqueRandomInts({min:0,max:39,count:10}),n=o.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:n.length>0?new Y.default(this.multipliers[o.selectedNumbers.length][o.riskLevel][n.length]??0):new Y.default(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(e){for(let[r,o]of Object.entries(e)){let i=Number(r);for(let[n,t]of Object.entries(o))if(t.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${n}. Expected ${i+1}, but got ${t.length}`)}}}var x=C(require("big.js"));var Tr=(e,r)=>{return e.gt(r)?e:r};var xr=(e,r)=>{return e.lt(r)?e:r};class sr extends f{constructor(){super("LIMBO")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:1,max:4294967295}),n=i.max,t=new x.default(16777216),l=new x.default(1),B=new x.default(1e6),a=i.value,p=new x.default(a-1).div(n),d=(100-r)/100,h=t.div(p.mul(t).plus(1)).mul(d),y=Tr(l,xr(h,B));return{isFinished:!0,payoutMultiplier:y.gte(o.targetMultiplier)?new x.default(o.targetMultiplier):new x.default(0),outputs:{randomMultiplier:y,result:i.values},randomValues:i}}}var w=C(require("big.js"));var I=(e,r)=>{if(r<0||e<0||r>e)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(r>e-r)r=e-r;let o=1;for(let i=1;i<=r;i++)o=o*(e-i+1)/i;return o};class Gr extends f{constructor(){super("MINES")}determineGameResult({generator:e,edge:r,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let l=e.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),B=l.values.some((V)=>o.selectedTiles.includes(V)),a=o.hasCashedOut||B,p=(100-r)/100,d=new w.default(I(25-o.minesCount,o.selectedTiles.length)).div(new w.default(I(25,o.selectedTiles.length))),y=o.hasCashedOut&&!B?new w.default(p).div(d):new w.default(0);return{isFinished:a,payoutMultiplier:y,outputs:{result:l.values},randomValues:l}}}var ur=require("big.js");var Rr;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(Rr||={});var br=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}],Mr=new T(new Map([[1,br]]));class Cr extends f{constructor(){super("PLINKO")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(r.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(r.numberOfRows<8||r.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=Mr.getMultipliers(o),n=e.getRandomIntsWithReplacement({min:0,max:1,count:r.numberOfRows}),l=n.values.reduce((a,p)=>a+p,0);return{isFinished:!0,payoutMultiplier:new ur.Big(i.find((a)=>a.rows===r.numberOfRows)?.payout[r.riskLevel][l]??0),outputs:{result:n.values},randomValues:n}}}var c=require("big.js");var k=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],$=[37,...k],z=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],J=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Q=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],X=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Z=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],b=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],H=[0,1,2,3,37],m=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],g=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],s;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(s||={});var G;((o)=>{o.RED="RED";o.BLACK="BLACK"})(G||={});var u;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(u||={});var R;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(R||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});var Dr;((r)=>r.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Dr||={});class E extends Error{static createValidationError(e){return new E("INPUT_VALIDATION_ERROR",e)}static isGameError(e){return e instanceof E}errorCode;constructor(e,r){super(r);this.errorCode=e}}var W=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&N(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&mr(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&gr(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&re(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&ee(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},N=(e)=>{return k.includes(e)},mr=(e)=>{if(e.length!==2)return!1;if(!e.every(N))return!1;return z.some(([r,o])=>r===e[0]&&o===e[1])},gr=(e)=>{if(e.length!==3)return!1;if(!e.every(N))return!1;return Q.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},re=(e)=>{if(e.length!==4)return!1;if(!e.every(N))return!1;return Z.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},ee=(e)=>{if(e.length!==6)return!1;if(!e.every(N))return!1;return m.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var j=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.basketBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&O(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&oe(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&ie(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&ne(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.basketBets.every((r)=>r.amount.gte(0)))throw E.createValidationError("Invalid basket bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&te(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},O=(e)=>{return $.includes(e)};function oe(e){if(e.length!==2)return!1;if(!e.every(O))return!1;return J.some(([r,o])=>r===e[0]&&o===e[1])}var ie=(e)=>{if(e.length!==3)return!1;if(!e.every(O))return!1;return X.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},ne=(e)=>{if(e.length!==4)return!1;if(!e.every(O))return!1;return b.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},te=(e)=>{if(e.length!==6)return!1;if(!e.every(O))return!1;return g.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var Kr=(e)=>{return new c.Big(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0)))},vr=(e)=>{return new c.Big(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.basketBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0)))},ce=(e)=>{return e.type==="european"?Kr(e.inputs):vr(e.inputs)};class wr extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){W(r);let o=e.getRandomInt({min:0,max:36}),i=o.value,n=this.determineBetOutcomes(r,i),t=Kr(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c.Big(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c.Big(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c.Big(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c.Big(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c.Big(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c.Big(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c.Big(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0)))}}class Nr extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){j(r);let o=e.getRandomInt({min:0,max:37}),i=o.value,n=this.determineBetOutcomes(r,i),t=vr(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c.Big(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>H.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>!H.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0||r===37)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c.Big(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c.Big(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c.Big(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c.Big(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c.Big(0))).add(e.winningBets.basketBets.reduce((r,o)=>r.plus(o.amount.mul(7)),new c.Big(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c.Big(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0)))}}class Or extends f{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new wr,this.americanGame=new Nr}determineGameResult(e){let{gameInputs:r,...o}=e;if(e.edge===2.7&&r.type==="european"){let i=this.europeanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:n,result:i.outputs.result}}}if(e.edge===5.3&&r.type==="american"){let i=this.americanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:n,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var le=(e)=>{if(e.type==="european")W(e.inputs);else j(e.inputs)};var Vr=require("big.js");var rr;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(rr||={});var er;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})(er||={});var Ee=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}],Pr=new T(new Map([[1,Ee]]));class Ur extends f{constructor(){super("WHEEL")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(!Object.values(er).includes(r.segments))throw new Error("Invalid segments value");if(!Object.values(rr).includes(r.riskLevel))throw new Error("Invalid risk level");let i=Pr.getMultipliers(o).find((B)=>B.segments===r.segments);if(i===void 0)throw new Error(`Multiplier not found for segment ${r.segments}`);let n=e.getRandomInt({min:0,max:r.segments-1}),t=i.payout[r.riskLevel][n.value];if(t===void 0)throw new Error(`Payout not found for risk ${r.riskLevel} and value ${n.value}`);return{isFinished:!0,payoutMultiplier:new Vr.Big(t),outputs:{result:n.values},randomValues:n}}}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Generated by dts-bundle-generator v9.5.1
|
|
2
2
|
|
|
3
3
|
import Big$1 from 'big.js';
|
|
4
|
-
import { Big as Big$1 } from 'big.js';
|
|
4
|
+
import { Big as Big$1, Big as Big$2 } from 'big.js';
|
|
5
5
|
|
|
6
6
|
export type Proof = {
|
|
7
7
|
proofHash: string;
|
|
@@ -10,13 +10,11 @@ export type Proof = {
|
|
|
10
10
|
export type SingleRandomValue = {
|
|
11
11
|
value: number;
|
|
12
12
|
values: number[];
|
|
13
|
-
count: 1;
|
|
14
13
|
min: number;
|
|
15
14
|
max: number;
|
|
16
15
|
} & Proof;
|
|
17
16
|
export type MultipleRandomValues = {
|
|
18
17
|
values: number[];
|
|
19
|
-
count: number;
|
|
20
18
|
min: number;
|
|
21
19
|
max: number;
|
|
22
20
|
} & Proof;
|
|
@@ -72,16 +70,21 @@ export type Bounds = {
|
|
|
72
70
|
lower: number;
|
|
73
71
|
upper: number;
|
|
74
72
|
};
|
|
73
|
+
export declare enum RollType {
|
|
74
|
+
ROLL_BETWEEN = "ROLL_BETWEEN",
|
|
75
|
+
ROLL_OUTSIDE = "ROLL_OUTSIDE",
|
|
76
|
+
ROLL_BETWEEN_TWO = "ROLL_BETWEEN_TWO"
|
|
77
|
+
}
|
|
75
78
|
export type RollBetween = {
|
|
76
|
-
mode:
|
|
79
|
+
mode: RollType.ROLL_BETWEEN;
|
|
77
80
|
bounds: Bounds;
|
|
78
81
|
};
|
|
79
82
|
export type RollOutside = {
|
|
80
|
-
mode:
|
|
83
|
+
mode: RollType.ROLL_OUTSIDE;
|
|
81
84
|
bounds: Bounds;
|
|
82
85
|
};
|
|
83
86
|
export type RollBetweenTwo = {
|
|
84
|
-
mode:
|
|
87
|
+
mode: RollType.ROLL_BETWEEN_TWO;
|
|
85
88
|
firstBounds: Bounds;
|
|
86
89
|
secondBounds: Bounds;
|
|
87
90
|
};
|
|
@@ -93,19 +96,12 @@ export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
|
|
|
93
96
|
private calculateRollOutsidePayoutMultiplier;
|
|
94
97
|
private calculateRollBetweenTwoPayoutMultiplier;
|
|
95
98
|
}
|
|
96
|
-
export interface
|
|
97
|
-
amount: Big$1;
|
|
98
|
-
}
|
|
99
|
-
export interface TieBet {
|
|
100
|
-
amount: Big$1;
|
|
101
|
-
}
|
|
102
|
-
export interface BankerBet {
|
|
99
|
+
export interface Bet {
|
|
103
100
|
amount: Big$1;
|
|
101
|
+
type: BaccaratBetType;
|
|
104
102
|
}
|
|
105
103
|
export interface BaccaratGameInputs {
|
|
106
|
-
|
|
107
|
-
tieBets: TieBet[];
|
|
108
|
-
bankerBets: BankerBet[];
|
|
104
|
+
bets: Bet[];
|
|
109
105
|
}
|
|
110
106
|
export declare const VALID_SUITS: readonly [
|
|
111
107
|
"Clubs",
|
|
@@ -139,6 +135,11 @@ export declare enum BaccaratOutcome {
|
|
|
139
135
|
TIE = "TIE",
|
|
140
136
|
BANKER_WIN = "BANKER_WIN"
|
|
141
137
|
}
|
|
138
|
+
export declare enum BaccaratBetType {
|
|
139
|
+
PLAYER = "PLAYER",
|
|
140
|
+
TIE = "TIE",
|
|
141
|
+
BANKER = "BANKER"
|
|
142
|
+
}
|
|
142
143
|
export interface BaccaratGameOutputs {
|
|
143
144
|
playerCards: Card[];
|
|
144
145
|
playerHandValue: number;
|
|
@@ -146,6 +147,7 @@ export interface BaccaratGameOutputs {
|
|
|
146
147
|
bankerHandValue: number;
|
|
147
148
|
gameOutcome: BaccaratOutcome;
|
|
148
149
|
}
|
|
150
|
+
export declare const calculateBaccaratBetAmount: (gameInputs: BaccaratGameInputs) => Big$1;
|
|
149
151
|
export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutputs> {
|
|
150
152
|
constructor();
|
|
151
153
|
protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
|
|
@@ -168,9 +170,7 @@ export declare enum DiamondsResultType {
|
|
|
168
170
|
}
|
|
169
171
|
export type DiamondsMultipliers = Record<keyof typeof DiamondsResultType, number>;
|
|
170
172
|
export declare class Diamonds extends Game<DiamondsGameInputs> {
|
|
171
|
-
|
|
172
|
-
private get multipliers();
|
|
173
|
-
constructor(multiplierOverrides?: DiamondsMultipliers | undefined);
|
|
173
|
+
constructor();
|
|
174
174
|
protected determineGameResult({ generator, edge }: GetGameResultRequest<DiamondsGameInputs>): GameResult;
|
|
175
175
|
private calculatePayoutMultiplier;
|
|
176
176
|
private classifyResult;
|
|
@@ -225,6 +225,15 @@ export declare class Mines extends Game<MinesGameInputs> {
|
|
|
225
225
|
constructor();
|
|
226
226
|
protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<MinesGameInputs>): GameResult;
|
|
227
227
|
}
|
|
228
|
+
declare class MultiplierContainer<TMultipliers> {
|
|
229
|
+
readonly multipliers: Map<number, TMultipliers>;
|
|
230
|
+
constructor(multipliers: Map<number, TMultipliers>);
|
|
231
|
+
getMultipliers(edge: number): TMultipliers;
|
|
232
|
+
getAllMultipliers(): {
|
|
233
|
+
edge: number;
|
|
234
|
+
multipliers: TMultipliers;
|
|
235
|
+
}[];
|
|
236
|
+
}
|
|
228
237
|
export declare enum PlinkoRiskLevel {
|
|
229
238
|
LOW_RISK = "LOW_RISK",
|
|
230
239
|
MEDIUM_RISK = "MEDIUM_RISK",
|
|
@@ -238,12 +247,10 @@ export interface PlinkoMultipliers {
|
|
|
238
247
|
rows: number;
|
|
239
248
|
payout: Record<PlinkoRiskLevel, number[]>;
|
|
240
249
|
}
|
|
250
|
+
export declare const plinkoMultipliers: MultiplierContainer<PlinkoMultipliers[]>;
|
|
241
251
|
export declare class Plinko extends Game<PlinkoGameInputs> {
|
|
242
|
-
|
|
243
|
-
private get multipliers();
|
|
244
|
-
constructor(multiplierOverrides?: PlinkoMultipliers[] | undefined);
|
|
252
|
+
constructor();
|
|
245
253
|
protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<PlinkoGameInputs>): GameResult;
|
|
246
|
-
private validateMultiplierOverrides;
|
|
247
254
|
}
|
|
248
255
|
export declare const VALID_EUROPEAN_STRAIGHTS: readonly [
|
|
249
256
|
0,
|
|
@@ -1566,12 +1573,14 @@ export type RouletteGameOutputs = {
|
|
|
1566
1573
|
type: "american";
|
|
1567
1574
|
betOutcomes: AmericanRouletteBetOutcomes;
|
|
1568
1575
|
};
|
|
1576
|
+
export declare const calculateRouletteBetAmount: (inputs: RouletteGameInputs) => Big$1.Big;
|
|
1569
1577
|
export declare class Roulette extends Game<RouletteGameInputs, RouletteGameOutputs> {
|
|
1570
1578
|
private readonly europeanGame;
|
|
1571
1579
|
private readonly americanGame;
|
|
1572
1580
|
constructor();
|
|
1573
1581
|
protected determineGameResult(request: GetGameResultRequest<RouletteGameInputs>): GameResult<RouletteGameOutputs>;
|
|
1574
1582
|
}
|
|
1583
|
+
export declare const validateRouletteGameInputs: (gameInputs: RouletteGameInputs) => void;
|
|
1575
1584
|
export declare enum WheelRiskLevel {
|
|
1576
1585
|
LOW_RISK = "LOW_RISK",
|
|
1577
1586
|
MEDIUM_RISK = "MEDIUM_RISK",
|
|
@@ -1592,12 +1601,19 @@ export interface WheelMultipliers {
|
|
|
1592
1601
|
segments: WheelSegments;
|
|
1593
1602
|
payout: Record<WheelRiskLevel, number[]>;
|
|
1594
1603
|
}
|
|
1604
|
+
export declare const wheelMultipliers: MultiplierContainer<WheelMultipliers[]>;
|
|
1595
1605
|
export declare class Wheel extends Game<WheelGameInputs> {
|
|
1596
|
-
|
|
1597
|
-
private get multipliers();
|
|
1598
|
-
constructor(multiplierOverrides?: WheelMultipliers[] | undefined);
|
|
1606
|
+
constructor();
|
|
1599
1607
|
protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
|
|
1600
|
-
|
|
1608
|
+
}
|
|
1609
|
+
export declare enum GameErrorCode {
|
|
1610
|
+
INPUT_VALIDATION_ERROR = "INPUT_VALIDATION_ERROR"
|
|
1611
|
+
}
|
|
1612
|
+
export declare class GameError extends Error {
|
|
1613
|
+
static createValidationError(message: string): GameError;
|
|
1614
|
+
static isGameError(error: unknown): error is GameError;
|
|
1615
|
+
errorCode: GameErrorCode;
|
|
1616
|
+
constructor(errorCode: GameErrorCode, message?: string);
|
|
1601
1617
|
}
|
|
1602
1618
|
|
|
1603
1619
|
export {};
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var B;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(B||={});class u{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}import{Big as h}from"big.js";var Z=(t,e)=>e>=t.lower&&e<=t.upper,ee=(t)=>t.upper-t.lower+1,k=(t,e)=>e>t.lower&&e<t.upper,O=(t)=>t.upper-t.lower-1,w={min:0,max:1e4,effectiveRange:10001};class te extends u{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(w),o=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,o,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,o,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,o,e)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!k(t,e))return h(0);let i=O(t),o=h(i).div(w.effectiveRange).mul(100);return h(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Z(t,e))return h(0);let i=w.effectiveRange-ee(t),o=h(i).div(w.effectiveRange).mul(100);return h(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!k(t,r)&&!k(e,r))return h(0);let o=O(t)+O(e),n=h(o).div(w.effectiveRange).mul(100);return h(100-i).div(n)}}import v from"big.js";var re=["Clubs","Diamonds","Hearts","Spades"],ie=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],oe;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(oe||={});class ne extends u{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let i=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=i.values,n=o.slice(0,3),s=o.slice(3,6),d=[],m=0;for(let c of n.slice(0,2)){let p=this.mapRandomValueToCard(c),L=this.mapRandomValueToCardValue(c);d.push(p),m=(m+L)%10}let R=[],a=0;for(let c of s.slice(0,2)){let p=this.mapRandomValueToCard(c),L=this.mapRandomValueToCardValue(c);R.push(p),a=(a+L)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),p=null;if(c)p=this.mapRandomValueToCardValue(n[2]),d.push(this.mapRandomValueToCard(n[2])),m=(m+p)%10;if(this.shouldDrawThirdBankerCard(a,p))R.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let f;if(m===a)f="TIE";else f=m>a?"PLAYER_WIN":"BANKER_WIN";let S=new v(0).add(e.playerBets.reduce((c,p)=>c.add(p.amount),new v(0))).add(e.tieBets.reduce((c,p)=>c.add(p.amount),new v(0))).add(e.bankerBets.reduce((c,p)=>c.add(p.amount),new v(0))),y=new v(0).add(e.playerBets.filter((c)=>f==="PLAYER_WIN").reduce((c,p)=>c.add(p.amount.mul(2)),new v(0))).add(e.tieBets.filter((c)=>f==="TIE").reduce((c,p)=>c.add(p.amount.mul(8)),new v(0))).add(e.bankerBets.filter((c)=>f==="BANKER_WIN").reduce((c,p)=>c.add(p.amount.mul(1.95)),new v(0)));return{isFinished:!0,payoutMultiplier:S.gt(0)?y.div(S):new v(0),outputs:{playerCards:d,playerHandValue:m,bankerCards:R,bankerHandValue:a,gameOutcome:f,result:i.values},randomValues:i}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=re[Math.floor(t/13)],r=ie[t%13];return{suit:e,rank:r}}isNaturalWin(t,e){let r=[8,9];return r.includes(t)||r.includes(e)}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}import le from"big.js";var se;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(se||={});var ae={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},ue={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ce extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ae}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({generator:t,edge:e}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let i=r.values,o=this.calculatePayoutMultiplier(i);return{isFinished:!0,payoutMultiplier:le(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=ue[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}import K from"big.js";var de;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(de||={});class pe extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,d=i.max-o+1-1,m=r.direction==="ABOVE"?d-r.selectedValue:r.selectedValue,R=new K(m).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K(100-e).div(R):new K(0),outputs:{result:i.values},randomValues:i}}}import P from"big.js";var me;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(me||={});var Be={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class fe extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Be}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of r.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((s)=>i.values.includes(s));return{isFinished:!0,payoutMultiplier:o.length>0?new P(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new P(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}import E from"big.js";var H=(t,e)=>{return t.gt(e)?t:e};var N=(t,e)=>{return t.lt(e)?t:e};class Re extends u{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new E(16777216),s=new E(1),d=new E(1e6),m=i.value,R=new E(m-1).div(o),a=(100-e)/100,f=n.div(R.mul(n).plus(1)).mul(a),S=H(s,N(f,d));return{isFinished:!0,payoutMultiplier:S.gte(r.targetMultiplier)?new E(r.targetMultiplier):new E(0),outputs:{randomMultiplier:S,result:i.values},randomValues:i}}}import b from"big.js";var x=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class he extends u{constructor(){super("MINES")}determineGameResult({generator:t,edge:e,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),d=s.values.some((y)=>r.selectedTiles.includes(y)),m=r.hasCashedOut||d,R=(100-e)/100,a=new b(x(25-r.minesCount,r.selectedTiles.length)).div(new b(x(25,r.selectedTiles.length))),S=r.hasCashedOut&&!d?new b(R).div(a):new b(0);return{isFinished:m,payoutMultiplier:S,outputs:{result:s.values},randomValues:s}}}import{Big as ve}from"big.js";var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var Se=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class Ee extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Se}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=t.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),n=i.values.reduce((d,m)=>d+m,0);return{isFinished:!0,payoutMultiplier:new ve(this.multipliers.find((d)=>d.rows===e.numberOfRows)?.payout[e.riskLevel][n]??0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(V);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}import{Big as l}from"big.js";var C=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],g=[37,...C],U=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],z=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],F=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],$=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],q=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],j=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],D=[0,1,2,3,37],Y=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],J=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var I;((r)=>{r.RED="RED";r.BLACK="BLACK"})(I||={});var _;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(_||={});var G;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(G||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});class Q extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:36}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return C.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return U.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return F.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return q.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Y.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class X extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:37}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return z.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return $.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return j.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return J.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>D.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!D.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class we extends u{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Q,this.americanGame=new X}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o,result:i.outputs.result}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}import{Big as ye}from"big.js";var T;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(T||={});var W;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(W||={});var Le=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class be extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Le}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(W).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(T).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((d)=>d.segments===e.segments);if(o===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let n=o.payout[e.riskLevel][i.value];if(n===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${i.value}`);return{isFinished:!0,payoutMultiplier:new ye(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(W).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(T);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}export{W as WheelSegments,T as WheelRiskLevel,be as Wheel,re as VALID_SUITS,ie as VALID_RANKS,F as VALID_EUROPEAN_STREETS,C as VALID_EUROPEAN_STRAIGHTS,U as VALID_EUROPEAN_SPLITS,Y as VALID_EUROPEAN_DOUBLE_STREETS,q as VALID_EUROPEAN_CORNERS,$ as VALID_AMERICAN_STREETS,g as VALID_AMERICAN_STRAIGHTS,z as VALID_AMERICAN_SPLITS,J as VALID_AMERICAN_DOUBLE_STREETS,j as VALID_AMERICAN_CORNERS,we as Roulette,V as PlinkoRiskLevel,Ee as Plinko,A as Parity,B as OrigamiGame,he as Mines,Re as Limbo,me as KenoRiskLevel,fe as Keno,_ as Half,u as Game,M as Dozen,de as DiceDirection,pe as Dice,se as DiamondsResultType,ce as Diamonds,G as Column,I as Color,oe as BaccaratOutcome,ne as Baccarat,te as AdvancedDice,D as AMERICAN_BASKET};
|
|
1
|
+
var A;((d)=>{d.DICE="DICE";d.MINES="MINES";d.KENO="KENO";d.LIMBO="LIMBO";d.ADVANCED_DICE="ADVANCED_DICE";d.BACCARAT="BACCARAT";d.DIAMONDS="DIAMONDS";d.PLINKO="PLINKO";d.ROULETTE="ROULETTE";d.WHEEL="WHEEL"})(A||={});class f{gameId;constructor(e){this.gameId=e}getGameResult(e){return this.determineGameResult(e)}}import{Big as _}from"big.js";var Er=(e,r)=>r>=e.lower&&r<=e.upper,dr=(e)=>e.upper-e.lower+1,U=(e,r)=>r>e.lower&&r<e.upper,k=(e)=>e.upper-e.lower-1,fr;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(fr||={});var C={min:0,max:1e4,effectiveRange:10001};class ar extends f{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt(C),n=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(o.bounds,n,r);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(o.bounds,n,r);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(o.firstBounds,o.secondBounds,n,r)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(e,r,o){if(!U(e,r))return _(0);let i=k(e),n=_(i).div(C.effectiveRange).mul(100);return _(100-o).div(n)}calculateRollOutsidePayoutMultiplier(e,r,o){if(Er(e,r))return _(0);let i=C.effectiveRange-dr(e),n=_(i).div(C.effectiveRange).mul(100);return _(100-o).div(n)}calculateRollBetweenTwoPayoutMultiplier(e,r,o,i){if(!U(e,o)&&!U(r,o))return _(0);let n=k(e)+k(r),t=_(n).div(C.effectiveRange).mul(100);return _(100-i).div(t)}}import D from"big.js";var Br=["Clubs","Diamonds","Hearts","Spades"],Sr=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],pr;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(pr||={});var Ar;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(Ar||={});var Lr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},_r=(e)=>{return new D(0).add(e.bets.reduce((o,i)=>o.add(i.amount),new D(0)))};class hr extends f{constructor(){super("BACCARAT")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(r);let i=e.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=i.values,t=n.slice(0,3),l=n.slice(3,6),B=[],a=0;for(let p of t.slice(0,2)){let L=this.mapRandomValueToCard(p),N=this.mapRandomValueToCardValue(p);B.push(L),a=(a+N)%10}let S=[],d=0;for(let p of l.slice(0,2)){let L=this.mapRandomValueToCard(p),N=this.mapRandomValueToCardValue(p);S.push(L),d=(d+N)%10}if(!this.isNaturalWin(a,d)){let p=this.shouldDrawThirdPlayerCard(a),L=null;if(p)L=this.mapRandomValueToCardValue(t[2]),B.push(this.mapRandomValueToCard(t[2])),a=(a+L)%10;if(this.shouldDrawThirdBankerCard(d,L))S.push(this.mapRandomValueToCard(l[2])),d=(d+this.mapRandomValueToCardValue(l[2]))%10}let h;if(a===d)h="TIE";else h=a>d?"PLAYER_WIN":"BANKER_WIN";let y=_r(r),{betType:w,multiplier:cr}=Lr[h],lr=new D(0).add(r.bets.filter((p)=>p.type===w).reduce((p,L)=>p.add(L.amount.mul(cr)),new D(0)));return{isFinished:!0,payoutMultiplier:y.gt(0)?lr.div(y):new D(0),outputs:{playerCards:B,playerHandValue:a,bankerCards:S,bankerHandValue:d,gameOutcome:h,result:i.values},randomValues:i}}validateGameInputs(e){if(e.bets.length===0)throw new Error("Must place at least a single bet.");if(!e.bets.every((r)=>r.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(e){let r=Br[Math.floor(e/13)],o=Sr[e%13];return{suit:r,rank:o}}isNaturalWin(e,r){let o=[8,9];return o.includes(e)||o.includes(r)}mapRandomValueToCardValue(e){let r=e%13;if(r===0)return 1;if(r>=10)return 10;return r+1}shouldDrawThirdPlayerCard(e){return e<=5}shouldDrawThirdBankerCard(e,r){if(r===null)return e<=5;if(e<=2)return!0;if(e===3)return r!==8;if(e===4)return[2,3,4,5,6,7].includes(r);if(e===5)return[4,5,6,7].includes(r);if(e===6)return[6,7].includes(r);return!1}}import yr from"big.js";class T{multipliers;constructor(e){this.multipliers=e}getMultipliers(e){let r=this.multipliers.get(e);if(r===void 0)throw new Error(`Multipliers for ${e} not found`);return r}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([e,r])=>({edge:e,multipliers:r}))}}var Tr;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Tr||={});var xr={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},sr=new T(new Map([[2,xr]])),Gr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ur extends f{constructor(){super("DIAMONDS")}determineGameResult({generator:e,edge:r}){let o=e.getRandomIntsWithReplacement({min:0,max:6,count:5}),i=sr.getMultipliers(r),n=o.values,t=this.calculatePayoutMultiplier(i,n);return{isFinished:!0,payoutMultiplier:yr(t),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(e,r){let o=new Map;for(let t of r){let l=o.get(t)||0;o.set(t,l+1)}let i=[...o.values()].filter((t)=>t>1),n=this.classifyResult(i);return n===null?0:e[n]}classifyResult(e){if(e.length>2)throw new Error(`Unexpected number of repeats ${e.length}`);let[r,o]=e;if(r===void 0)return null;if(o===void 0){let i=Gr[r];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${r}`);return i}return r===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import H from"big.js";var Rr;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Rr||={});class Mr extends f{constructor(){super("DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:0,max:1e4}),n=i.min,B=i.max-n+1-1,a=o.direction==="ABOVE"?B-o.selectedValue:o.selectedValue,S=new H(a).div(B).mul(100);return{isFinished:!0,payoutMultiplier:(o.direction==="ABOVE"?i.value>o.selectedValue:i.value<o.selectedValue)?new H(100-r).div(S):new H(0),outputs:{result:i.values},randomValues:i}}}import F from"big.js";var Cr;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(Cr||={});var Dr={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class Kr extends f{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Dr}constructor(e){super("KENO");this.multiplierOverrides=e;if(e)this.validateMultiplierOverrides(e)}determineGameResult({generator:e,edge:r,gameInputs:o}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(o.selectedNumbers.length===0)throw new Error("No numbers selected");if(o.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let l of o.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=e.getUniqueRandomInts({min:0,max:39,count:10}),n=o.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:n.length>0?new F(this.multipliers[o.selectedNumbers.length][o.riskLevel][n.length]??0):new F(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(e){for(let[r,o]of Object.entries(e)){let i=Number(r);for(let[n,t]of Object.entries(o))if(t.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${n}. Expected ${i+1}, but got ${t.length}`)}}}import x from"big.js";var Y=(e,r)=>{return e.gt(r)?e:r};var I=(e,r)=>{return e.lt(r)?e:r};class vr extends f{constructor(){super("LIMBO")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:1,max:4294967295}),n=i.max,t=new x(16777216),l=new x(1),B=new x(1e6),a=i.value,S=new x(a-1).div(n),d=(100-r)/100,h=t.div(S.mul(t).plus(1)).mul(d),y=Y(l,I(h,B));return{isFinished:!0,payoutMultiplier:y.gte(o.targetMultiplier)?new x(o.targetMultiplier):new x(0),outputs:{randomMultiplier:y,result:i.values},randomValues:i}}}import O from"big.js";var W=(e,r)=>{if(r<0||e<0||r>e)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(r>e-r)r=e-r;let o=1;for(let i=1;i<=r;i++)o=o*(e-i+1)/i;return o};class wr extends f{constructor(){super("MINES")}determineGameResult({generator:e,edge:r,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let l=e.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),B=l.values.some((w)=>o.selectedTiles.includes(w)),a=o.hasCashedOut||B,S=(100-r)/100,d=new O(W(25-o.minesCount,o.selectedTiles.length)).div(new O(W(25,o.selectedTiles.length))),y=o.hasCashedOut&&!B?new O(S).div(d):new O(0);return{isFinished:a,payoutMultiplier:y,outputs:{result:l.values},randomValues:l}}}import{Big as Nr}from"big.js";var Or;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(Or||={});var Vr=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}],Pr=new T(new Map([[1,Vr]]));class Ur extends f{constructor(){super("PLINKO")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(r.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(r.numberOfRows<8||r.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=Pr.getMultipliers(o),n=e.getRandomIntsWithReplacement({min:0,max:1,count:r.numberOfRows}),l=n.values.reduce((a,S)=>a+S,0);return{isFinished:!0,payoutMultiplier:new Nr(i.find((a)=>a.rows===r.numberOfRows)?.payout[r.riskLevel][l]??0),outputs:{result:n.values},randomValues:n}}}import{Big as c}from"big.js";var j=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],$=[37,...j],z=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],J=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Q=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],X=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Z=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],b=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],q=[0,1,2,3,37],m=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],g=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],s;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(s||={});var G;((o)=>{o.RED="RED";o.BLACK="BLACK"})(G||={});var u;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(u||={});var R;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(R||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});var kr;((r)=>r.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(kr||={});class E extends Error{static createValidationError(e){return new E("INPUT_VALIDATION_ERROR",e)}static isGameError(e){return e instanceof E}errorCode;constructor(e,r){super(r);this.errorCode=e}}var V=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&K(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&Hr(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&Wr(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&jr(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&qr(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},K=(e)=>{return j.includes(e)},Hr=(e)=>{if(e.length!==2)return!1;if(!e.every(K))return!1;return z.some(([r,o])=>r===e[0]&&o===e[1])},Wr=(e)=>{if(e.length!==3)return!1;if(!e.every(K))return!1;return Q.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},jr=(e)=>{if(e.length!==4)return!1;if(!e.every(K))return!1;return Z.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},qr=(e)=>{if(e.length!==6)return!1;if(!e.every(K))return!1;return m.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var P=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.basketBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&v(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&Fr(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&Yr(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&Ir(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.basketBets.every((r)=>r.amount.gte(0)))throw E.createValidationError("Invalid basket bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&$r(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},v=(e)=>{return $.includes(e)};function Fr(e){if(e.length!==2)return!1;if(!e.every(v))return!1;return J.some(([r,o])=>r===e[0]&&o===e[1])}var Yr=(e)=>{if(e.length!==3)return!1;if(!e.every(v))return!1;return X.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},Ir=(e)=>{if(e.length!==4)return!1;if(!e.every(v))return!1;return b.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},$r=(e)=>{if(e.length!==6)return!1;if(!e.every(v))return!1;return g.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var rr=(e)=>{return new c(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c(0)))},er=(e)=>{return new c(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.basketBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c(0)))},$e=(e)=>{return e.type==="european"?rr(e.inputs):er(e.inputs)};class or extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){V(r);let o=e.getRandomInt({min:0,max:36}),i=o.value,n=this.determineBetOutcomes(r,i),t=rr(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0)))}}class ir extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){P(r);let o=e.getRandomInt({min:0,max:37}),i=o.value,n=this.determineBetOutcomes(r,i),t=er(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>q.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>!q.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0||r===37)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c(0))).add(e.winningBets.basketBets.reduce((r,o)=>r.plus(o.amount.mul(7)),new c(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0)))}}class zr extends f{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new or,this.americanGame=new ir}determineGameResult(e){let{gameInputs:r,...o}=e;if(e.edge===2.7&&r.type==="european"){let i=this.europeanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:n,result:i.outputs.result}}}if(e.edge===5.3&&r.type==="american"){let i=this.americanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:n,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var Xe=(e)=>{if(e.type==="european")V(e.inputs);else P(e.inputs)};import{Big as Jr}from"big.js";var nr;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(nr||={});var tr;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})(tr||={});var Qr=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}],Xr=new T(new Map([[1,Qr]]));class Zr extends f{constructor(){super("WHEEL")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(!Object.values(tr).includes(r.segments))throw new Error("Invalid segments value");if(!Object.values(nr).includes(r.riskLevel))throw new Error("Invalid risk level");let i=Xr.getMultipliers(o).find((B)=>B.segments===r.segments);if(i===void 0)throw new Error(`Multiplier not found for segment ${r.segments}`);let n=e.getRandomInt({min:0,max:r.segments-1}),t=i.payout[r.riskLevel][n.value];if(t===void 0)throw new Error(`Payout not found for risk ${r.riskLevel} and value ${n.value}`);return{isFinished:!0,payoutMultiplier:new Jr(t),outputs:{result:n.values},randomValues:n}}}export{Xr as wheelMultipliers,Xe as validateRouletteGameInputs,Pr as plinkoMultipliers,$e as calculateRouletteBetAmount,_r as calculateBaccaratBetAmount,tr as WheelSegments,nr as WheelRiskLevel,Zr as Wheel,Br as VALID_SUITS,Sr as VALID_RANKS,Q as VALID_EUROPEAN_STREETS,j as VALID_EUROPEAN_STRAIGHTS,z as VALID_EUROPEAN_SPLITS,m as VALID_EUROPEAN_DOUBLE_STREETS,Z as VALID_EUROPEAN_CORNERS,X as VALID_AMERICAN_STREETS,$ as VALID_AMERICAN_STRAIGHTS,J as VALID_AMERICAN_SPLITS,g as VALID_AMERICAN_DOUBLE_STREETS,b as VALID_AMERICAN_CORNERS,zr as Roulette,fr as RollType,Or as PlinkoRiskLevel,Ur as Plinko,s as Parity,A as OrigamiGame,wr as Mines,vr as Limbo,Cr as KenoRiskLevel,Kr as Keno,u as Half,kr as GameErrorCode,E as GameError,f as Game,M as Dozen,Rr as DiceDirection,Mr as Dice,Tr as DiamondsResultType,ur as Diamonds,R as Column,G as Color,pr as BaccaratOutcome,Ar as BaccaratBetType,hr as Baccarat,ar as AdvancedDice,q as AMERICAN_BASKET};
|