Apps Home
|
Create an App
aslisnalsd
Author:
calvin06
Description
Source Code
Launch App
Current Users
Created by:
Calvin06
/* * Title: BlackJackoff * Author: Calvin06 * Version: 1.0 (02/26/13) * TODO: split and doubledown concepts * UPDATES: 11/9/19 changed logo, added reminders */ // bold advert, remove name // remove extra lines // count for aces /* <h1 style="color: #5e9ca0;">FOR PLAYERS</h1> <p>Tip the minimum buy in to get cards. Beat the dealer (broadcaster) by getting a count as close to 21 as possible, without going over 21.</p> <p>When you buy in, the game is waiting on you to act. Type /s to stay or type /h to hit to get another card.</p> <p>Aces count as 1 or 11.</p> <p>After you stay, the dealer will continue to receive cards until a score of 17 has been met.</p> <p>If you score higher than the dealer, you get a prize. If you lose to the dealer, the dealer gets a prize unless you tipped the "insurance" amount, in which case the dealer prizes are negated.</p> <p>If you tip while a game is in progress, and the broadcaster has enabled the waiting list, you will be added to the queue. When games ahead of you are finished, your game will begin automatically.</p> <h1 style="color: #5e9ca0;">FOR BROADCASTER AND MODERATORS</h1> <h2>Game Setup</h2> <ul> <li><b>Minimum token bet</b> - The minimum tip to start a game</li> <li><b>Insurance bet (tipper "pushes" on loss)</b> - If player tips insurance amount, your dealer awards are negated</li> <li><b>Tip goal (optional)</b> - The total tip amount to reach your goal</li> <li><b>Goal Description (optional)</b> - Describe what happens when your tip goal is reached</li> <li><b>Enable waiting list? (tips received while game in progress are added to a queue)</b> - If a game is in progress when a player tips the minimum buy-in, they will be added to a waiting list (max 10 players) for next game</li> <li><b>Card Style</b> - Pick an image to show for the card deck down cards</li> <li><b>Player Wins Prize (1-5)</b> - The prize a player wins if they beat your hand</li> <li><b>You (dealer) Win Prize (1-5)</b> - The prize you win if the player loses</li> </ul> <p>If a player is not responding, the game may be reset by typing /reset. If the waiting list is enabled, the current player is removed and the next game will begin automatically.</p> <h1 style="color: #5e9ca0;">COMMANDS</h1> <ul> <li><b>/p</b> - Show prize list</li> <li><b>/s</b> - Player stands</li> <li><b>/h</b> - Player hits</li> <li><b>/r</b> - Show game rules</li> <li><b>/stats</b> - Show player stats</li> <li><b>/reset</b> - Reset the current game</li> <li><b>/cmds</b> - Show this command list</li> <li><b> <li><b>/q</b> - Show players waiting in the queue</li> </ul> <p>Ideas, suggestions? Please leave comments below for calvin06.</p> */ // vars var totalTipped = 0; var topTipAmount = 0; var topTipper = null; var currentPlayer = null; var currentPlayerTip = 0; var deck = null; var reminder1ID = null; var reminder2ID = null; var reminder3ID = null; var CONFIG_TIPPER_COLOR = '#EBFAFA'; var CONFIG_TOP_TIPPER_COLOR = '#FFF700'; var CONFIG_ADVERT_TIME = 7; var EMOTE_LOGO = ' :blackjackoff2 '; var EMOTE_WINNER = ' :app_win '; var EMOTE_LOSER = ' :app_lose '; var EMOTE_CARDBACK = null; var cardbacks = new Array(); // {name:(str), emote:(str)} cardbacks.push({name:'CB Original',emote:':cardback'}); cardbacks.push({name:'CB New',emote:':cardbackcb'}); cardbacks.push({name:'Bicycle',emote:':cardbackbicycle'}); cardbacks.push({name:'Puppies',emote:':cardbackpuppy^:cardbackpuppies1^:cardbackpuppies2^:cardbackpuppies3'}); cardbacks.push({name:'Sex Toys',emote:':cardbackhandcuffs^:cardbackdildo^:cardbacksextoys1^:cardbacksextoys2^:cardbacksextoys3'}); cardbacks.push({name:'Sexy Girls',emote:':cardbacknurse^:cardbackbikini^:cardbackteacher'}); cardbacks.push({name:'Sexy Guys',emote:':cardbacklifeguard^:cardbackfireman^:cardbackmcconaughey'}); cardbacks.push({name:'Golden Girls',emote:':cardbackgoldengirls1^:cardbackgoldengirls2^:cardbackgoldengirls3^:cardbackgoldengirls4'}); cardbacks.push({name:'Stranger Things',emote:':cardbackst1^:cardbackst2^:cardbackst3^:cardbackst4^:cardbackst5^:cardbackst6^:cardbackst7^:cardbackst8^:cardbackst9^:cardbackst10^:cardbackst11^:cardbackst12^:cardbackst13^:cardbackst14^:cardbackst15'}); var nl = '\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501'; var COMMAND_PRIZES = '/p'; var COMMAND_HIT = '/h'; var COMMAND_STAY = '/s'; var COMMAND_RULES = '/r'; var COMMAND_STATS = '/stats'; var COMMAND_RESET = '/reset'; var COMMAND_CMDS = '/cmds'; var COMMAND_QUEUE = '/q'; var COMMAND_HINT = '/hint'; var CONFIG_PLAYERWINS = 'wins'; var CONFIG_PLAYERLOSES = 'loses'; var CONFIG_QUEUEMAX = 10; var CONFIG_MAXPRIZENUMBER = 5; function getCommandList() { var out = nl + '\n' + COMMAND_HIT + " player hits\n" + COMMAND_STAY + " player stands\n" + COMMAND_PRIZES + " see prize list\n" + COMMAND_STATS + " player stats\n" + COMMAND_RULES + " game rules\n" + COMMAND_HINT + " tells you to hit or stay based on odds (player, mods, or broadcaster)\n"; if (cb.enablequeue == 'yes') out += COMMAND_QUEUE + " show players waiting list\n"; out += COMMAND_QUEUE + " show players waiting in queue\n" + COMMAND_RESET + " reset the current game (broadcaster and mods only)\n" + nl; return out; } // ******* START CHOICES ********** cb.settings_choices = [ {name: 'buyin', type: 'int', minValue: 1, defaultValue: 25, label: "Minimum token bet"}, {name: 'insurance', type: 'int', minValue: 0, defaultValue: 50, label: "Insurance bet (tipper \"pushes\" on loss)", required: false}, {name: 'goal', type: 'int', minValue: 0, defaultValue: 0, label: "Tip goal (optional)", required:false}, {name: 'goal_description', type: 'str', minLength: 0, maxLength: 255, label: 'Goal Description (optional)', required:false}, {name: 'enablequeue', type: 'choice', choice1: 'yes', choice2: 'no', defaultValue: 'yes', label: 'Enable waiting list? (tips received while game in progress are added to a queue)'} ]; // add card back styles var cardstyleObj = {}; cardstyleObj['name'] = 'cardstyle'; cardstyleObj['type'] = 'choice'; for (var i = 0; i<cardbacks.length; i++) { cardstyleObj['choice'+(i+1)] = cardbacks[i].name; } cardstyleObj['choice'+(cardbacks.length+1)] = 'Random'; cardstyleObj['defaultValue'] = cardbacks[1].name; cardstyleObj['label'] = 'Card Style'; cb.settings_choices.push(cardstyleObj); // add player prizes cb.settings_choices.push({name: 'wprize1', type: 'str', minLength: 1, maxLength: 255, label: 'Player Wins Prize 1'}); var playerPrizesObj = {}; for (var i=2;i<=CONFIG_MAXPRIZENUMBER;i++) { cb.settings_choices.push({name: 'wprize'+i, type: 'str', minLength: 0, maxLength: 255, label: 'Player Wins Prize '+i, required:false}); } // add dealer prizes cb.settings_choices.push({name: 'lprize1', type: 'str', minLength: 1, maxLength: 255, label: 'You (dealer) Win Prize 1 (go easy on them!)'}); for (var i=2;i<=CONFIG_MAXPRIZENUMBER;i++) { cb.settings_choices.push({name: 'lprize'+i, type: 'str', minLength: 0, maxLength: 255, label: 'You (dealer) Win Prize '+i, required:false}); } // ******* END CHOICES ********** var dealerHand = new Array(); var playerHand = new Array(); var playerStats = {}; //username (str), {totaltips:(int),wins:(int),losses:(int),blackjacks:(int),pushes:(int)} var gameOver = true; var queue = new Array(); // {username:(str), tip:(int)} var player_prizes = new Array(); var player_penalities = new Array(); //handlers cb.onTip(function(tip) { // 1. track all tips received totalTipped += tip['amount']; if (cb.settings.goal && cb.settings.goal !=0 && totalTipped > cb.settings.goal) totalTipped = cb.settings.goal; if (tip['amount'] > topTipAmount) { topTipAmount = tip['amount']; topTipper = tip['from_user']; } // 2. see if user met assignment minimum if (tip['amount'] >= cb.settings.buyin) { if (gameOver) { gameOver = false; currentPlayer = tip['from_user']; currentPlayerTip = tip['amount']; deal(); reminder1ID = cb.setTimeout(reminder1, 60000); } else { if (queue.length < CONFIG_QUEUEMAX && cb.settings.enablequeue == 'yes') { addQueue(tip['from_user'], tip['amount']); cb.chatNotice('Black Jackoff: Thank you for the tip ' + tip['from_user'] + '. Game is in progress with [' + currentPlayer + ']. You have been added to the waiting list. Your game will automatically start when others ahead are finished.'); drawQueue(); } else if (cb.settings.enablequeue == 'yes') { cb.chatNotice('Black Jackoff: Thank you for the tip ' + tip['from_user'] + '. The queue is currently full (' + CONFIG_QUEUEMAX + ' player max). Type ' + COMMAND_QUEUE + ' to show waiting list.'); } else { cb.chatNotice('Black Jackoff: Thank you for the tip ' + tip['from_user'] + '. Game is in progress with [' + currentPlayer + ']. Please tip again when current game is over.'); } } } // 3. update panel for game in progress cb.drawPanel(); }); cb.onDrawPanel(function(user) { var row1label = 'Tips received:'; var row1value = '' + totalTipped; if (cb.settings.goal && cb.settings.goal !=0) { row1label = 'Tips received / goal:'; row1value = '' + totalTipped + ' / ' + cb.settings.goal; } var row2label = 'Top Tipper:'; var row2value = '--'; if (topTipper) { row2value = '' + formatName(topTipper,12) + ' (' + topTipAmount +')'; } if (!gameOver) { row2label = 'Player:'; row2value = '' + formatName(currentPlayer,12); } var row3value = 'Deal in for ' + cb.settings.buyin + ' tokens!'; if (!gameOver) { row3value = 'Dealer: ' + dealerHand[0].draw() + ' -- Player: ' + drawHand(playerHand); } return { 'template': '3_rows_12_22_31', 'row1_label': row1label, 'row1_value': row1value, 'row2_label': row2label, 'row2_value': row2value, 'row3_value': row3value }; }); cb.onMessage(function (msg) { if (msg['m'].match(/(^|\s)!reset|\/reset(\s|$)/)) { if (msg['user'] == cb.room_slug || msg['is_mod']) { cb.chatNotice('Black Jackoff: Game reset'); reset(); } } if (msg['m'].match(/(^|\s)!q|\/q(\s|$)/)) { if (cb.settings.enablequeue == 'yes') { if (msg['user'] == cb.room_slug || msg['is_mod']) { drawQueue(null); if (!hasNextPlayer()) cb.chatNotice('Black Jackoff: No one in queue'); } else { drawQueue(msg['user']); if (!hasNextPlayer()) cb.chatNotice('Black Jackoff: No one in queue',msg['user']); } } else { if (msg['user'] == cb.room_slug || msg['is_mod']) { cb.chatNotice('Black Jackoff: Queue is not enabled by broadcaster.'); } } } if (msg['m'].match(/(^|\s)!stats|\/stats(\s|$)/)) { if (canUseCmds(msg)) drawPlayerStats(msg['user']); } if (msg['m'].match(/(^|\s)!p|\/p(\s|$)/)) { if (canUseCmds(msg)) drawPrizes(); } if (msg['m'].match(/(^|\s)!cmds|\/cmds(\s|$)/)) { if (canUseCmds(msg)) cb.chatNotice(getCommandList()); } if (msg['m'].match(/(^|\s)!h|\/h(\s|$)/) && !gameOver) { if (msg['user'] == currentPlayer) { cb.chatNotice('Player hits!','','','','bold'); hit(); resetReminders(); reminder1ID = cb.setTimeout(reminder1, 60000); } } if (msg['m'].match(/(^|\s)!s|\/s(\s|$)/) && !gameOver) { if (msg['user'] == currentPlayer) { cb.chatNotice('Player Stands!','','','','bold'); stand(); resetReminders(); } } if (msg['m'].match(/(^|\s)!hint|\/hint(\s|$)/) && (msg['user'] == currentPlayer || msg['user'] == cb.room_slug || msg['is_mod'])) { if (!gameOver) drawHint(); else cb.chatNotice('Black Jackoff: No active games'); } if (msg['m'].match(/(^|\s)!r|\/r(\s|$)/)) { if (canUseCmds(msg)) cb.chatNotice(getRules()); } if (msg['user'] == currentPlayer && !gameOver) { msg['background'] = CONFIG_TIPPER_COLOR; msg['m'] = "[player] [hand=" + score( playerHand ) + "/21]: " + msg['m']; } return msg; }); function canUseCmds(msg) { if (msg['user'] == cb.room_slug || msg['is_mod'] || msg['has_tokens']) { return true; } return false; } function updateSubject() { cb.changeRoomSubject('BlackJackoff is running! '+getSubject()); } function getSubject() { var subject = ''; if (gameOver) { subject += 'Tip ' + cb.settings.buyin + ' to play!'; if (cb.settings.insurance && cb.settings.insurance != 0) subject += ' Tip ' + cb.settings.insurance + ' if you don\'t like to lose! (insurance). Type ' + COMMAND_CMDS + ' for more commands'; } else{ subject += 'Current player is ' + currentPlayer + '. Deal in for ' + cb.settings.buyin + ' tokens to be added to the queue.'; } if (cb.settings.goal_description && cb.settings.goal_description != '') { subject += ' Goal is [' + cb.settings.goal_description +']'; } return subject; } function getRules() { var rules = 'GAME RULES\n' + nl + '\nTip ' + cb.settings.buyin + ' to play.\n'; if (cb.settings.enablequeue == 'yes') { rules += '- If a game is in progress when you tip to play, you are added to the queue. Your game will begin automatically when players ahead are finished.\n'; } else { rules += '- If a game is in progress, please wait for the current game to finish before dealing in.\n'; } rules += '- Objective is to achieve a total that is greater than that of the dealer, and which does not exceed 21.\n' + '- After dealt two cards, choose to stand by typing ' + COMMAND_STAY + ', or receive another card with a hit by typing ' + COMMAND_HIT + '\n' + '- Hit as many times as you like but will bust and lose if your card total exceeds 21\n' + '- Dealers must hit if their hand totals 16 or less. Dealers must stand if their hand totals 17 or more.\n'; if (cb.settings.insurance && cb.settings.insurance != 0) rules += '- If player has tipped insurance (' + cb.settings.insurance + ' tokens), player will push on losses (no broadcaster rewards).\n'; rules += nl; return rules; } function deal() { if ( deck.next_card > 39 ) { // shuffle the deck if 75% of cb.chatNotice('Shuffling deck...'); deck.shuffle(); // the cards have been used. } dealerHand = new Array(); playerHand = new Array(); dealerHand[ 0 ] = deck.dealCard(); // This is the hole card. dealerHand[ 1 ] = deck.dealCard(); // dealer down card playerHand[ 0 ] = deck.dealCard(); playerHand[ 1 ] = deck.dealCard(); setCardBack(); drawHands('hide'); } function reset() { gameOver = true; currentPlayer = null; currentPlayerTip = 0; cb.drawPanel(); resetReminders(); if (hasNextPlayer()) handleNextPlayer(); } function drawPlayerStats(user) { if (user in playerStats) { cb.chatNotice(nl + '\nPlayer stats ['+user+']:\nWins/Losses: ' + playerStats[user].wins + ' / ' + playerStats[user].losses + '\nPushes: ' + playerStats[user].pushes + '\nBlackjacks: ' + playerStats[user].blackjacks + '\nTotal Tips: ' + playerStats[user].totaltips + '\n' + nl); } else { cb.chatNotice('No stats for you yet. Tip ' + cb.settings.buyin + ' to play.',user); } } function drawPrizes() { var out = nl + '\nDealer prize list:\n'; for (var i=0;i<player_penalities.length;i++) { out += (i+1) + '. ' + player_penalities[i] + '\n'; } out += 'Player prize list:\n'; for (var i=0;i<player_prizes.length;i++) { out += (i+1) + '. ' + player_prizes[i] + '\n'; } out += nl; cb.chatNotice(out); } function drawHands(display) { var out = ''; out += nl + '\nPlayer: ' + drawHandEmote(playerHand) + ' = ' + score(playerHand) + '\n' + nl; out += '\nDealer: '; for (var i=0; i<6; i++) { if (dealerHand[i]) { //if (i==3) out += '\n'; if (i==1 && display=='hide') out += ' ' + EMOTE_CARDBACK + ' '; else out += ' ' + dealerHand[i].emote() + ' '; } } if (display != 'hide') out += ' = ' + score(dealerHand) + '\n' + nl; else out += '\n' + nl; if (!gameOver) out += '\n['+currentPlayer+'] type ' + COMMAND_STAY + ' to stay or ' + COMMAND_HIT + ' to hit.'; cb.chatNotice(out,'','','','bold'); } function setCardBack() { EMOTE_CARDBACK = cardbacks[1].emote; if (cb.settings.cardstyle == 'Random') { // set random cardback EMOTE_CARDBACK = cardbacks[Math.floor(Math.random()*cardbacks.length)].emote; } else { for (var i=0; i < cardbacks.length; i++) { if (cardbacks[i].name === cb.settings.cardstyle) { EMOTE_CARDBACK = cardbacks[i].emote; } } } if (EMOTE_CARDBACK.indexOf('^') > -1) { // emote has multiples, pick random var multBack = EMOTE_CARDBACK.split('^'); EMOTE_CARDBACK = multBack[Math.floor(Math.random()*multBack.length)]; } } function drawHand(hand) { var out = ''; for (var i=0;i<6;i++) { if (hand[i]) { out += hand[i].draw() + ' '; } } return out; } function drawHandEmote(hand) { var out = ''; for (var i=0;i<6;i++) { if (hand[i]) { //if (i==3) out += ' ... \n '; out += ' ' + hand[i].emote() + ' '; } } return out; } // Constructor for Card objects function Card(num,suit) { this.num = num; this.suit = suit; this.draw = drawCard; this.emote = emoteCard; } function drawCard() { var out = ''; if (this.num == 1 || this.num > 10) { if (this.num == 1 || this.num == 14) out += 'A'; if (this.num == 11) out += 'J'; if (this.num == 12) out += 'Q'; if (this.num == 13) out += 'K'; } else { out += this.num; } switch (this.suit) { case 'c': //out += '\u2663'; out += 'c'; break; case 'h': //out += '\u2665'; out += 'h'; break; case 's': //out += '\u2660'; out += 's'; break; case 'd': //out += '\u2666'; out += 'd'; break; } return out; } function emoteCard() { return ':card'+this.num+this.suit; } // Constructor for Deck Object function Deck() { this.cards = new Array(52); this.next_card = 0; // fill the deck (in order, for now) for (var i=1; i<14; i++) { this.cards[i-1] = new Card(i,"c"); this.cards[i+12] = new Card(i,"h"); this.cards[i+25] = new Card(i,"s"); this.cards[i+38] = new Card(i,"d"); } this.shuffle = shuffle; this.dealCard = dealCard; } function shuffle() { for (var i=1; i<1000; i++) { // switch two randomly selected cards card1 = Math.floor( 52*Math.random() ); card2 = Math.floor( 52*Math.random() ); temp = this.cards[card2]; this.cards[card2] = this.cards[card1]; this.cards[card1] = temp; } this.next_card = 0; } function dealCard() { return this.cards[ this.next_card++ ]; } function hit() { var total = 0; var new_card = 0; // index for the new card position if ( !gameOver ) { new_card = playerHand.length; playerHand[ new_card ] = deck.dealCard(); total = score( playerHand ); if ( total > 21 ) { // Busted, game over. gameOver = true; drawHands('show'); winner(); resetReminders(); } else { drawHands('hide'); } } cb.drawPanel(); } // end function hit() function stand() { var total = 0; var new_card = 0; // index for the new card position if ( gameOver ) { cb.chatNotice('Game Over'); } else { while ( score( dealerHand ) < 17 ) { // Dealer stands on soft 17 new_card = dealerHand.length; dealerHand[ new_card ] = deck.dealCard(); } total = score( dealerHand ); if ( total > 21 ) { // Busted cb.chatNotice('Dealer busts with ' + total); } else { cb.chatNotice('Dealer draws to ' + total); } } gameOver = true; // The game ends after the player stands. drawHands('show'); winner(); cb.drawPanel(); resetReminders(); } // end function stand() function score(hand) { var total = 0; var soft = 0; // This variable counts the number of aces in the hand. var pips = 0; // The trump pictures on a card used to be called pips. for (var i=0; i<hand.length; i++ ) { pips = hand[i].num; if ( pips == 1 ) { soft = soft + 1; total = total + 11; } else { if ( pips == 11 || pips == 12 || pips == 13 ) { total = total + 10; } else { total = total + pips; } } } while ( soft > 0 && total > 21 ) { // Count the aces as 1 instead total = total - 10; // of 11 if the total is over 21 soft = soft - 1; } return total; } // end function score function preScoreDealer() { if (dealerHand == undefined || dealerHand.length == 0) return 0; var upCardPips = dealerHand[0].num; if (upCardPips == 1) return 11; if (upCardPips > 9) return 10; return upCardPips; } function drawHint() { var out = 'Black Jackoff: Hint: Odds say '; var outS = 'STAY (type ' + COMMAND_STAY + ')'; var outH = 'HIT (type ' + COMMAND_HIT + ')'; var pScore = score(playerHand); var dScore = preScoreDealer(); var isSoft = false; for (var i=0; i<playerHand.length; i++ ) { pips = playerHand[i].num; if (pips == 1) { isSoft = true; } } if (isSoft) { if ( pScore >= 19 ) { out += outS; } else if ( pScore == 18 ) { if ( dScore<9 ) { out += outS; } else { out += outH; } } else { out += outH; } } else { if ( pScore >= 17 ) { out += outS; } else if ( pScore<17 && pScore>12 ) { if ( dScore<7 ) { out += outS; } else { out += outH; } } else if ( pScore == 12 ) { if ( dScore>3 && dScore<7 ) { out += outS; } else { out += outH; } } else { out += outH; } } cb.chatNotice(out); } function winner() { var cantLose = false; if (cb.settings.insurance && cb.settings.insurance <= currentPlayerTip) cantLose = true; var bj = 0; var out = ''; var delayedOut = ''; var player_total = score( playerHand ); var dealer_total = score( dealerHand ); if (player_total == 21 && playerHand.length == 2) bj = 1; if ( player_total > 21 ) { // Busted out += EMOTE_LOSER + 'Player busts! Dealer wins!'; if (cantLose) { out += '\nBUT! Player tipped with insurance. No action.'; updateUser(currentPlayer,currentPlayerTip,0,0,bj,1); } else { //out += '\nDealer reward [' + getAction(CONFIG_PLAYERLOSES) + ']'; delayedOut = 'Dealer reward [' + getAction(CONFIG_PLAYERLOSES) + ']'; updateUser(currentPlayer,currentPlayerTip,0,1,bj,0); } } else { if (bj == 1) out += ' B L A C K J A C K \n'; if ( dealer_total > 21 ) { // Busted out += EMOTE_WINNER + cb.room_slug + ' busts! ' + currentPlayer + ' wins!\n'; //out += 'Player reward [' + getAction(CONFIG_PLAYERWINS) + ']'; delayedOut = 'Player reward [' + getAction(CONFIG_PLAYERWINS) + ']'; updateUser(currentPlayer,currentPlayerTip,1,0,bj,0); } else { if ( player_total == dealer_total ) { out += 'Push!'; updateUser(currentPlayer,currentPlayerTip,0,0,bj,1); } else { if ( player_total > dealer_total ) { out += EMOTE_WINNER + 'Player wins!\n'; //out += 'Player reward [' + getAction(CONFIG_PLAYERWINS) + ']'; delayedOut = 'Player reward [' + getAction(CONFIG_PLAYERWINS) + ']'; updateUser(currentPlayer,currentPlayerTip,1,0,bj,0); } else { out += EMOTE_LOSER + 'Dealer wins!\n'; if (cantLose) { out += 'BUT! Player tipped with insurance. No action.'; updateUser(currentPlayer,currentPlayerTip,0,0,bj,1); } else { //out += 'Dealer reward [' + getAction(CONFIG_PLAYERLOSES) + ']'; delayedOut = 'Dealer reward [' + getAction(CONFIG_PLAYERLOSES) + ']'; updateUser(currentPlayer,currentPlayerTip,0,1,bj,0); } } } } } if (out.substring(out.length-1) != '\n') out += '\n'; cb.chatNotice(out + nl + '\n' + delayedOut,'','','','bold'); resetReminders(); handleNextPlayer(); } //queue mgmt function addQueue(user, amount) { queue.push({username:user,tip:amount}); } function hasNextPlayer() { if (queue === undefined || queue.length == 0) { return false; } else { return true; } } function getNextPlayer() { if (hasNextPlayer()) { return queue.shift(); // remove and return } else { return null; } } function drawQueue(user) { if (hasNextPlayer()) { var out = 'Players waiting:'; for (var i = 0; i<queue.length; i++) { out += '\n' + (i+1) + '. ' + queue[i].username + ' [tipped ' + queue[i].tip + ']'; } if (user != null) { cb.chatNotice(out,user); } else { cb.chatNotice(out); } } } function handleNextPlayer() { if (hasNextPlayer()) { nextplayer = getNextPlayer(); currentPlayer = nextplayer.username; currentPlayerTip = nextplayer.tip; gameOver = false; cb.chatNotice('\n*** Next Player up! ['+currentPlayer+'] *** ','','','','bold'); deal(); reminder1ID = cb.setTimeout(reminder1, 60000); cb.log('reminderid: ' + reminder1ID); } } function getAction(result) { var out = ''; if (result == CONFIG_PLAYERLOSES) { out += player_penalities[Math.floor(Math.random() * player_penalities.length)]; } else { out += player_prizes[Math.floor(Math.random() * player_prizes.length)]; } return out; } function updateUser(user,tip,win,loss,bj,push) { // username (str), {totaltips:(int),wins:(int),losses:(int),blackjacks:(int),pushes:(int)} if (user in playerStats) { playerStats[user].totaltips += tip; playerStats[user].wins += win; playerStats[user].losses += loss; playerStats[user].blackjacks += bj; playerStats[user].pushes += push; } else { playerStats[user] = {totaltips:tip,wins:win,losses:loss,blackjacks:bj,pushes:push}; } } function tipsRemaining() { if (!cb.settings.goal) return 0; var r = cb.settings.goal - totalTipped; if (r < 0) { return 0; } else { return r; } } function formatName(val,length) { if (val === null) { return "--"; } else { return val.substring(0, length); } } function advert() { cb.chatNotice(EMOTE_LOGO + ' is running! '+getSubject(),'','','','bold'); cb.setTimeout(advert, (7 * 60000)); } function reminder1() { if (!gameOver) { cb.chatNotice('Black Jackoff: Game is waiting for player ' + currentPlayer + '. Type ' + COMMAND_HIT + ' for another card (closest to 21 wins) or type ' + COMMAND_STAY + ' if you think your chances are good. ' + cb.room_slug + ' must draw to 17 or better. Type ' + COMMAND_HINT + ' for suggestion.'); reminder2ID = cb.setTimeout(reminder2, 60000); } } function reminder2() { if (!gameOver) { cb.chatNotice('Black Jackoff: :waiting The game is waiting on you ' + currentPlayer + '. Please hit (type ' + COMMAND_HIT + ') or stay (type ' + COMMAND_STAY + '). Type ' + COMMAND_HINT + ' for suggestion.'); reminder3ID = cb.setTimeout(reminder3, 60000); } } function reminder3() { if (!gameOver) { cb.chatNotice('Black Jackoff: If the current player ' + currentPlayer + ' is not responding, the game may be reset by the broadcaster or moderators by typing ' + COMMAND_RESET + '.'); reminder3ID = cb.setTimeout(reminder3, (2 * 60000)); } } function resetReminders() { if (reminder1ID != null) { cb.cancelTimeout(reminder1ID); reminder1ID = null; } if (reminder2ID != null) { cb.cancelTimeout(reminder2ID); reminder2ID = null; } if (reminder3ID != null) { cb.cancelTimeout(reminder3ID); reminder3ID = null; } } function init() { var wtemp = new Array(cb.settings.wprize1,cb.settings.wprize2,cb.settings.wprize3,cb.settings.wprize4,cb.settings.wprize5); var ltemp = new Array(cb.settings.lprize1,cb.settings.lprize2,cb.settings.lprize3,cb.settings.lprize4,cb.settings.lprize5); for (var i = 0; i<wtemp.length; i++) { if (wtemp[i] != '') { player_prizes.push(wtemp[i]); } } for (var i = 0; i <ltemp.length; i++) { if (ltemp[i] != '') { player_penalities.push(ltemp[i]); } } updateSubject(); deck = new Deck(); deck.shuffle(); cb.chatNotice(EMOTE_LOGO + ' by calvin06 has been activated. '+getSubject()); cb.setTimeout(advert, (7 * 60000)); } init();
© Copyright Chaturbate 2011- 2025. All Rights Reserved.