z242

Casino 4.6: main.js

Feb 23rd, 2024 (edited)
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 58.64 KB | Gaming | 0 0
  1. if(Casino === undefined) var Casino = {};
  2.  
  3. Casino.launcher = function(){
  4.     if(Game.Objects['Chancemaker'].minigame) throw new Error("Casino prevented from loading by already present Chancemaker minigame.");
  5.    
  6.     var M = {};
  7.     M.parent = Game.Objects['Chancemaker'];
  8.     M.parent.minigame = M;
  9.     M.loadedCount = 0;
  10.     M.bankPercentage = false;
  11.     M.version = '4.6';
  12.     M.GameVersion = '2.052';
  13.  
  14.     const SECOND = 1;
  15.     const MINUTE = 60;
  16.     const HOUR = 60 * 60;
  17.     const DAY = 60 * 60 * 24;
  18.     const MONTH = 60 * 60 * 24 * 30;
  19.     const DECADE = 60 * 60 * 24 * 365.26 * 10;
  20.     const MILLENNIUM = 60 * 60 * 24 * 365.26 * 1000;
  21.     const CENTIMILLENNIUM = 60 * 60 * 24 * 365.26 * 1000 * 100;
  22.     const MAXIMUM_CHANCE = .265;        // Maximum probability of instant blackjack ("You make your own luck")
  23.     const SLOW_INCREASE = 1.3;      // Maximum percentage increase for large bank balances; increases per level
  24.     const LEVEL_INCREASE = .02;     // Percentage increase awarded for each Chancemaker level
  25.    
  26.     M.launch = function(){
  27.         var M = this;
  28.        
  29.         M.init = function(div){
  30.             M.saveString = M.parent.minigameSave;
  31.             M.div = div;
  32.            
  33.            
  34.             //***********************************
  35.             //    Initial support for multiple games
  36.             //***********************************
  37.             M.games = {
  38.                 choice: 0,
  39.                 Blackjack: {}
  40.             }
  41.            
  42.             M.cards = [];
  43.             M.cards.push({pip: 0, value:0, suit: 0});
  44.             for(var j = 0; j < 4; j++) for(var i = 1; i <= 13; i++) M.cards.push({pip: i, value: (i < 10 ? i : 10), suit: j});
  45.            
  46.             M.reshuffle = function(){
  47.                 M.Deck = [];
  48.                 for(var i = 0; i < M.deckCount; i++) for(var j = 1; j < M.cards.length; j++) M.Deck.push(M.cards[j]);
  49.             }
  50.            
  51.             M.cardImage = function(card){
  52.                 var left, top;
  53.                 if(!card.pip){
  54.                     left = 2 * 79;
  55.                     top = 4 * 123;
  56.                 } else {
  57.                     left = (card.pip - 1) * 79;
  58.                     top = (card.suit) * 123;
  59.                 }
  60.                 var str = '';
  61.                 str += '-' + left + 'px ';
  62.                 str += '-' + top + 'px ';
  63.                 return str;
  64.             }
  65.            
  66.             M.buildSidebar = function(){
  67.                 if(M.games.choice == 0) M.games.Blackjack.buildSidebar();
  68.             }
  69.            
  70.             M.buildTable = function(){
  71.                 if(M.games.choice == 0) M.games.Blackjack.buildTable();
  72.             }
  73.            
  74.             M.formatPercentage = function(value) {
  75.                 if(!M.percentagePrecision) {
  76.                     return value * 100 + '%';
  77.                 } else {
  78.                     var sign = (value < 0 ? '-' : '');
  79.                     value = Math.abs(value);
  80.                     if(value < M.minPercentage) {
  81.                         if(sign) {
  82.                             return '-' + M.minPercentageStr + 'to 0%';
  83.                         } else {
  84.                             return '<' + M.minPercentageStr;
  85.                         }
  86.                     } else {
  87.                         // Decided on floor instead of round, it is more similar to the expectations
  88.                         value = Math.round(value * 100 * M.percentagePow10);
  89.                         var low = value % M.percentagePow10;
  90.                         var low_digits = M.percentagePrecision;
  91.                         while(low > 0 && low % 10 === 0) {
  92.                             low /= 10;
  93.                             low_digits -= 1;
  94.                         }
  95.                         if(low) {
  96.                             low = '' + low;
  97.                             while(low.length < low_digits) {
  98.                                 low = '0' + low;
  99.                             }
  100.                             low = '.' + low;
  101.                         } else {
  102.                             low = '';
  103.                         }
  104.                         var high = Math.floor(value / M.percentagePow10);
  105.                         return sign + high + low + '%';
  106.                     }
  107.                 }
  108.             }
  109.            
  110.             M.setPercentagePrecision = function(precision) {
  111.                 if(precision < 0) {
  112.                     throw "In setPercentagePrecision: precision must be >= 0, got " + precision;
  113.                 } else {
  114.                     M.percentagePrecision = precision;
  115.                     if(!precision) {
  116.                         M.minPercentage = null;
  117.                         M.minPercentageStr = null;
  118.                         M.percentagePow10 = null;
  119.                    } else {
  120.                         M.minPercentage = Math.pow(10, -precision - 2);
  121.                         M.minPercentageStr = '' + Math.pow(10, -precision) + '%';
  122.                         M.percentagePow10 = Math.pow(10, precision);
  123.                    }      
  124.                 }
  125.             }
  126.            
  127.            
  128.             //***********************************
  129.             //    Blackjack
  130.             //***********************************
  131.             M.games.Blackjack = {
  132.                 wins : 0,
  133.                 winsT : 0,
  134.                 losses : 0,
  135.                 netWins : 0,
  136.                 ties : 0,
  137.                 ownLuckWins : -3,
  138.                 ownLuckPermanent : false,
  139.                 doubleDown : 0,
  140.                 splits : 0,
  141.                 splitsT : 0,
  142.                 netTotal : 0,
  143.                 showOdds : false,
  144.                
  145.                 phases : {
  146.                     inactive: 0,
  147.                     deal: 1,
  148.                     firstTurn: 2,
  149.                     playerTurn: 3,
  150.                     dealerTurn: 4,
  151.                     evaluate: 5,
  152.                     surrender: 6
  153.                 },
  154.                
  155.                 getHandValue : function(hand){
  156.                     hand.value = 0;
  157.                     for(var i = 0; i < hand.cards.length; i++) hand.value += hand.cards[i].value;
  158.                     for(var i = 0; i < hand.cards.length; i++) if(hand.value <= 11 && hand.cards[i].value == 1) hand.value += 10;
  159.                 },
  160.                
  161.                 drawCard : function(deck){
  162.                     var i = Math.floor(Math.random() * deck.length);
  163.                     var res = deck[i];
  164.                     deck.splice(i, 1);
  165.                    
  166.                     if(M.Deck.length < (M.minDecks * 52)){
  167.                         Game.Unlock('Counting cards');
  168.                         M.reshuffle();
  169.                         Game.Popup('Decks reshuffled!', Game.mouseX, Game.mouseY);
  170.                     }
  171.                     return res;
  172.                 },
  173.                
  174.                 hit : function(hand, player){
  175.                     let dealerCards = M.hands.dealer.cards;
  176.                     let ace = false;
  177.  
  178.                     this.getHandValue(hand);
  179.                     var oldValue = hand.value;
  180.                     hand.cards.push(this.drawCard(M.Deck));
  181.                     this.getHandValue(hand);
  182.                    
  183.                     if (hand.value == 21 && M.hands.player[M.currentPlayerHand].cards.length > 2) {
  184.                         if (M.hands.dealer.cards.length > 2) {
  185.                             if (!Game.Has('Tiebreaker'))
  186.                                 for (let i in dealerCards) {
  187.                                     if (dealerCards[i].value == 1) ace = true;
  188.                                 }
  189.                             if (ace == false) {
  190.                                 this.stand();
  191.                             }
  192.                         } else
  193.                             this.stand();
  194.                     } else if (hand.value > 21){
  195.                         if(player){
  196.                             if (this.losses >= 3) Game.Unlock('Math lessons');
  197.                             this.stand();
  198.                         }
  199.                     } else if(player && oldValue >= 17 && hand.value > oldValue){
  200.                         Game.Win('I like to live dangerously');
  201.                     }
  202.                    
  203.                     this.buildTable();
  204.                 },
  205.                
  206.                 doubledown : function(){
  207.                     Game.Spend(M.betAmount);
  208.                     if(++M.games.Blackjack.doubleDown >= 7) Game.Unlock('Double down');
  209.                     M.hands.player[M.currentPlayerHand].betMultiplier = 2;
  210.                     this.hit(M.hands.player[M.currentPlayerHand], true);
  211.                     this.stand();
  212.                 },
  213.                
  214.                 split : function(){
  215.                     Game.Spend(M.betAmount);
  216.                    
  217.                     let splitAces = M.hands.player[0].cards[0] == 1;
  218.                     M.hands.player.push({value:0, cards:[]});
  219.                     M.hands.player[1].cards.push(M.hands.player[0].cards[1]);
  220.                     M.hands.player[0].cards.splice(1, 1);
  221.                     M.hands.player[0].splitFirstTurn = true;
  222.                     M.hands.player[1].splitFirstTurn = true;
  223.                     M.games.Blackjack.splits += 2;
  224.                     M.games.Blackjack.splitsT++;
  225.  
  226.                     this.hit(M.hands.player[0], true);
  227.                     this.hit(M.hands.player[1], true);
  228.                    
  229.                     for (i = 0; i < 2; i++)
  230.                         if (M.hands.player[i].value == 21 || M.hands.player[i].cards.length == 2 && Game.Has('Strong split aces') == false && splitAces) {
  231.                             Game.tooltip.shouldHide = 1;
  232.                             M.currentPlayerHand = i;
  233.                             M.games.Blackjack.phase = M.games.Blackjack.phases.playerTurn;
  234.                             M.games.Blackjack.stand();
  235.                         } else {
  236.                             this.buildSidebar();
  237.                             this.buildTable();
  238.                         }
  239.                     if(!Game.Has('Strong split aces') && M.games.Blackjack.splitsT >= 3) Game.Unlock('Strong split aces');
  240.                 },
  241.                
  242.                 surrender : function() {
  243.                     this.phase = this.phases.surrender;
  244.                     M.nextBeat = Date.now() + M.beatLength;
  245.                     this.buildSidebar();
  246.                     this.buildTable();
  247.                 },
  248.                
  249.                 stand : function(){
  250.                     if(M.currentPlayerHand >= (M.hands.player.length - 1)){
  251.                         var allBust = true;
  252.                         var all21 = true
  253.  
  254.                         for(var i = 0; i < M.hands.player.length; i++) if(M.hands.player[i].value <= 21) allBust = false;
  255.                         for(var i = 0; i < M.hands.player.length; i++) if(M.hands.player[i].value != 21) all21 = false;
  256.                         if(allBust || all21 && Game.Has('Tiebreaker') && M.hands.player[M.currentPlayerHand].cards.length > 2){
  257.                             M.nextBeat = Date.now() + M.beatLength;
  258.                             this.phase = this.phases.evaluate;
  259.                         }else{
  260.                             M.hands.dealer.cards[1] = this.hiddenCard;
  261.                             this.getHandValue(M.hands.dealer);
  262.                             this.phase = this.phases.dealerTurn;
  263.                             if(M.hands.dealer.value >= 17){
  264.                                 M.currentPlayerHand = 0;
  265.                                 this.phase = this.phases.evaluate;
  266.                             }
  267.                             M.nextBeat = Date.now() + M.beatLength;
  268.                         }
  269.                        
  270.                     }else{
  271.                         M.nextBeat = Date.now() + M.beatLength;
  272.                         M.currentPlayerHand++;
  273.                     }
  274.                    
  275.                     this.buildSidebar();
  276.                     this.buildTable();
  277.                 },
  278.                
  279.                 instantWinChance : function(){ return (Game.Has('I make my own luck') ? Math.min(1 - Math.pow(1 - M.chancemakerChance * (Game.Has('Infinite Improbability Drive') ? 2 : 1), M.parent.amount), MAXIMUM_CHANCE) : 0); },
  280.                
  281.                 toggleBetMode : function(){
  282.                     if(M.betMode == 1 && Game.Has('Raise the stakes')) M.betMode = 2;
  283.                     else if(M.betMode < 3 && Game.Has('High roller!')) M.betMode = 3;
  284.                     else if(M.betMode < 4 && Game.Has('Big spender!')) M.betMode = 4;
  285.                     else if(M.betMode < 5 && Game.Has('Main player')) M.betMode = 5;
  286.                     else if(M.betMode < 6 && Game.Has('True gambler')) M.betMode = 6;
  287.                     else if(M.betMode < 7 && Game.Has('Immortal bettor')) M.betMode = 7;
  288.                     else if(M.betMode < 8 && Game.Has('Gambler for the ages')) M.betMode = 8;
  289.                     else M.betMode = 1;
  290.                    
  291.                     this.buildSidebar();
  292.                 },
  293.                
  294.                 toggleBetChoice : function(){
  295.                     if(M.betChoice == 1 && Game.Has('Double or nothing')) M.betChoice = 2;
  296.                     else if(M.betChoice < 3 && Game.Has('Stoned cows')) M.betChoice = 5;
  297.                     else if(M.betChoice < 10 && Game.Has('Game for Pros')) M.betChoice = 20;
  298.                     else M.betChoice = 1;
  299.                    
  300.                     this.buildSidebar();
  301.                 },
  302.                
  303.                 dealProbabilities : function(){
  304.                     var res = '<div style="padding:8px 4px; min-width:125px;">';
  305.                     var iwc = M.games.Blackjack.instantWinChance();
  306.                     var chances = [];
  307.                     var cards = [];
  308.                     var possibles = M.Deck.length * (M.Deck.length - 1) / 2;
  309.                    
  310.                     for(var i = 4; i <= 21; i++) chances[i] = 0;
  311.                     for(var i = 1; i <= 10; i++) cards[i] = 0;
  312.                    
  313.                     for(var i = 0; i < M.Deck.length; i++){
  314.                         var card = M.Deck[i];
  315.                         cards[card.value]++;
  316.                     }
  317.                    
  318.                     for(var i = 1; i <= 10; i++)
  319.                     for(var j = 1; j <= 10; j++){
  320.                         var val = j + i;
  321.                         if(i == 1 || j == 1) val += 10;
  322.                         chances[val] += cards[i] * (cards[j] + (i == j ? -1 : 0)) / possibles / 2;
  323.                     }
  324.                    
  325.                     chances[21] = 1 - (1 - chances[21]) * (1 - iwc);
  326.                     for(var i = 4; i <= 20; i++) chances[i] *= 1 - iwc;
  327.                    
  328.                     if(chances[21] != 0) res += '<b>Blackjack : </b>' + M.formatPercentage(chances[21]) + '<br/>';
  329.                     for(var i = 20; i >= 4; i--) if(chances[i] != 0) res += '<b>' + i + ' : </b>' + M.formatPercentage(chances[i]) + '<br/>';
  330.                    
  331.                     return res + '</div>';
  332.                 },
  333.                
  334.                 drawProbabilities : function(){
  335.                     var res = '<div style="padding:8px 4px; min-width:125px;">';
  336.                     var cards = [];
  337.                     var outcomes = [];
  338.                     outcomes[22] = 0;
  339.                    
  340.                     for(var i = 1; i <= 10; i++) cards[i] = 0;
  341.                     for(var i = 0; i < M.Deck.length; i++){
  342.                         var card = M.Deck[i];
  343.                         cards[card.value]++;
  344.                     }
  345.                     cards[M.games.Blackjack.hiddenCard.value]++;
  346.                    
  347.                     for(var i = 1; i <= 10; i++){
  348.                         var prob = cards[i] / (M.Deck.length + 1);
  349.                         var value = 0;
  350.                         var hand = M.hands.player[M.currentPlayerHand];
  351.                        
  352.                         for(var j = 0; j < hand.cards.length; j++) value += hand.cards[j].value;
  353.                         value += i;
  354.                         if(value <= 11 && i == 1) value += 10;
  355.                         for(var j = 0; j < hand.cards.length; j++) if(value <= 11 && hand.cards[j].value == 1) value += 10;
  356.                        
  357.                         if(value > 21) outcomes[22] += prob;
  358.                         else outcomes[value] = prob;
  359.                     }
  360.                    
  361.                     if(outcomes[22]) res += '<b>Bust : </b>' + M.formatPercentage(outcomes[22]) + '<br/>';
  362.                     for(var i = 21; i > 5; i--) if(outcomes[i]) res += '<b>' + i + ' : </b>' + M.formatPercentage(outcomes[i]) + '<br/>';
  363.                    
  364.                     return res + '</div>';
  365.                 },
  366.                
  367.                 standProbabilities : function(){
  368.                     var res = '<div style="padding:8px 4px; min-width:125px;">';
  369.                     var cards = [];
  370.                     var outcomes = [];
  371.                     var simHand = [];
  372.                     var winChance = 0;
  373.                     var lossChance = 0;
  374.                    
  375.                     for(var i = 0; i < M.hands.dealer.cards.length; i++) if(M.hands.dealer.cards[i].value) simHand.push(M.hands.dealer.cards[i].value);
  376.                     for(var i = 17; i <= 22; i++) outcomes[i] = 0;
  377.                    
  378.                     for(var i = 1; i <= 10; i++) cards[i] = 0;
  379.                     for(var i = 0; i < M.Deck.length; i++){
  380.                         var card = M.Deck[i];
  381.                         cards[card.value]++;
  382.                     }
  383.                     cards[M.games.Blackjack.hiddenCard.value]++;
  384.                    
  385.                     M.games.Blackjack.recursiveDealerSim(cards, outcomes, simHand, M.Deck.length + 1, 1);
  386.                    
  387.                     winChance += outcomes[22];
  388.                     if (Game.Has('Tiebreaker')) {
  389.                         for(var i = 21; i >= 17; i--)
  390.                             if(i >= M.hands.player[M.currentPlayerHand].value + 1)
  391.                                 lossChance += outcomes[i];
  392.                             else
  393.                                 winChance += outcomes[i];
  394.                     } else if (Game.Has('Push plus')) {
  395.                         for(var i = 21; i >= 17; i--)
  396.                             if(i >= M.hands.player[M.currentPlayerHand].value)
  397.                                 lossChance += outcomes[i];
  398.                             else
  399.                                 winChance += outcomes[i] * 1.5;
  400.                     }
  401.                     if(winChance) res += '<b>Win : </b><span class="green">' + M.formatPercentage(winChance) + '</span><br/>'
  402.                     if(lossChance) res += '<b>Lose : </b><span class="red">' + M.formatPercentage(lossChance) + '</span><br/>'
  403.                    
  404.                     if(outcomes[22]) res += '<br/><b>Dealer chances</b><br/><br/><b>Bust : </b>' + M.formatPercentage(outcomes[22]) + '<br/>';
  405.                     for(var i = 21; i >= 17; i--) if(outcomes[i]) res += '<b>' + i + ' : </b>' + M.formatPercentage(outcomes[i]) + '<br/>';
  406.                    
  407.                     return res + '</div>';
  408.                 },
  409.                
  410.                 recursiveDealerSim : function(cards, outcomes, simHand, deckLength, stateChance){
  411.                     for(var i = 1; i <= 10; i++){
  412.                         if(cards[i]){
  413.                             simHand.push(i);
  414.                            
  415.                             var value = 0;
  416.                             var chance = stateChance * cards[i] / deckLength;
  417.                             for(var j = 0; j < simHand.length; j++) value += simHand[j];
  418.                             for(var j = 0; j < simHand.length; j++) if(value <= 11 && simHand[j] == 1) value += 10;
  419.                            
  420.                             if(value > 21) value = 22;
  421.                             if(value >= 17){
  422.                                 outcomes[value] += chance;
  423.                             }
  424.                             else{
  425.                                 cards[i]--;
  426.                                 M.games.Blackjack.recursiveDealerSim(cards, outcomes, simHand, deckLength - 1, chance);
  427.                                 cards[i]++;
  428.                             }
  429.                            
  430.                             simHand.splice(simHand.length - 1);
  431.                         }
  432.                     }
  433.                 },
  434.                
  435.                 buildSidebar : function(){
  436.                     let percentageCookies = Game.cookies * M.betChoice / 1000;
  437.                     let timeCookies = Game.cookiesPsRawHighest * 20 * M.betLongest;
  438.                     let maxTime = Math.min(percentageCookies, timeCookies);
  439.                     let betLimited = false; M.bankPercentage == true && maxTime != percentageCookies || M.bankPercentage == false && M.betAmount > Game.cookies * Math.max(9 - M.betMode, 2) * .01;
  440.                    
  441.                     const timeModes = [
  442.                         {
  443.                             mode: 'second',
  444.                             betTime: SECOND
  445.                         },
  446.                         {
  447.                             mode: 'minute',
  448.                             betTime: MINUTE
  449.                         },
  450.                         {
  451.                             mode: 'hour',
  452.                             betTime: HOUR
  453.                         },
  454.                         {
  455.                             mode: 'day',
  456.                             betTime: DAY
  457.                         },
  458.                         {
  459.                             mode: 'month',
  460.                             betTime: MONTH
  461.                         },
  462.                         {
  463.                             mode: 'decade',
  464.                             betTime: DECADE
  465.                         },
  466.                         {
  467.                             mode: 'millenni',
  468.                             betTime: MILLENNIUM
  469.                         },
  470.                         {
  471.                             mode: 'centimillenni',
  472.                             betTime: CENTIMILLENNIUM
  473.                         }
  474.                     ];
  475.  
  476.                     let {
  477.                         mode,
  478.                         betTime
  479.                     } = timeModes[M.betMode - 1];
  480.                     M.betTime = betTime;
  481.                    
  482.                     if (M.bankPercentage == true) {
  483.                         if (timeCookies < percentageCookies) {
  484.                             M.betAmount = timeCookies + (percentageCookies - timeCookies) * ((SLOW_INCREASE + (Game.Objects['Chancemaker'].level - 1) * LEVEL_INCREASE) / 2);
  485.                         } else {
  486.                             M.betAmount = Math.min(percentageCookies, timeCookies);
  487.                         }
  488.                         if (maxTime != percentageCookies) betLimited = true;
  489.                     } else {
  490.                         M.betAmount = Math.min(Math.max(9 - M.betMode, 2) * .01 * Game.cookies, Game.cookiesPsRawHighest * M.betChoice * M.betTime);
  491.                         if (M.betAmount != Game.cookiesPsRawHighest * M.betChoice * M.betTime) betLimited = true;
  492.                     }
  493.                     var str = '';
  494.                     var strBet;
  495.                    
  496.                     if (M.bankPercentage == true)
  497.                         strBet = Beautify(M.betChoice / 10, 1);
  498.                     else
  499.                         strBet = Beautify(M.betChoice);
  500.                     if(Game.Has('Double or nothing') || Game.Has('Stoned cows') || Game.Has('Game for Pros'))
  501.                         str += '<div>Bet: <a class="option" id="casinoBetChoiceToggle" >' + strBet + '</a> ';
  502.                     else str += '<div>Bet: ' + strBet + ' ';
  503.                    
  504.                     if (M.bankPercentage == true)
  505.                         str += 'percent of bank</div>';
  506.                     else if(Game.Has('Raise the stakes') || Game.Has('High roller!') || Game.Has('Big spender!') || Game.Has('Main player') || Game.Has('True gambler') || Game.Has('Immortal Bettor') || Game.Has('Gambler for the ages')) {
  507.                         str += '<a class="option" id="casinoBetModeToggle" >' + mode + (mode.endsWith('millenni') ? (strBet == '1' ? 'um' : 'a') : (strBet == '1' ? '' : 's')) + '</a> of CPS</div>';
  508.                     } else {
  509.                         str += mode + (strBet == '1' ? '' : 's') + ' of CPS</div>';
  510.                     }
  511.  
  512.                     if (betLimited == false) {
  513.                         str += '<div id="casinoCurrentBet">(' + Beautify(M.betAmount);
  514.                     } else if (M.bankPercentage == true) {
  515.                         str += '<div>(' + Beautify(percentageCookies);
  516.                     } else {
  517.                         str += '<div>(' + Beautify(Game.cookiesPsRawHighest * M.betChoice * M.betTime);
  518.                     }
  519.                     str += ' cookies)</div>';
  520.                     if (betLimited == true) {
  521.                         str += '<div><br>Maximum bet limit reached</div>';
  522.                         if (M.bankPercentage == true) {
  523.                             str += `<div>Actual bet:  <b>${Beautify(M.betAmount / (Game.cookies / 100), (maxTime == percentageCookies ? 1 : 3))}%</b>`;
  524.                         } else {
  525.                             str += `<div>Actual bet:  <b>${Math.max(9 - M.betMode, 2)}%</b> of bank`;
  526.                         }
  527.                         str += '<div id="casinoCurrentBet">(' + Beautify(M.betAmount) + ' cookies)</div>';
  528.                         str += '</div>';
  529.                     }
  530.                     M.moneyL.innerHTML = str;
  531.                    
  532.                     var str = '<table class="casinoActionsTable">';
  533.                     if(this.phase == this.phases.inactive) str += '<tr><td><div class="listing"><a class="option" id="casinoDeal" >Deal</a></div></td></tr>';
  534.                     else str += '<tr><td><div class="listing">Deal</div></td></tr>';
  535.                     if(this.phase == this.phases.firstTurn || this.phase == this.phases.playerTurn) str += '<tr><td><div class="listing"><a class="option" id="casinoHit" >Hit</a></div></td></tr>';
  536.                     else str += '<tr><td><div class="listing">Hit</div></td></tr>';
  537.                     if((this.phase == this.phases.firstTurn || M.games.Blackjack.splits && Game.Has('Double down') && M.hands.player[M.currentPlayerHand].splitFirstTurn) && Game.cookies >= M.betAmount) {
  538.                         str += '<tr><td><div class="listing"><a class="option" id="casinoDoubledown" >Double Down</a></div></td></tr>';
  539.                     } else str += '<tr><td><div class="listing">Double Down</div></td></tr>';
  540.                     if(this.phase == this.phases.firstTurn && Game.cookies >= M.betAmount && M.hands.player[0].cards[0].pip == M.hands.player[0].cards[1].pip) str += '<tr><td><div class="listing"><a class="option" id="casinoSplit" >Split</a></div></td></tr>';
  541.                     else str += '<tr><td><div class="listing">Split</div></td></tr>';
  542.                     if(Game.Has('Surrender') && this.phase == this.phases.firstTurn || M.games.Blackjack.splits && M.hands.player[M.currentPlayerHand].splitFirstTurn) {
  543.                         str += '<tr><td><div class="listing"><a class="option" id="casinoSurrender" >Surrender</a></div></td></tr>';
  544.                     } else str += '<tr><td><div class="listing">Surrender</div></td></tr>';
  545.                     if(this.phase == this.phases.firstTurn || this.phase == this.phases.playerTurn) str += '<tr><td><div class="listing"><a class="option" id="casinoStand" >Stand</a></div></td></tr>';
  546.                     else str += '<tr><td><div class="listing">Stand</div></td></tr>';
  547.                     str += '</table>';
  548.                     M.actionsL.innerHTML = str;
  549.                    
  550.                    
  551.                    
  552.                     if(l('casinoBetChoiceToggle')) AddEvent(l('casinoBetChoiceToggle'), 'click', function(){return function(){
  553.                         PlaySound('snd/tick.mp3');
  554.                         M.games.Blackjack.toggleBetChoice();
  555.                     }}());
  556.                     if(l('casinoBetModeToggle')) AddEvent(l('casinoBetModeToggle'), 'click', function(){return function(){
  557.                         PlaySound('snd/tick.mp3');
  558.                         M.games.Blackjack.toggleBetMode();
  559.                     }}());
  560.                     if(l('casinoDeal')) AddEvent(l('casinoDeal'), 'click', function(){return function(){
  561.                         PlaySound('snd/tick.mp3');
  562.                         Game.tooltip.shouldHide = 1;
  563.                         M.games.Blackjack.istep = 0;
  564.                         M.games.Blackjack.phase = M.games.Blackjack.phases.deal;
  565.                         M.nextBeat = Date.now();
  566.                     }}());
  567.                     if(l('casinoHit')) AddEvent(l('casinoHit'), 'click', function(){return function(){
  568.                         PlaySound('snd/tick.mp3');
  569.                         Game.tooltip.shouldHide = 1;
  570.                         M.games.Blackjack.phase = M.games.Blackjack.phases.playerTurn;
  571.                         M.games.Blackjack.hit(M.hands.player[M.currentPlayerHand], true);
  572.                         M.hands.player[M.currentPlayerHand].splitFirstTurn = false;
  573.                         M.games.Blackjack.buildSidebar();
  574.                     }}());
  575.                     if(l('casinoDoubledown')) AddEvent(l('casinoDoubledown'), 'click', function(){return function(){
  576.                         PlaySound('snd/tick.mp3');
  577.                         Game.tooltip.shouldHide = 1;
  578.                         M.games.Blackjack.phase = M.games.Blackjack.phases.playerTurn;
  579.                         M.games.Blackjack.doubledown();
  580.                     }}());
  581.                     if(l('casinoSplit')) AddEvent(l('casinoSplit'), 'click', function(){return function(){
  582.                         PlaySound('snd/tick.mp3');
  583.                         Game.tooltip.shouldHide = 1;
  584.                         M.games.Blackjack.phase = M.games.Blackjack.phases.playerTurn;
  585.                         M.games.Blackjack.split();
  586.                     }}());
  587.                     if(l('casinoSurrender')) AddEvent(l('casinoSurrender'), 'click', function(){return function(){
  588.                         PlaySound('snd/tick.mp3');
  589.                         Game.tooltip.shouldHide = 1;
  590.                         M.games.Blackjack.phase = M.games.Blackjack.phases.playerTurn;
  591.                         M.games.Blackjack.surrender();
  592.                     }}());
  593.                     if(l('casinoStand')) AddEvent(l('casinoStand'), 'click', function(){return function(){
  594.                         PlaySound('snd/tick.mp3');
  595.                         Game.tooltip.shouldHide = 1;
  596.                         M.games.Blackjack.phase = M.games.Blackjack.phases.playerTurn;
  597.                         M.games.Blackjack.stand();
  598.                     }}());
  599.                    
  600.                     if(Game.Has('Actually, do tell me the odds')){
  601.                         if(l('casinoDeal')) Game.attachTooltip(l('casinoDeal'), this.dealProbabilities, 'this');
  602.                         if(l('casinoHit')) Game.attachTooltip(l('casinoHit'), this.drawProbabilities, 'this');
  603.                         if(l('casinoDoubledown')) Game.attachTooltip(l('casinoDoubledown'), this.drawProbabilities, 'this');
  604.                         //if(l('casinoSplit')) Game.attachTooltip(l('casinoSplit'), this.drawProbabilities, 'this');
  605.                         //if(l('casinoSurrender')) Game.attachTooltip(l('casinoSurrender'), this.standProbabilities, 'this');
  606.                         if(l('casinoStand')) Game.attachTooltip(l('casinoStand'), this.standProbabilities, 'this');
  607.                     }
  608.                 },
  609.                
  610.                 buildTable : function(){
  611.                     this.getHandValue(M.hands.dealer);
  612.                     this.getHandValue(M.hands.player[M.currentPlayerHand]);
  613.                    
  614.                     var str = '<table id="casinoBJTable">';
  615.                     str += '<tr><td>Dealer\'s hand:' + (Game.Has('Math lessons') ? ('<br/>Score: ' + M.hands.dealer.value) : '') + '</td>';
  616.                     for(var i = 0; i < M.hands.dealer.cards.length; i++) str += '<td><div class="casinoBJCardImage" style="background-image:url(' + M.cardsImage + '); background-position:' + M.cardImage(M.hands.dealer.cards[i]) + ';" /></td>';
  617.                     str += '</tr>';
  618.                     str += '<tr style="height:75px;"><td></td></tr>';
  619.                     str += '<tr><td>Player\'s hand' + (M.hands.player.length > 1 ? (' (' + (M.currentPlayerHand + 1) + ' of ' + M.hands.player.length + ')') : '') + ':' + (Game.Has('Math lessons') ? ('<br/>Score: ' + M.hands.player[M.currentPlayerHand].value) : '') + '</td>'
  620.                     for(var i = 0; i < M.hands.player[M.currentPlayerHand].cards.length; i++) str += '<td><div class="casinoBJCardImage" style="background-image:url(' + M.cardsImage + '); background-position:' + M.cardImage(M.hands.player[M.currentPlayerHand].cards[i]) + ';" /></td>';
  621.                     str += '</tr>';
  622.                     str += '</table>';
  623.                    
  624.                     M.gameL.innerHTML = str;
  625.                    
  626.                    
  627.                     var cardCount = 0;
  628.                     for(var i = 0; i < M.Deck.length; i++){
  629.                         if(M.Deck[i].value >= 2 && M.Deck[i].value <= 6) cardCount--;
  630.                         else if(M.Deck[i].value == 1 || M.Deck[i].value >= 10) cardCount++;
  631.                     }
  632.                     if(this.hiddenCard && M.hands.dealer.cards[1] && M.hands.dealer.cards[1].value == 0){
  633.                         if(this.hiddenCard.value >= 2 && this.hiddenCard.value <= 6) cardCount--;
  634.                         else if(this.hiddenCard.value == 1 || this.hiddenCard.value >= 10) cardCount++;
  635.                     }
  636.                     M.infoL.innerHTML = 'Hands won : ' + Beautify(this.wins) + ' (total : ' + Beautify(this.winsT) + ')' + '<br/>Net bets won : ' + this.netWins + ((Game.Has('Counting cards') ? ('<br/>Cards left in deck : ' + M.Deck.length + '<br/>Count : ' + cardCount) : ''));
  637.                    
  638.                 },
  639.                
  640.                 logic : function(){
  641.                     // run each frame
  642.                     // For some reason, certain upgrades appear and disappear randomly
  643.                     // We can reconstruct their proper values, though
  644.                     if (!Game.Has('Actually, do tell me the odds') && M.games.Blackjack.showOdds) {
  645.                         Game.Upgrades['Actually, do tell me the odds'].unlocked = 1;
  646.                         Game.Upgrades['Actually, do tell me the odds'].bought = 1;
  647.                     }
  648.                     if (Game.Has('Infinite Probability Drive')) {
  649.                         if (M.Blackjack.ownLuckWins < 0 )
  650.                             M.Blackjack.ownLuckPermanent = true;
  651.                         else {
  652.                             if (Game.has('Infinite Probability Drive') && M.Blackjack.ownLuckWins < 42  && !M.Blackjack.ownLuckPermanent) {
  653.                                 Game.Upgrades['Infinite Improbability Drive'].bought = 0;
  654.                                 Game.Upgrades['Infinite Improbability Drive'].unlocked = 0;
  655.                             }
  656.                         }
  657.                     }
  658.                     if (Game.Has('Stoned cows') && !Game.Has('Double or nothing')) {
  659.                         Game.Upgrades['Double or nothing'].unlocked = 1;
  660.                         Game.Upgrades['Double or nothing'].earn();
  661.                     }
  662.  
  663.                     if (this.phase == this.phases.inactive) {
  664.                         let percentageCookies = Game.cookies * M.betChoice / 1000;
  665.                         let timeCookies = Game.cookiesPsRawHighest * 20 * M.betLongest;
  666.    
  667.                         if (M.bankPercentage == true) {
  668.                             if (timeCookies < percentageCookies) {
  669.                                 M.betAmount = timeCookies + (percentageCookies - timeCookies) * ((SLOW_INCREASE + (Game.Objects['Chancemaker'].level - 1) * LEVEL_INCREASE) / 2);
  670.                             } else {
  671.                                 M.betAmount = Math.min(percentageCookies, timeCookies);
  672.                             }
  673.                         } else {
  674.                             if(M.betMode == 1){
  675.                                 M.betAmount = Math.min(Game.cookies * .08, Game.cookiesPsRawHighest * M.betChoice);
  676.                             }else if(M.betMode == 2){
  677.                                 M.betAmount = Math.min(Game.cookies * .07, Game.cookiesPsRawHighest * M.betChoice * MINUTE);
  678.                             }else if(M.betMode == 3){
  679.                                 M.betAmount = Math.min(Game.cookies * .06, Game.cookiesPsRawHighest * M.betChoice * HOUR);
  680.                             }else if(M.betMode == 4){
  681.                                 M.betAmount = Math.min(Game.cookies * .05, Game.cookiesPsRawHighest * M.betChoice * DAY);
  682.                             }else if(M.betMode == 5){
  683.                                 M.betAmount = Math.min(Game.cookies * .04, Game.cookiesPsRawHighest * M.betChoice * MONTH);
  684.                             }else if(M.betMode == 6){
  685.                                 M.betAmount = Math.min(Game.cookies * .03, Game.cookiesPsRawHighest * M.betChoice * DECADE);
  686.                             }else if(M.betMode == 7){
  687.                                 M.betAmount = Math.min(Game.cookies * .02, Game.cookiesPsRawHighest * M.betChoice * MILLENNIUM);
  688.                             }else if(M.betMode == 8){
  689.                                 M.betAmount = Math.min(Game.cookies * .02, Game.cookiesPsRawHighest * M.betChoice * CENTIMILLENNIUM);
  690.                             }
  691.                         }
  692.                     }
  693.                    
  694.                     if(Date.now() > M.nextBeat){
  695.                         M.nextBeat = Date.now() + M.beatLength;
  696.                         var outcome = 0;
  697.                        
  698.                         if(this.phase == this.phases.inactive){
  699.  
  700.                         }
  701.                         else if(this.phase == this.phases.deal){
  702.                             if(this.istep == 0){
  703.                                 if(M.Deck.length < (M.minDecks * 52)) M.reshuffle();
  704.                                 M.hands = {dealer:{value:0, cards:[]}, player:[{value:0, splitFirstTurn:true, betMultiplier:1, cards:[]}]};
  705.                                 M.currentPlayerHand = 0;
  706.                                 Game.Spend(M.betAmount);
  707.                                
  708.                                 this.hit(M.hands.player[0], true);
  709.                                 this.istep = 1;
  710.                             }
  711.                             else if(this.istep == 1){
  712.                                 this.hit(M.hands.dealer, false);
  713.                                 this.istep = 2;
  714.                             }
  715.                             else if(this.istep == 2){
  716.                                 this.hit(M.hands.player[0], true);
  717.                                 this.istep = 3;
  718.                             }
  719.                             else if(this.istep == 3){
  720.                                 this.hit(M.hands.dealer, false);
  721.                                
  722.                                 this.hiddenCard = M.hands.dealer.cards[1];
  723.                                 M.hands.dealer.cards[1] = M.cards[0];
  724.                                
  725.                                 this.phase = this.phases.firstTurn;
  726.                                 if (M.games.Blackjack.splits) {
  727.                                 } else if(M.hands.player[0].value == 21){
  728.                                     M.hands.dealer.cards[1] = this.hiddenCard;
  729.                                     outcome = 'playerblackjack';
  730.                                     this.phase = this.phases.inactive;
  731.                                    
  732.                                 } else if((random = Math.random()) < (chance = this.instantWinChance())){
  733.                                     M.hands.dealer.cards[1] = this.hiddenCard;
  734.                                    
  735.                                     M.hands.player[0].cards[0] = {pip:choose([10,11,12,13]), value:10, suit:choose([0,1,2,3])};
  736.                                     M.hands.player[0].cards[1] = {pip:1, value:1, suit:choose([0,1,2,3])};
  737.                                    
  738.                                     outcome = 'instantWin';
  739.                                     this.phase = this.phases.inactive;
  740.                                    
  741.                                 } else if(M.hands.dealer.value == 21){
  742.                                     M.hands.dealer.cards[1] = this.hiddenCard;
  743.                                     outcome = 'dealerblackjack';
  744.                                     this.phase = this.phases.inactive;
  745.                                    
  746.                                 } else{
  747.                                    
  748.                                 }
  749.                             }
  750.                            
  751.                             this.buildTable();
  752.                             this.buildSidebar();
  753.                             M.hands.player[M.currentPlayerHand].splitFirstTurn = false;
  754.                         }
  755.                         else if(this.phase == this.phases.playerTurn || this.phase == this.phases.firstTurn){
  756.                         }
  757.                         else if(this.phase == this.phases.dealerTurn){
  758.                             if(M.hands.dealer.value < 17){
  759.                                 this.hit(M.hands.dealer, false);
  760.                             }
  761.                             if(M.hands.dealer.value >= 17){
  762.                                 M.currentPlayerHand = 0;
  763.                                 this.phase = this.phases.evaluate;
  764.                             }
  765.                            
  766.                             this.buildTable();
  767.                             this.buildSidebar();
  768.                         }
  769.                         else if(this.phase == this.phases.evaluate){
  770.                             var playerHand = M.currentPlayerHand;
  771.                             M.hands.dealer.cards[1] = this.hiddenCard;
  772.                             this.buildTable();
  773.                            
  774.                             if(M.hands.player[playerHand].value > 21) {
  775.                                 outcome = 'bust';
  776.                             }
  777.                             else if(M.hands.dealer.value > 21){
  778.                                 outcome = 'dealerbust';
  779.                             }
  780.                             else if(M.hands.dealer.value < M.hands.player[playerHand].value){
  781.                                 outcome = 'win';
  782.                             }
  783.                             else if(M.hands.dealer.value > M.hands.player[playerHand].value){
  784.                                 outcome = 'lose';
  785.                             }
  786.                             else if(M.hands.dealer.value == M.hands.player[playerHand].value){
  787.                                 outcome = 'push';
  788.                             }
  789.                            
  790.                             playerHand++;
  791.                             if(playerHand < M.hands.player.length){
  792.                                 M.currentPlayerHand = playerHand;
  793.                                 this.phase = this.phases.evaluate;
  794.                             }
  795.                             else{
  796.                                 this.phase = this.phases.inactive;
  797.                             }
  798.                            
  799.                             this.buildTable();
  800.                             this.buildSidebar();
  801.                         }
  802.                         else if(this.phase == this.phases.surrender){
  803.                             var playerHand = M.currentPlayerHand;
  804.                             M.hands.dealer.cards[1] = this.hiddenCard;
  805.                             this.buildTable();                         
  806.                             outcome = 'surrender';
  807.                             playerHand++;
  808.                             if(playerHand < M.hands.player.length){
  809.                                 M.currentPlayerHand = playerHand;
  810.                                 this.phase = this.phases.playerTurn;
  811.                                 this.hiddenCard = M.hands.dealer.cards[1];
  812.                                 M.hands.dealer.cards[1] = M.cards[0];
  813.                             }
  814.                             else{
  815.                                 this.phase = this.phases.inactive;
  816.                             }
  817.                             this.buildTable();
  818.                             this.buildSidebar();
  819.                         }
  820.                        
  821.                         this.getHandValue(M.hands.dealer);
  822.                         this.getHandValue(M.hands.player[M.currentPlayerHand]);
  823.                        
  824.                         if(outcome){
  825.                             var messg = '';
  826.                             var winnings = M.betAmount;
  827.                             var double = M.hands.player[M.currentPlayerHand].betMultiplier == 2;
  828.  
  829.                             if (M.hands.player[M.currentPlayerHand].betMultiplier == 2) {
  830.                                 winnings *= 2;
  831.                             }
  832.                            
  833.                             switch(outcome){
  834.                                 case 'instantWin':
  835.                                     winnings *= 2.5;
  836.                                     messg = 'You make your own luck!';
  837.                                     this.ownLuckWins++;
  838.                                    
  839.                                     if(this.ownLuckWins >= 13) Game.Win('Ace up your sleeve');
  840.                                     if(Game.Has('I make my own luck') && this.ownLuckWins >= 42)
  841.                                         Game.Unlock('Infinite Improbability Drive');
  842.                                     if(this.ownLuckWins >= (13 * 13)) Game.Win('Paid off the dealer');
  843.                                     if(this.ownLuckWins >= 666) Game.Win('Deal with the Devil');
  844.                                     break;
  845.                                    
  846.                                 case 'playerblackjack':
  847.                                     winnings *= 2.5;
  848.                                     messg = 'Blackjack!';
  849.                                     if (!Game.Has('I make my own luck') && ++this.ownLuckWins >= 0)
  850.                                         Game.Unlock('I make my own luck');
  851.                                     Game.Win('Blackjack!');
  852.                                     break;
  853.                                    
  854.                                 case 'dealerblackjack':
  855.                                     winnings *= 0;
  856.                                     messg = 'You lose - Dealer blackjack!';
  857.                                     break;
  858.  
  859.                                 case 'bust':
  860.                                     winnings *= 0;
  861.                                     messg = `You lose${double ? ' double' : ''} - Over 21!`;
  862.                                     break;
  863.                                
  864.                                 case 'dealerbust':
  865.                                     winnings *= 2;
  866.                                     messg = `You win${double ? ' double' : ''} - Dealer went over 21!`;
  867.                                     break;
  868.                                
  869.                                 case 'win':
  870.                                     winnings *= 2;
  871.                                     messg = `You win${double ? ' double' : ''}!`;
  872.                                     break;
  873.                                
  874.                                 case 'lose':
  875.                                     winnings *= 0;
  876.                                     messg = 'You lose';
  877.                                     if (double)
  878.                                         messg += ' double!'
  879.                                     break;
  880.                                    
  881.                                 case 'surrender':
  882.                                     winnings *= .5;
  883.                                     messg = 'You lose half your bet';
  884.                                     break;
  885.                                    
  886.                                 case 'push':
  887.                                     if(Game.Has('Tiebreaker')){
  888.                                         winnings *= 2;
  889.                                         messg = `Tie goes to player${double ? ' twice' : ''}!`;
  890.                                         if (!Game.Has('Push plus')) {
  891.                                             Game.Unlock('Push plus');
  892.                                             Game.Upgrades['Push plus'].earn();
  893.                                         }
  894.                                     }else if(Game.Has('Push plus')){
  895.                                         winnings *= 1.5;
  896.                                         messg = `You push - you win 50% of your ${double ? '(doubled) ' : ''}bet`;
  897.                                         this.ties++;
  898.                                         if(this.ties >= 14) Game.Unlock('Tiebreaker');
  899.                                     }else{
  900.                                         messg = 'True push - nobody wins!';
  901.                                         this.ties++;
  902.                                         if(this.ties >= 7) Game.Unlock('Push plus');
  903.                                     }
  904.                                    
  905.                                     break;
  906.                                    
  907.                                 default:
  908.                                     break;
  909.  
  910.                             }
  911.                            
  912.                             let doubleDown = (M.hands.player[M.currentPlayerHand].betMultiplier > 1) + 1;
  913.                             messg += '<div style="font-size:65%;">';
  914.                             Game.Earn(winnings);
  915.                             if(winnings >= M.betAmount){
  916.                                 this.wins++;
  917.                                 this.winsT++;
  918.                                 this.netWins += Math.round(((winnings - M.betAmount * doubleDown) / M.betAmount) * 2) / 2;
  919.                                 messg += 'Gain ' + Beautify(Math.abs(winnings - M.betAmount * doubleDown)) + ' cookies!';
  920.                                 if(this.wins >= 7 && Game.cookies * .02 >= Game.cookiesPsRawHighest * MINUTE)
  921.                                     Game.Unlock('Raise the stakes');
  922.                                 if(Game.Has('Raise the stakes') && this.wins >= 14 && Game.cookies * .02 >= Game.cookiesPsRawHighest * HOUR)
  923.                                     Game.Unlock('High roller!');
  924.                                 if(Game.Has('High roller!') && this.wins >= 21 && Game.cookies * .02 >= Game.cookiesPsRawHighest * DAY)
  925.                                     Game.Unlock('Big spender!');
  926.                                 if(Game.Has('Big spender!') && this.wins >= 42 && Game.cookies * .02 >= Game.cookiesPsRawHighest * MONTH)
  927.                                     Game.Unlock('Main player');
  928.                                 if(Game.Has('Main player') && this.wins >= 52 && Game.cookies * .02 >= Game.cookiesPsRawHighest * DECADE)
  929.                                     Game.Unlock('True gambler');
  930.                                 if(Game.Has('True gambler') && this.wins >= 84 && Game.cookies * .02 >= Game.cookiesPsRawHighest * MILLENNIUM)
  931.                                     Game.Unlock('Immortal bettor');
  932.                                 if(Game.Has('Immortal bettor') && this.wins >= 108 && Game.cookies * .02 >= Game.cookiesPsRawHighest * CENTIMILLENNIUM && Game.ObjectsById.length > 20)
  933.                                     Game.Unlock('Gambler for the ages');
  934.                                 if(Game.Has('Raise the stakes') && Game.cookies >= (20 * Game.cookiesPsRawHighest * MINUTE))
  935.                                     Game.Unlock('Double or nothing');
  936.                                 if(Game.Has('Double or nothing') && Game.cookies >= (20 * Game.cookiesPsRawHighest * HOUR))
  937.                                     Game.Unlock('Stoned cows');
  938.                                 if(Game.Has('Stoned cows') && Game.cookies >= (20 * Game.cookiesPsRawHighest * DAY))
  939.                                     Game.Unlock('Game for Pros');
  940.                                 if(this.winsT >= 21) Game.Win('Card minnow');
  941.                                 if(this.winsT >= 210) Game.Win('Card trout');
  942.                                 if(this.winsT >= 2100) Game.Win('Card shark');
  943.                                
  944.                                 if(M.hands.player[M.currentPlayerHand].cards.length >= 5) Game.Win('Five card stud');
  945.                                 if(M.hands.player[M.currentPlayerHand].cards.length >= 6) Game.Win("Why can't I hold all these cards?");
  946.                                 if(M.hands.player[M.currentPlayerHand].value <= 5) Game.Win('I also like to live dangerously');
  947.                             }else{
  948.                                 this.losses++;
  949.                                 this.netWins -= doubleDown * Math.round((outcome == 'surrender' ? .5 : 1) * 2) / 2;
  950.                                 messg += 'Lost ' + Beautify(Math.abs(M.betAmount * doubleDown) - winnings) + ' cookies';
  951.                                 if (this.losses >= 21) Game.Unlock('Surrender');
  952.                             }
  953.                             messg += '</div>';
  954.                            
  955.                             this.netTotal += winnings - M.betAmount * doubleDown;
  956.                             Game.Popup(messg, Game.mouseX, Game.mouseY);
  957.                             if (M.games.Blackjack.splits)
  958.                                 M.games.Blackjack.splits--;
  959.  
  960.                             this.buildTable();
  961.                             this.buildSidebar();
  962.                         }
  963.                     }
  964.                 },
  965.                
  966.                 draw : function(){
  967.                     //run each draw frame
  968.                     l('casinoCurrentBet').innerHTML = '(' + Beautify(M.betAmount) + ' cookies)';
  969.                 }
  970.            
  971.             }
  972.            
  973.            
  974.            
  975.             var str = '';
  976.             str += '<style>' +
  977.             '#casinoBG{background:url(img/shadedBorders.png), url(' + M.sourceFolder + '/BGcasino.jpg); background-size:100% 100%, auto; position:absolute; left:0px; right:0px; top:0px; bottom:16px;}' +
  978.             '#casinoContent{position:relative; box-sizing:border-box; padding:4px 24px; height:450px;}' +
  979.             '#casinoSidebar{text-align:center; margin:0px; padding:0px; position:absolute; left:4px; top:4px; bottom:4px; right:65%; overflow-y:auto; overflow-x:hidden; box-shadow:8px 0px 8px rgba(0,0,0,0.5);}' +
  980.             '#casinoSidebar .listing{text-align:left;}' +
  981.             '#casinoTable{text-align:center; position:absolute; right:0px; top:0px; bottom:0px; overflow-x:auto; overflow:hidden;}' +
  982.             '.casinoBJCardImage{position: relative; width: 79px; height: 123px; left: 0px; top: 0px; overflow: visible;}' +
  983.             '.casinoSpacer{position: relative; width: 79px; height: 123px; left: 0px; top: 0px; overflow: visible;}' +
  984.             '#casinoBJTable td{text-align:center; vertical-align: middle; width:90px;}' +
  985.             '#casinoBJTable tr{height:150px}' +
  986.             '#casinoBJTable{margin-left:auto; margin-right:auto;}' +
  987.             '.casinoSidebarLabel{font-size:12px;width:100%;padding:2px;margin-top:4px;margin-bottom:-4px;}' +
  988.             '.casinoActionsTable tr{height: 40px;}' +
  989.             '#casinoGame{position: relative;}' +
  990.             '#casinoInfo{position: relative;text-align:center; font-size:11px; margin-top:12px; color:rgba(255,255,255,0.75); text-shadow:-1px 1px 0px #000;}' +
  991.             '</style>';
  992.             str += '<div id="casinoBG"></div>';
  993.             str += '<div id="casinoContent">';
  994.                 str += '<div id="casinoSidebar" class="framed">';
  995.                     str+='<div class="title casinoSidebarLabel"><span style="font-size: +1rem">Bet Amount</span></div><div class="line"></div>';
  996.                     str += '<div id="casinoMoney"></div>';
  997.                     str+='<div class="title casinoSidebarLabel"><br><span style="font-size: +1rem">Actions</font></div><div class="line"></div>';
  998.                     str += '<div id="casinoActions"></div>';
  999.                 str += '</div>';
  1000.                 str += '<div id="casinoTable">';
  1001.                     str += '<div id="casinoGame"></div>';
  1002.                     str += '<div id="casinoInfo">Hello World!</div>';
  1003.                 str += '</div>';
  1004.             str += '</div>';
  1005.             div.innerHTML = str;
  1006.            
  1007.             M.sidebarL = l('casinoSidebar');
  1008.             M.moneyL = l('casinoMoney');
  1009.             M.actionsL = l('casinoActions');
  1010.             M.tableL = l('casinoTable');
  1011.             M.gameL = l('casinoGame');
  1012.             M.infoL = l('casinoInfo');
  1013.            
  1014.             M.reset(false);
  1015.            
  1016.             M.buildSidebar();
  1017.             M.buildTable();
  1018.            
  1019.             M.loadedCount++;
  1020.            
  1021.             M.LoadSave();
  1022.             if (Game.prefs.popups) Game.Popup('Casino loaded!');
  1023.             else Game.Notify('Casino loaded!', '', '', 1, 1);
  1024.         }
  1025.        
  1026.         M.save = function(){
  1027.             //output cannot use ",", ";" or "|"
  1028.            
  1029.             var getMinigameStateSave = function(){
  1030.                 var res = '';
  1031.                 res += parseInt(M.parent.onMinigame ? '1' : '0');
  1032.                 res += '_' + parseInt(M.games.Blackjack.wins);
  1033.                 res += '_' + parseInt(M.games.Blackjack.winsT);
  1034.                 res += '_' + parseInt(M.games.Blackjack.ownLuckWins);
  1035.                 res += '_' + parseInt(M.games.Blackjack.ties);
  1036.                 res += '_' + parseInt(M.betMode);
  1037.                 res += '_' + parseInt(M.betChoice);
  1038.                 res += '_' + parseFloat(M.games.Blackjack.netTotal);
  1039.                 res += '_' + parseInt(0);
  1040.                 res += '_' + parseInt(M.beatLength);
  1041.                 res += '_' + Number(M.bankPercentage);
  1042.                 res += '_' + parseInt(M.games.Blackjack.netWins);
  1043.                
  1044.                 return res;
  1045.             }
  1046.            
  1047.             var getGameStateSave = function(){
  1048.                 var res = '';
  1049.                 res += parseInt(M.currentPlayerHand);
  1050.                 res += '_' + parseInt(M.nextBeat);
  1051.                 res += '_' + parseInt(M.games.Blackjack.phase);
  1052.                 res += '_' + parseInt(M.games.Blackjack.istep);
  1053.                 res += '_' + parseFloat(M.betAmount);
  1054.                 res += '_' + parseInt(M.games.Blackjack.hiddenCard.pip + 13 * M.games.Blackjack.hiddenCard.suit);
  1055.                
  1056.                 return res;
  1057.             }
  1058.            
  1059.             var getCardSave = function(deck){
  1060.                 var res = '';
  1061.                 for(var i = 0; i < deck.length; i++) res += (res.length ? '-' : '') + (deck[i].pip + 13 * deck[i].suit);
  1062.                 return res;
  1063.             }
  1064.            
  1065.             var getPlayerHandsSave = function(){
  1066.                 var res = '';
  1067.                 for(var i = 0; i < M.hands.player.length; i++) res += (res.length ? '_' : '') + getCardSave(M.hands.player[i].cards);
  1068.                 return res;
  1069.             }
  1070.            
  1071.             var getAchievementSave = function(){
  1072.                 var res = '';
  1073.                 for(var i = 0; i < M.Achievements.length; i++) res += Math.min(M.Achievements[i].won);
  1074.                 return res;
  1075.             }
  1076.            
  1077.             var getUpgradeSave = function(){
  1078.                 var res = '';
  1079.                 for (var i in M.Upgrades){
  1080.                     var me = M.Upgrades[i];
  1081.                     res += Math.min(me.unlocked, 1) + '' + Math.min(me.bought, 1);
  1082.                 }
  1083.                 return res;
  1084.             }
  1085.            
  1086.            
  1087.             var str = getMinigameStateSave();
  1088.             str += ' ' + getGameStateSave();
  1089.             str += ' ' + getCardSave(M.hands.dealer.cards);
  1090.             str += ' ' + getPlayerHandsSave();
  1091.             str += ' ' + getCardSave(M.Deck);
  1092.             str += ' ' + getAchievementSave();
  1093.             str += ' ' + getUpgradeSave();
  1094.            
  1095.             CCSE.config.OtherMods[M.name] = str;
  1096.             M.saveString = str;
  1097.             return ''; //str;
  1098.         }
  1099.        
  1100.         M.load = function(str){
  1101.             //interpret str; called after .init
  1102.             //note : not actually called in the Game's load; see "minigameSave" in main.js
  1103.             if(!str) return false;
  1104.             M.saveString = str;
  1105.            
  1106.             var parseMinigameStateSave = function(str){
  1107.                 var i = 0;
  1108.                 var spl = str.split('_');
  1109.                 var on = parseInt(spl[i++] || 0);
  1110.                 M.games.Blackjack.wins = parseInt(spl[i++] || 0);
  1111.                 M.games.Blackjack.winsT = parseInt(spl[i++] || 0);
  1112.                 M.games.Blackjack.ownLuckWins = parseInt(spl[i++] || 0);
  1113.                 M.games.Blackjack.ties = parseInt(spl[i++] || 0);
  1114.                 M.betMode = parseInt(spl[i++] || 0);
  1115.                 M.betChoice = parseInt(spl[i++] || 0);
  1116.                 M.games.Blackjack.netTotal = parseFloat(spl[i++] || 0);
  1117.                 var dummy = parseInt(spl[i++] || 0);
  1118.                 M.beatLength = parseInt(spl[i++] || 750);
  1119.                 M.bankPercentage = Number(spl[i++] || true);
  1120.                 M.games.Blackjack.netWins = parseInt(spl[i++] || 0);
  1121.                
  1122.                 if(on && Game.ascensionMode != 1) M.parent.switchMinigame(1);
  1123.             }
  1124.            
  1125.             var parseGameStateSave = function(str){
  1126.                 var i = 0;
  1127.                 var spl = str.split('_');
  1128.                 M.currentPlayerHand = parseInt(spl[i++] || 0);
  1129.                 M.nextBeat = parseInt(spl[i++] || 0);
  1130.                 M.games.Blackjack.phase = parseInt(spl[i++] || 0);
  1131.                 M.games.Blackjack.istep = parseInt(spl[i++] || 0);
  1132.                 M.betAmount = parseFloat(spl[i++] || 0);
  1133.                 M.games.Blackjack.hiddenCard = M.cards[parseInt(spl[i++] || 0)];
  1134.             }
  1135.            
  1136.             var parseCardSave = function(str){
  1137.                 var res = [];
  1138.                 if(str){
  1139.                     var arr = str.split('-');
  1140.                     for(var i = 0; i < arr.length; i++){
  1141.                         res.push(M.cards[arr[i]]);
  1142.                     }
  1143.                 }
  1144.                 return res;
  1145.             }
  1146.            
  1147.             var parsePlayerHandsSave = function(str){
  1148.                 M.hands.player = [];
  1149.                 if(str){
  1150.                     var hands = str.split('_');
  1151.                     for(var i = 0; i < hands.length; i++){
  1152.                         M.hands.player.push({cards:parseCardSave(hands[i])});
  1153.                         M.games.Blackjack.getHandValue(M.hands.player[i]);
  1154.                     }
  1155.                 }else{
  1156.                     M.hands.player = [{value:0, cards:[]}];
  1157.                 }
  1158.             }
  1159.            
  1160.             var parseAchievementSave = function(str){
  1161.                 var spl = str.split('');
  1162.                 for (var i in M.Achievements){
  1163.                     var me = M.Achievements[i];
  1164.                     if(spl[i]){
  1165.                         var mestr = [spl[i]];
  1166.                         me.won = parseInt(mestr[0]);
  1167.                     }else{
  1168.                         me.won = 0;
  1169.                     }
  1170.                     if(me.won && Game.CountsAsAchievementOwned(me.pool)) Game.AchievementsOwned++;
  1171.                 }
  1172.             }
  1173.            
  1174.             var parseUpgradeSave = function(str){
  1175.                 var spl = str.split('');
  1176.                 for (var i in M.Upgrades){
  1177.                     var me = M.Upgrades[i];
  1178.                     if (spl[i * 2]){
  1179.                         var mestr = [spl[i * 2],spl[i * 2 + 1]];
  1180.                         me.unlocked = parseInt(mestr[0]);
  1181.                         me.bought = parseInt(mestr[1]);
  1182.                         if (me.bought && Game.CountsAsUpgradeOwned(me.pool)) Game.UpgradesOwned++;
  1183.                     }
  1184.                     else{
  1185.                         me.unlocked = 0;
  1186.                         me.bought = 0;
  1187.                     }
  1188.                 }
  1189.             }
  1190.            
  1191.            
  1192.             var i = 0;
  1193.             var spl = str.split(' ');
  1194.             parseMinigameStateSave(spl[i++] || '');
  1195.             parseGameStateSave(spl[i++] || '');
  1196.             M.hands.dealer = {cards:parseCardSave(spl[i++] || 0)};
  1197.             parsePlayerHandsSave(spl[i++] || 0);
  1198.             M.Deck = parseCardSave(spl[i++] || 0);
  1199.             parseAchievementSave(spl[i++] || '');
  1200.             parseUpgradeSave(spl[i++] || '');
  1201.            
  1202.             M.games.Blackjack.getHandValue(M.hands.dealer);
  1203.             if(M.Deck.length < (M.minDecks * 52)) M.reshuffle();
  1204.             if(M.games.Blackjack.phase == M.games.Blackjack.phases.inactive){
  1205.                 M.hands = {dealer:{value:0, cards:[]}, player:[{value:0, splitFirstTurn:false, betMultiplier:1, cards:[]}]};
  1206.                 M.currentPlayerHand = 0;
  1207.             }
  1208.            
  1209.             M.games.Blackjack.buildSidebar();
  1210.             M.games.Blackjack.buildTable();
  1211.         }
  1212.        
  1213.         M.reset = function(hard){
  1214.             M.deckCount = 4;
  1215.             M.Deck = [];
  1216.             M.hands = {dealer:{value:0, cards:[]}, player:[{value:0, splitFirstTurn:false, betMultiplier:1, cards:[]}]};
  1217.             M.games.Blackjack.hiddenCard = M.cards[0];
  1218.             M.currentPlayerHand = 0;
  1219.             M.minDecks = 1;
  1220.             M.betAmount = 0;
  1221.             M.betChoice = 1;
  1222.             M.betMode = 1;
  1223.             M.betTime = 1;
  1224.             M.betLongest = Game.ObjectsById.length <= 20 ? MILLENNIUM : CENTIMILLENNIUM;
  1225.             M.games.Blackjack.wins = 0;
  1226.             M.games.Blackjack.losses = 0;
  1227.             M.games.Blackjack.netWins = 0;
  1228.             M.games.Blackjack.ownLuckWins = -3;
  1229.             M.games.Blackjack.ownLuckPermanent = false;
  1230.             M.games.Blackjack.doubleDown = 0;
  1231.             M.games.Blackjack.ties = 0;
  1232.             M.games.Blackjack.splitsT = 0;
  1233.             M.games.Blackjack.phase = 0;
  1234.             M.games.Blackjack.istep = 0;
  1235.             M.nextBeat = Date.now();
  1236.            
  1237.             M.setPercentagePrecision(1);
  1238.            
  1239.             if(hard){
  1240.                 M.saveString = '';
  1241.                 M.games.Blackjack.winsT = 0;
  1242.                 M.games.Blackjack.netTotal = 0;
  1243.                 M.games.Blackjack.showOdds = false;
  1244.                 M.bankPercentage = true;
  1245.                 for (var i in M.Upgrades) {
  1246.                     var me = M.Upgrades[i];
  1247.                     me.unlocked = me.bought = 0;
  1248.                 }
  1249.                 for (var i = 0; i < M.Achievements.length; i++) M.Achievements[i].won = 0;
  1250.             }
  1251.            
  1252.             M.reshuffle();
  1253.            
  1254.             M.buildSidebar();
  1255.             M.buildTable();
  1256.            
  1257.             setTimeout(function(M){return function(){M.onResize();}}(M), 10);
  1258.         }
  1259.        
  1260.         M.logic = function(){
  1261.             //run each frame
  1262.             if(M.games.choice == 0) M.games.Blackjack.logic();
  1263.         }
  1264.        
  1265.         M.onResize = function(){
  1266.             var width = l('casinoContent').offsetWidth;
  1267.             var sidebarW = width * 0.20 - 8;
  1268.             var tableW = width * 0.80 - 8;
  1269.             M.sidebarL.style.width = sidebarW + 'px';
  1270.             M.tableL.style.width = tableW + 'px';
  1271.         }
  1272.        
  1273.         M.draw = function(){
  1274.             //run each draw frame
  1275.             if(M.games.choice == 0) M.games.Blackjack.draw();
  1276.            
  1277.             l('casinoCurrentBet').innerHTML = '(' + Beautify(M.betAmount) + ' cookies)';
  1278.         }
  1279.        
  1280.         M.init(l('rowSpecial' + M.parent.id));
  1281.     }
  1282.  
  1283.  
  1284.    
  1285.     // Stuff that needs to wait for CCSE but should only run once goes here
  1286.     M.parent.minigameName = 'Casino';
  1287.    
  1288.     M.name = M.parent.minigameName;
  1289.     M.sourceFolder = CCSE.GetModPath(M.name);
  1290.     M.parent.minigameUrl = M.sourceFolder + '/dummyFile.js';
  1291.     M.savePrefix = 'minigameCasino';
  1292.     M.cardsImage = M.sourceFolder + '/phantasypantsCards.png';
  1293.     M.iconsImage = M.sourceFolder + '/customIcons.png';
  1294.     M.chancemakerChance = 0.0002;
  1295.     M.beatLength = 750;
  1296.    
  1297.     //***********************************
  1298.     //    Upgrades
  1299.     //***********************************
  1300.     M.Upgrades = [];
  1301.    
  1302.     M.Upgrades.push(CCSE.NewUpgrade('Raise the stakes', "Can bet a minute of CPS at a time.<q>Now we're getting somewhere!</q>", 10, [0, 3, M.iconsImage]));
  1303.     M.Upgrades.push(CCSE.NewUpgrade('High roller!', "Can bet an hour of CPS at a time.<q>If you have to ask, you can't afford it.</q>", 60, [0, 3, M.iconsImage]));
  1304.     M.Upgrades.push(CCSE.NewUpgrade('Big spender!', "Can bet a day of CPS at a time.<q>Now you're getting serious.</q>", 90, [0, 3, M.iconsImage]));
  1305.     M.Upgrades.push(CCSE.NewUpgrade('Main player', "Can bet a month of CPS at a time.<q>Don't even think about it.</q>", 120, [0, 3, M.iconsImage]));
  1306.     M.Upgrades.push(CCSE.NewUpgrade('True gambler', "Can bet a decade of CPS at a time.<q>Putting your life savings on the line.</q>", 180, [0, 3, M.iconsImage]));
  1307.     M.Upgrades.push(CCSE.NewUpgrade('Immortal bettor', "Can bet a millennium of CPS at a time.<q>Be prepared to spend lifetimes at this.</q>", 240, [0, 3, M.iconsImage]));
  1308.     if (Game.ObjectsById.length > 20) {
  1309.         M.Upgrades.push(CCSE.NewUpgrade('Gambler for the ages', "Can bet a centimillennium of CPS at a time.<q>That's a hundred thousand years!</q>", 360, [0, 3, M.iconsImage]));
  1310.     }
  1311.    
  1312.     M.Upgrades.push(CCSE.NewUpgrade('Math lessons', "Show the value of your current blackjack hand.<q>C'mon, it's not that hard.</q>", 1, [0, 3, M.iconsImage]));
  1313.     M.Upgrades.push(CCSE.NewUpgrade('Counting cards', "Keeps track of which cards have been played. 2-6 increase the count by 1. 10-K and Aces decrease the count by 1. Higher counts give better odds.<q>Technically not cheating, but casinos frown on this sort of thing.</q>", 28, [0, 3, M.iconsImage]));
  1314.     M.Upgrades.push(CCSE.NewUpgrade('Push plus', "You push - you win 50% of your bet.<q>That's the way they do it in Spanish 21.</q>", 8, [0, 3, M.iconsImage]));
  1315.     M.Upgrades.push(CCSE.NewUpgrade('Tiebreaker', "Ties push to the player.<q>Look at me. I'm the dealer now.</q>", 15, [0, 3, M.iconsImage]));
  1316.     M.Upgrades.push(CCSE.NewUpgrade('Double down', "Doubling down after splits is permitted.<q>Time to make some real money!</q>", 18, [0, 3, M.iconsImage]));
  1317.     M.Upgrades.push(CCSE.NewUpgrade('Surrender', "Surrendering allows half your bet to be returned to you.<q>It's better than losing everyting!</q>", 35, [0, 3, M.iconsImage]));
  1318.     M.Upgrades.push(CCSE.NewUpgrade('Strong split aces', "Drawing cards after splitting aces is allowed.<q>Not every casino lets you do this.</q>", 50, [0, 3, M.iconsImage]));
  1319.     M.Upgrades.push(CCSE.NewUpgrade('I make my own luck', "Each Chancemaker gives a <b>0.0<span></span>2%</b> chance to instantly win the hand.<q>Wait, that's illegal.</q>", 60, [0, 3, M.iconsImage]));
  1320.     M.Upgrades.push(CCSE.NewUpgrade('Infinite Improbability Drive', "Chancemaker chance to instantly win the hand is <b>doubled</b>.<q>You stole a protoype spaceship just to cheat at cards?</q>", 250, [0, 3, M.iconsImage]));
  1321.    
  1322.     M.Upgrades.push(CCSE.NewUpgrade('Double or nothing', "Multiply your bet by <b>2</b>.<q>The Martingale System sounds good on paper, but one losing streak long enough will bankrupt anyone.</q>", 120, [0, 3, M.iconsImage]));
  1323.     M.Upgrades.push(CCSE.NewUpgrade('Stoned cows', "Multiply your bet by <b>5</b>.<q>The steaks have never been higher!</q>", 300, [0, 3, M.iconsImage]));
  1324.     M.Upgrades.push(CCSE.NewUpgrade('Game for Pros', "Multiply your bet by <b>20</b>.<q>Much skill is required here.</q>", 600, [0, 3, M.iconsImage]));
  1325.    
  1326.     M.Upgrades.push(CCSE.NewHeavenlyUpgrade('Actually, do tell me the odds', "Display the probabilities of various outcomes of taking an action in the Casino.<q>2 + 2 is 4 minus 1 that's 3 quick maffs.</q>", 21000000, [0, 3, M.iconsImage], 38, -188, []));
  1327.         Game.last.showIf = function(){return Game.HasAchiev('Card shark');}
  1328.    
  1329.     for(var i = 0; i < M.Upgrades.length; i++){
  1330.         M.Upgrades[i].order = 1000000 + i / 100;
  1331.         if(M.Upgrades[i].pool != 'prestige') M.Upgrades[i].priceFunc = function(){return this.basePrice * Game.cookiesPsRawHighest * 60;};
  1332.     }
  1333.     Game.Upgrades['Double or nothing'].order = Game.Upgrades['High roller!'].order + 0.001;
  1334.     Game.Upgrades['Stoned cows'].order = Game.Upgrades['Double or nothing'].order + 0.001;
  1335.     Game.Upgrades['Game for Pros'].order = Game.Upgrades['Stoned cows'].order + 0.001;
  1336.    
  1337.    
  1338.     //***********************************
  1339.     //    Achievements
  1340.     //***********************************
  1341.     M.Achievements = [];
  1342.     M.Achievements.push(CCSE.NewAchievement('Card minnow', 'Win <b>21</b> hands of blackjack.', [0, 3, M.iconsImage]));
  1343.     M.Achievements.push(CCSE.NewAchievement('Card trout', 'Win <b>210</b> hands of blackjack.', [0, 3, M.iconsImage]));
  1344.     M.Achievements.push(CCSE.NewAchievement('Card shark', 'Win <b>2100</b> hands of blackjack.', [0, 3, M.iconsImage]));
  1345.     M.Achievements.push(CCSE.NewAchievement('Five card stud', "Win a hand of blackjack with <b>5</b> cards in your hand.<q>Wait, what game are you playing again?</q>", [0, 3, M.iconsImage]));
  1346.     M.Achievements.push(CCSE.NewAchievement("Why can't I hold all these cards?", 'Win a hand of blackjack with <b>6</b> cards in your hand.', [0, 3, M.iconsImage]));
  1347.         Game.last.pool = 'shadow';
  1348.     M.Achievements.push(CCSE.NewAchievement('Ace up your sleeve', "Win <b>13</b> hands of blackjack through chancemaker intervention in one ascension.<q>I'll tell you what the odds are.</q>", [0, 3, M.iconsImage]));
  1349.     M.Achievements.push(CCSE.NewAchievement('Paid off the dealer', "Win <b>" + (13 * 13) + "</b> hands of blackjack through chancemaker intervention in one ascension.<q>Takes money to make money.</q>", [0, 3, M.iconsImage]));
  1350.     M.Achievements.push(CCSE.NewAchievement('Deal with the Devil', "Win <b>666</b> hands of blackjack through chancemaker intervention in one ascension.<q>Just sign right here.</q>", [0, 3, M.iconsImage]));
  1351.         Game.last.pool = 'shadow';
  1352.     M.Achievements.push(CCSE.NewAchievement('Blackjack!', "Be dealt a hand totaling 21 naturally.", [0, 3, M.iconsImage]));
  1353.     M.Achievements.push(CCSE.NewAchievement('I like to live dangerously', "Hit on <b>17</b> or above without going over <b>21</b>.", [0, 3, M.iconsImage]));
  1354.     M.Achievements.push(CCSE.NewAchievement('I also like to live dangerously', "Win with a hand of <b>5</b> or less.<q>Yeah baby!</q>", [0, 3, M.iconsImage]));
  1355.         Game.last.pool = 'shadow';
  1356.    
  1357.     for(var i = 0; i < M.Achievements.length; i++) M.Achievements[i].order = 1000000 + i / 100;
  1358.    
  1359.    
  1360.     //***********************************
  1361.     //    CCSE arrays
  1362.     //***********************************
  1363.     Game.customOptionsMenu.push(function(){
  1364.         CCSE.MenuHelper;
  1365.         var str = '<div class="listing">'
  1366.         + CCSE.MenuHelper.ToggleButton(M, 'bankPercentage', 'Casino_bankPercentageButton', 'Bank Percentage ON', 'Bank Percentage OFF', "Casino.Toggle")
  1367.         + '<label>Calculate all bets as a percentage of the current bank.</label></div>';
  1368.         var callback = "Game.Objects['Chancemaker'].minigame.beatLength = Math.round(l('beatLengthSlider').value); l('beatLengthSliderRightText').innerHTML = Game.Objects['Chancemaker'].minigame.beatLength;";
  1369.         str += '<div class="listing">' +
  1370.             CCSE.MenuHelper.Slider('beatLengthSlider', 'Beat Length', '[$]', () => M.beatLength, callback, 0, 1000, 10) +
  1371.             'This is the time in milliseconds between each card deal.</div>';
  1372.        
  1373.         CCSE.AppendCollapsibleOptionsMenu(M.name, str);
  1374.     });
  1375.    
  1376.     Game.customStatsMenu.push(function(){
  1377.         let ownLuckWins = M.games.Blackjack.ownLuckWins;
  1378.  
  1379.         CCSE.AppendStatsVersionNumber(M.name, M.version);
  1380.         if(M.loadedCount){
  1381.             if(M.games.Blackjack.netTotal) CCSE.AppendStatsGeneral('<div class="listing"><b>Blackjack has earned you :</b> <div class="price plain">' + Game.tinyCookie() + Beautify(M.games.Blackjack.netTotal) + '</div></div>');
  1382.             if(M.games.Blackjack.ownLuckWins) CCSE.AppendStatsSpecial('<div class="listing"><b>Made your own luck :</b> ' + (ownLuckWins <= 0 ? 0 : M.games.Blackjack.ownLuckWins) + ' times</div>');
  1383.         }
  1384.     });
  1385.    
  1386.     M.LoadSave = function(){
  1387.         if(M.load){
  1388.             if(CCSE.config.OtherMods[M.name]) M.parent.minigameSave = CCSE.config.OtherMods[M.name];
  1389.             M.saveString = M.parent.minigameSave;
  1390.            
  1391.             M.load(M.saveString);
  1392.         }
  1393.     }
  1394.    
  1395.     Casino.Toggle = function(prefName, button, on, off, invert){
  1396.         if(M[prefName]){
  1397.             l(button).innerHTML = off;
  1398.             M.bankPercentage = false;
  1399.         }
  1400.         else{
  1401.             l(button).innerHTML = on;
  1402.             M.bankPercentage = true;
  1403.         }
  1404.         l(button).className = 'smallFancyButton prefButton option' + ((M[prefName] ^ invert) ? '' : ' off');
  1405.         M.save();
  1406.         //M.init(M.div);
  1407.         M.buildSidebar();
  1408.     }
  1409.    
  1410.     CCSE.customLoad.push(M.LoadSave);
  1411.     Game.registerHook('check', function(){
  1412.         if(M.loadedCount){
  1413.             if(M.games.Blackjack.wins >= 7) Game.Unlock('Raise the stakes');
  1414.             if(Game.Has('Raise the stakes') && M.games.Blackjack.wins >= 14) Game.Unlock('High roller!');
  1415.             if(Game.Has('High roller!') && Game.cookies >= (20 * Game.cookiesPsRawHighest * MINUTE)) Game.Unlock('Double or nothing');
  1416.             if(Game.Has('Double or nothing') && Game.cookies >= (20 * Game.cookiesPsRawHighest * HOUR)) Game.Unlock('Stoned cows');
  1417.             if(Game.Has('Stoned cows') && Game.cookies >= (20 * Game.cookiesPsRawHighest * DAY)) Game.Unlock('Game for Pros');
  1418.             if(Game.Has('Game for Pros') && M.games.Blackjack.wins >= 21) Game.Unlock('Big spender!');
  1419.             if(Game.Has('Big spender!') && M.games.Blackjack.wins >= 42) Game.Unlock('Main player');
  1420.             if(Game.Has('Main player') && M.games.Blackjack.wins >= 54) Game.Unlock('True gambler');
  1421.             if(Game.Has('True gambler') && M.games.Blackjack.wins >= 84) Game.Unlock('Immortal bettor');
  1422.             if(Game.Has('Immortal bettor') && M.games.Blackjack.wins >= 108) Game.Unlock('Gambler for the ages');
  1423.            
  1424.             if(Game.Has('I make my own luck') && M.games.Blackjack.ownLuckWins >= 42) Game.Unlock('Infinite Improbability Drive');
  1425.             if(M.games.Blackjack.ties >= 7) Game.Unlock('Push plus');
  1426.             if(M.games.Blackjack.ties >= 14) Game.Unlock('Tiebreaker');
  1427.             if(M.games.Blackjack.doubleDown >= 7) Game.Unlock('Double down');
  1428.             if(M.games.Blackjack.splitsT >= 3) Game.Unlock('Strong split aces');
  1429.            
  1430.             if(M.games.Blackjack.winsT >= 21) Game.Win('Card minnow');
  1431.             if(M.games.Blackjack.winsT >= 210) Game.Win('Card trout');
  1432.             if(M.games.Blackjack.winsT >= 2100) Game.Win('Card shark');
  1433.             if(M.games.Blackjack.ownLuckWins >= 13) Game.Win('Ace up your sleeve');
  1434.             if(M.games.Blackjack.ownLuckWins >= (13 * 13)) Game.Win('Paid off the dealer');
  1435.             if(M.games.Blackjack.ownLuckWins >= 666) Game.Win('Deal with the Devil');
  1436.            
  1437.             if(M.games.choice == 0) M.games.Blackjack.buildSidebar();
  1438.         }
  1439.     });
  1440.    
  1441.    
  1442.     if(typeof CM != 'undefined') CM.Sim.InitData(); // Cookie Monster compatibility
  1443.    
  1444.    
  1445.     Game.LoadMinigames();
  1446. }
  1447.  
  1448. if(CCSE && CCSE.isLoaded){
  1449.     Casino.launcher();
  1450. }
  1451. else{
  1452.     if(!CCSE) var CCSE = {};
  1453.     if(!CCSE.postLoadHooks) CCSE.postLoadHooks = [];
  1454.     CCSE.postLoadHooks.push(Casino.launcher);
  1455. }
Add Comment
Please, Sign In to add comment