Blackjack Example - Advanced

Login to reply  Page: « < 1 of 1 > »
15 Feb 2010 - 16:392341
Blackjack Example - Advanced
Hey all, figured I'd submit my Blackjack triggers in case anyone feels like using/proofreading/improving them. This was my first attempt at a large script, and I'm sure there are better ways to go about everything, so all feedback is welcome! It's a series of commands (bet, hit, stand) that are attached to a dealer mob. It functions on basic Vegas rules: Dealer must hit when < 17, and must stand when >= 17. Player may hit until stand, bust, or 5-card charlie. I still need to implement double-down and splits... Control is passed from the player to the dealer when the player stands. And yes, I probably could have global'd the deck to free up some lines, just haven't gotten around to that yet. Heck, I probably could have global'd everything instead of remoting... could be wrong on that though.

Again, all feedback is welcome!

Here goes nothin'...
Bet Command:
1) Name         : Blackjack Bet Cmd
2) Intended for : Mobiles
3) Trigger types: Command 
4) Numeric Arg  : 1
5) Arguments    : bet
6) Commands:
eval deck[01] Ace   11 Diamonds
eval deck[02] Two   2  Diamonds
eval deck[03] Three 3  Diamonds
eval deck[04] Four  4  Diamonds
eval deck[05] Five  5  Diamonds
eval deck[06] Six   6  Diamonds
eval deck[07] Seven 7  Diamonds
eval deck[08] Eight 8  Diamonds
eval deck[09] Nine  9  Diamonds
eval deck[10] Ten   10 Diamonds
eval deck[11] Jack  10 Diamonds
eval deck[12] Queen 10 Diamonds
eval deck[13] King  10 Diamonds
eval deck[14] Ace   11 Hearts
eval deck[15] Two   2  Hearts
eval deck[16] Three 3  Hearts
eval deck[17] Four  4  Hearts
eval deck[18] Five  5  Hearts
eval deck[19] Six   6  Hearts
eval deck[20] Seven 7  Hearts
eval deck[21] Eight 8  Hearts
eval deck[22] Nine  9  Hearts
eval deck[23] Ten   10 Hearts
eval deck[24] Jack  10 Hearts
eval deck[25] Queen 10 Hearts
eval deck[26] King  10 Hearts
eval deck[27] Ace   11 Spades
eval deck[28] Two   2  Spades
eval deck[29] Three 3  Spades
eval deck[30] Four  4  Spades
eval deck[31] Five  5  Spades
eval deck[32] Six   6  Spades
eval deck[33] Seven 7  Spades
eval deck[34] Eight 8  Spades
eval deck[35] Nine  9  Spades
eval deck[36] Ten   10 Spades
eval deck[37] Jack  10 Spades
eval deck[38] Queen 10 Spades
eval deck[39] King  10 Spades
eval deck[40] Ace   11 Clubs
eval deck[41] Two   2  Clubs
eval deck[42] Three 3  Clubs
eval deck[43] Four  4  Clubs
eval deck[44] Five  5  Clubs
eval deck[45] Six   6  Clubs
eval deck[46] Seven 7  Clubs
eval deck[47] Eight 8  Clubs
eval deck[48] Nine  9  Clubs
eval deck[49] Ten   10 Clubs
eval deck[50] Jack  10 Clubs
eval deck[51] Queen 10 Clubs
eval deck[52] King  10 Clubs
eval nam 1
eval val 2
eval suit 3
eval plr %actor.id%
if bet == %cmd%
  if %actor.varexists(playing_blackjack)%
    %send% %actor% You're already playing! Finish your current game first.
    halt
  end
  if %arg% < 100 || %arg% > 100000 || !%arg%
    %send% %actor% You must bet an amount from 100 to 100,000.
    halt
  else
    eval betamt %arg%
    if %actor.gold% < %betamt%
      %send% %actor% You don't have that much gold!
      halt
    else
      nop %actor.gold(-%betamt%)%
      %echo% %self.name% shuffles the deck.
      **********************************************************
      * New Game - Draw first card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Get the card from the deck
      eval pcard1 %%deck[%i%]%%
      * Add the card to the used string. Since this is the
      * first card, simply eval it
      eval used %i% 
      * Extract the values from the array and say to player
      extract pnam1 %nam% %pcard1%
      extract pval1 %val% %pcard1%
      extract psuit1 %suit% %pcard1%
      %echoaround% %actor% %self.name% deals %actor.name% a card face-down.
      %send% %actor% %self.name% deals you a %pnam1% of %psuit1%, worth %pval1% points.
      * Done with first player card
      **********************************************************
      * Draw first dealer card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Get the card from the deck
      eval dcard1 %%deck[%i%]%%
      * Add the card to the used string. Since this is the
      * first card, simply eval it
      eval used %used% %
      * Extract the values from the array and say to player
      extract dnam1 %nam% %dcard1%
      extract dval1 %val% %dcard1%
      extract dsuit1 %suit% %dcard1%
      %echo% %self.name% deals %self.himher%self a card face-down.
      * Done with first dealer card
      **********************************************************
      * Draw second player card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard2 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array and say to player
      extract pnam2 %nam% %pcard2%
      extract pval2 %val% %pcard2%
      extract psuit2 %suit% %pcard2%
      if %pval1% == 11 && %pval2% == 11
        eval pval1 1
      end
      %echoaround% %actor% %self.name% deals %actor.name% a %pnam2% of %psuit2%, worth %pval2% points.
      %send% %actor% %self.name% deals you a %pnam2% of %psuit2%, worth %pval2% points.
      **********************************************************
      * Draw second dealer card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard2 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array and say to player
      extract dnam2 %nam% %dcard2%
      extract dval2 %val% %dcard2%
      extract dsuit2 %suit% %dcard2%
      if %dval1% == 11 && %dval2% == 11
        eval dval1 1
      end
      eval cards 2
      %echo% %self.name% deals %self.himher%self a %dnam2% of %dsuit2%, worth %dval2% points.
      eval ptotal %pval1% + %pval2%
      %send% %actor% Your %cards% cards total %ptotal%.
      eval dtotal %dval1% + %dval2%
      %echo% %self.name% checks %self.hisher% cards.
      * If we have blackjack, check for dealer blackjack tie, quit
      if %ptotal% == 21
        * Did dealer also get blackjack? Return bet if so
        if %dtotal% == 21
          %echo% %self.name% looks boggled.
          %echo% %self.name% reveals their hand showing %dnam1% of %dsuit1% and %dnam2% of %dsuit2%.
          say Well, I guess we tie on this one, %actor.name%.
          %send% %actor% %self.name% hands you back your %betamt% coins.
          nop %actor.gold(%betamt%)%
          halt
        end
        if %psuit1% == %psuit2%
          * Same-suit blackjack pays out 6:1
          say Same-suit Blackjack! You win the big payout, %actor.name%!
          eval prize %betamt% * 6
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
          halt
        else
          * Regular blackjack pays out 3:1
          say Blackjack! You win, %actor.name%!
          eval prize %betamt% * 3
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
          halt
        end
      end
      if %dtotal% == 21
        say Woohoo! Blackjack! Sorry, %actor.name%, you lose!
        halt
      end
      * No blackjack, assign variables to player
      eval playing_blackjack 1
      remote playing_blackjack %plr%
      remote pval1 %plr%
      remote pnam1 %plr%
      remote psuit1 %plr%
      remote pval2 %plr%
      remote pnam2 %plr%
      remote psuit2 %plr%
      remote dval1 %plr%
      remote dnam1 %plr%
      remote dsuit1 %plr%
      remote dval2 %plr%
      remote dnam2 %plr%
      remote dsuit2 %plr%
      remote used %plr%
      remote betamt %plr%
      say Ok, no blackjacks. Would you like to hit, stand, or know your total, %actor.name%?
      halt
      * Done with second card
      **********************************************************
    end
  end
else
  return 0
end

Hit Command:
1) Name         : Blackjack Hit Cmd
2) Intended for : Mobiles
3) Trigger types: Command 
4) Numeric Arg  : 1
5) Arguments    : hit
6) Commands:
eval deck[01] Ace   11 Diamonds
eval deck[02] Two   2  Diamonds
eval deck[03] Three 3  Diamonds
eval deck[04] Four  4  Diamonds
eval deck[05] Five  5  Diamonds
eval deck[06] Six   6  Diamonds
eval deck[07] Seven 7  Diamonds
eval deck[08] Eight 8  Diamonds
eval deck[09] Nine  9  Diamonds
eval deck[10] Ten   10 Diamonds
eval deck[11] Jack  10 Diamonds
eval deck[12] Queen 10 Diamonds
eval deck[13] King  10 Diamonds
eval deck[14] Ace   11 Hearts
eval deck[15] Two   2  Hearts
eval deck[16] Three 3  Hearts
eval deck[17] Four  4  Hearts
eval deck[18] Five  5  Hearts
eval deck[19] Six   6  Hearts
eval deck[20] Seven 7  Hearts
eval deck[21] Eight 8  Hearts
eval deck[22] Nine  9  Hearts
eval deck[23] Ten   10 Hearts
eval deck[24] Jack  10 Hearts
eval deck[25] Queen 10 Hearts
eval deck[26] King  10 Hearts
eval deck[27] Ace   11 Spades
eval deck[28] Two   2  Spades
eval deck[29] Three 3  Spades
eval deck[30] Four  4  Spades
eval deck[31] Five  5  Spades
eval deck[32] Six   6  Spades
eval deck[33] Seven 7  Spades
eval deck[34] Eight 8  Spades
eval deck[35] Nine  9  Spades
eval deck[36] Ten   10 Spades
eval deck[37] Jack  10 Spades
eval deck[38] Queen 10 Spades
eval deck[39] King  10 Spades
eval deck[40] Ace   11 Clubs
eval deck[41] Two   2  Clubs
eval deck[42] Three 3  Clubs
eval deck[43] Four  4  Clubs
eval deck[44] Five  5  Clubs
eval deck[45] Six   6  Clubs
eval deck[46] Seven 7  Clubs
eval deck[47] Eight 8  Clubs
eval deck[48] Nine  9  Clubs
eval deck[49] Ten   10 Clubs
eval deck[50] Jack  10 Clubs
eval deck[51] Queen 10 Clubs
eval deck[52] King  10 Clubs
eval nam 1
eval val 2
eval suit 3
eval plr %actor.id%
if hit == %cmd%
  if !%actor.varexists(playing_blackjack)%
    %send% %actor% You must place a bet first!
    halt
  else
    * Already playing, get existing cards
    if %actor.varexists(pval4)%
      eval pval4 %actor.pval4%
      eval pnam4 %actor.pnam4%
      eval psuit4 %actor.psuit4%
    end
    if %actor.varexists(pval3)%
      eval pval3 %actor.pval3%
      eval pnam3 %actor.pnam3%
      eval psuit3 %actor.psuit3%
    end
    eval pval2 %actor.pval2%
    eval pnam2 %actor.pnam2%
    eval psuit2 %actor.psuit2%
    eval pval1 %actor.pval1%
    eval pnam1 %actor.pnam1%
    eval psuit1 %actor.psuit1%
    eval dval2 %actor.dval2%
    eval dnam2 %actor.dnam2%
    eval dsuit2 %actor.dsuit2%
    eval dval1 %actor.dval1%
    eval dnam1 %actor.dnam1%
    eval dsuit1 %actor.dsuit1%
    eval used %actor.used%
    eval betamt %actor.betamt%
    if %pval4%
      eval cards 4
    elseif %pval3%
      eval cards 3
    else
      eval cards 2
    end
    * Done initializing
    ************************************************
    * Deal hit cards
    if %cards% == 2
      * Draw third player card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard3 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract pnam3 %nam% %pcard3%
      extract pval3 %val% %pcard3%
      extract psuit3 %suit% %pcard3%
      * Calc total and check if Ace value is too high
      eval ptotal %pval1% + %pval2%
      if %pval3% == 11
        if %ptotal% < 11
          eval pval3 11
        else
          eval pval3 1
        end
      end
      eval ptotal %pval1% + %pval2% + %pval3%
      if %ptotal% > 21
        if %pval1% == 11
          eval pval1 1
          remote pval1 %plr%
        elseif %pval2% == 11
          eval pval2 1
          remote pval2 %plr%
        end
      end
      eval cards 3
      %echoaround% %actor% %self.name% deals %actor.name% a card.
      %send% %actor% %self.name% deals you a %pnam3% of %psuit3%, worth %pval3% points.
      eval ptotal %pval1% + %pval2% + %pval3%
      * If bust, quit and delete player vars, else add card3 to player
      if %ptotal% > 21
        say Sorry, %actor.name%, you bust with %ptotal%!
        rdelete pval1 %plr%
        rdelete pnam1 %plr%
        rdelete psuit1 %plr%
        rdelete pval2 %plr%
        rdelete pnam2 %plr%
        rdelete psuit2 %plr%
        rdelete dval1 %plr%
        rdelete dnam1 %plr%
        rdelete dsuit1 %plr%
        rdelete dval2 %plr%
        rdelete dnam2 %plr%
        rdelete dsuit2 %plr%
        rdelete used %plr%
        rdelete betamt %plr%
        rdelete playing_blackjack %plr%
        halt
      else
        remote pval3 %plr%
        remote pnam3 %plr%
        remote psuit3 %plr%
        remote used %plr%
        %send% %actor% Your %cards% cards total %ptotal%.
        say Would you like to hit, stand, or know your total, %actor.name%?
        halt
      end
      * Done with third card
    elseif %cards% == 3
      * Draw fourth player card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard4 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract pnam4 %nam% %pcard4%
      extract pval4 %val% %pcard4%
      extract psuit4 %suit% %pcard4%
      * Calc total and check if Ace value is too high
      eval ptotal %pval1% + %pval2% + %pval3%
      if %pval4% == 11
        if %ptotal% < 11
          eval pval4 11
        else
          eval pval4 1
        end
      end
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4%
      if %ptotal% > 21
        if %pval1% == 11
          eval pval1 1
          remote pval1 %plr%
        elseif %pval2% == 11
          eval pval2 1
          remote pval2 %plr%
        elseif %pval3% == 11
          eval pval3 1
          remote pval3 %plr%
        end
      end
      eval cards 4
      %echoaround% %actor% %self.name% deals %actor.name% a card.
      %send% %actor% %self.name% deals you a %pnam4% of %psuit4%, worth %pval4% points.
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4%
      * If bust, quit and delete player vars, else add card3 to player
      if %ptotal% > 21
        say Sorry, %actor.name%, you bust with %ptotal%!
        rdelete pval1 %plr%
        rdelete pnam1 %plr%
        rdelete psuit1 %plr%
        rdelete pval2 %plr%
        rdelete pnam2 %plr%
        rdelete psuit2 %plr%
        rdelete pval3 %plr%
        rdelete pnam3 %plr%
        rdelete psuit3 %plr%
        rdelete dval1 %plr%
        rdelete dnam1 %plr%
        rdelete dsuit1 %plr%
        rdelete dval2 %plr%
        rdelete dnam2 %plr%
        rdelete dsuit2 %plr%
        rdelete used %plr%
        rdelete betamt %plr%
        rdelete playing_blackjack %plr%
        halt
      else
        remote pval4 %plr%
        remote pnam4 %plr%
        remote psuit4 %plr%
        remote used %plr%
        %send% %actor% Your %cards% cards total %ptotal%.
        say Would you like to hit, stand, or know your total, %actor.name%?
        halt
      end
      * Done with fourth card
    elseif %cards% == 4
      * Draw fifth card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard5 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array and say to player
      extract pnam5 %nam% %pcard5%
      extract pval5 %val% %pcard5%
      extract psuit5 %suit% %pcard5%
      * Calc total and check if Ace value is too high
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4%
      if %pval5% == 11
        if %ptotal% < 11
          eval pval5 11
        else
          eval pval5 1
        end
      end
      %echoaround% %actor% %self.name% deals %actor.name% a card.
      %send% %actor% %self.name% deals you a %pnam5% of %psuit5%, worth %pval5% points.
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4% + %pval5%
      * Last card, don't need to update remotes
      if %ptotal% > 21
        if %pval1% == 11
          eval pval1 1
        elseif %pval2% == 11
          eval pval2 1
        elseif %pval3% == 11
          eval pval3 1
        elseif %pval4% == 11
          eval pval4 1
        end
      end
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4% + %pval5%
      eval cards 5
      %send% %actor% Your %cards% cards total %ptotal%.
      * Check for bust or 5-card charlie. Delete player vars.
      if %ptotal% > 21
        say Sorry, %actor.name%, you bust with %ptotal%!
      else
        say 5-Card Charlie! You win, %actor.name%!
        eval prize %betamt% * 5
        nop %actor.gold(%betamt%)%
        %send% %actor% You win %prize% coins!
      end
      rdelete pval1 %plr%
      rdelete pnam1 %plr%
      rdelete psuit1 %plr%
      rdelete pval2 %plr%
      rdelete pnam2 %plr%
      rdelete psuit2 %plr%
      rdelete pval3 %plr%
      rdelete pnam3 %plr%
      rdelete psuit3 %plr%
      rdelete pval4 %plr%
      rdelete pnam4 %plr%
      rdelete psuit4 %plr%
      rdelete dval1 %plr%
      rdelete dnam1 %plr%
      rdelete dsuit1 %plr%
      rdelete dval2 %plr%
      rdelete dnam2 %plr%
      rdelete dsuit2 %plr%
      rdelete used %plr%
      rdelete betamt %plr%
      rdelete playing_blackjack %plr%
      halt
    end
    * Done with fifth card
  end
else
  return 0
end

Stand Command:
1) Name         : Blackjack Stand Cmd
2) Intended for : Mobiles
3) Trigger types: Command 
4) Numeric Arg  : 1
5) Arguments    : stand
6) Commands:
eval deck[01] Ace   11 Diamonds
eval deck[02] Two   2  Diamonds
eval deck[03] Three 3  Diamonds
eval deck[04] Four  4  Diamonds
eval deck[05] Five  5  Diamonds
eval deck[06] Six   6  Diamonds
eval deck[07] Seven 7  Diamonds
eval deck[08] Eight 8  Diamonds
eval deck[09] Nine  9  Diamonds
eval deck[10] Ten   10 Diamonds
eval deck[11] Jack  10 Diamonds
eval deck[12] Queen 10 Diamonds
eval deck[13] King  10 Diamonds
eval deck[14] Ace   11 Hearts
eval deck[15] Two   2  Hearts
eval deck[16] Three 3  Hearts
eval deck[17] Four  4  Hearts
eval deck[18] Five  5  Hearts
eval deck[19] Six   6  Hearts
eval deck[20] Seven 7  Hearts
eval deck[21] Eight 8  Hearts
eval deck[22] Nine  9  Hearts
eval deck[23] Ten   10 Hearts
eval deck[24] Jack  10 Hearts
eval deck[25] Queen 10 Hearts
eval deck[26] King  10 Hearts
eval deck[27] Ace   11 Spades
eval deck[28] Two   2  Spades
eval deck[29] Three 3  Spades
eval deck[30] Four  4  Spades
eval deck[31] Five  5  Spades
eval deck[32] Six   6  Spades
eval deck[33] Seven 7  Spades
eval deck[34] Eight 8  Spades
eval deck[35] Nine  9  Spades
eval deck[36] Ten   10 Spades
eval deck[37] Jack  10 Spades
eval deck[38] Queen 10 Spades
eval deck[39] King  10 Spades
eval deck[40] Ace   11 Clubs
eval deck[41] Two   2  Clubs
eval deck[42] Three 3  Clubs
eval deck[43] Four  4  Clubs
eval deck[44] Five  5  Clubs
eval deck[45] Six   6  Clubs
eval deck[46] Seven 7  Clubs
eval deck[47] Eight 8  Clubs
eval deck[48] Nine  9  Clubs
eval deck[49] Ten   10 Clubs
eval deck[50] Jack  10 Clubs
eval deck[51] Queen 10 Clubs
eval deck[52] King  10 Clubs
eval nam 1
eval val 2
eval suit 3
eval plr %actor.id%
if stand == %cmd%
  if !%actor.varexists(playing_blackjack)%
    return 0
  else
    * Already playing, get existing cards
    if %actor.varexists(pval4)%
      eval pval4 %actor.pval4%
      eval pnam4 %actor.pnam4%
      eval psuit4 %actor.psuit4%
    end
    if %actor.varexists(pval3)%
      eval pval3 %actor.pval3%
      eval pnam3 %actor.pnam3%
      eval psuit3 %actor.psuit3%
    end
    eval pval2 %actor.pval2%
    eval pnam2 %actor.pnam2%
    eval psuit2 %actor.psuit2%
    eval pval1 %actor.pval1%
    eval pnam1 %actor.pnam1%
    eval psuit1 %actor.psuit1%
    eval dval2 %actor.dval2%
    eval dnam2 %actor.dnam2%
    eval dsuit2 %actor.dsuit2%
    eval dval1 %actor.dval1%
    eval dnam1 %actor.dnam1%
    eval dsuit1 %actor.dsuit1%
    eval used %actor.used%
    eval betamt %actor.betamt%
    if %pval4%
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4%
    elseif %pval3%
      eval ptotal %pval1% + %pval2% + %pval3%
    else
      eval ptotal %pval1% + %pval2%
    end
    %send% %actor% You stand with %ptotal%.
    %echoaround% %actor% %actor.name% stands with %ptotal%.
    * Done initializing
    ************************************************
    * Now deal cards to dealer until dtotal >= 17, bust,
    * or 5-card charlie.
    *
    * First check to see if dealer total >= 17
    eval dtotal %dval1% + %dval2%
    if %dtotal% >= 17
      %echo% %self.name% reveals a %dnam1% of %dsuit1%, worth %dval1% points.
      %echo% %self.name% reveals a %dnam2% of %dsuit2%, worth %dval2% points.
      %echo% %self.name% stands with %dtotal%.
      if %ptotal% > %dtotal%
        say You beat my %dtotal% with %ptotal%. You win, %actor.name%!
        eval prize %betamt% * 2
        nop %actor.gold(%prize%)%
        %send% %actor% You win %prize% coins!
      elseif %ptotal% == %dtotal%
        say It's a push, %actor.name%. Here's your coins back.
        nop %actor.gold(%betamt%)%
        %send% %actor% %self.name% gives you %betamt% coins.
      elseif %ptotal% < %dtotal%
        say Sorry %actor.name%, but my %dtotal% beats your %ptotal%. You lose!
      end
      eval endgame 1
    end
    if !%endgame%
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard3 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam3 %nam% %dcard3%
      extract dval3 %val% %dcard3%
      extract dsuit3 %suit% %dcard3%
      * Calc total and check if Ace value is too high
      eval dtotal %dval1% + %dval2%
      if %dval3% == 11
        if %dtotal% < 11
          eval dval3 11
        else
          eval dval3 1
        end
      end
      eval dtotal %dval1% + %dval2% + %dval3%
      if %dtotal% > 21
        if %dval1% == 11
          eval dval1 1
        elseif %dval2% == 11
          eval dval2 1
        end
      end
      %echo% %self.name% deals %self.himher%self a %dnam3% of %dsuit3%, worth %dval3% points.
      eval dtotal %dval1% + %dval2% + %dval3%
      if %dtotal% > 21
        say Whoops, I bust! You win, %actor.name%!
        eval prize %betamt% * 2
        nop %actor.gold(%prize%)%
        %send% %actor% You win %prize% coins!
        eval endgame 1
      end
      if %dtotal% >= 17 && !%endgame%
        %echo% %self.name% reveals a %dnam1% of %dsuit1%, worth %dval1% points.
        %echo% %self.name% reveals a %dnam2% of %dsuit2%, worth %dval2% points.
        %echo% %self.name% reveals a %dnam3% of %dsuit3%, worth %dval3% points.
        %echo% %self.name% stands with %dtotal%.
        if %ptotal% > %dtotal%
          say You beat my %dtotal% with %ptotal%. You win, %actor.name%!
          eval prize %betamt% * 2
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
        elseif %ptotal% == %dtotal%
          say It's a push, %actor.name%. Here's your coins back.
          nop %actor.gold(%betamt%)%
          %send% %actor% %self.name% gives you %betamt% coins.
        elseif %ptotal% < %dtotal%
          say Sorry %actor.name%, but my %dtotal% beats your %ptotal%. You lose!
        end
        eval endgame 1
      end
    end
    * Done with dealer third card
    ********************************************************
    if !%endgame%
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard4 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam4 %nam% %dcard4%
      extract dval4 %val% %dcard4%
      extract dsuit4 %suit% %dcard4%
      * Calc total and check if Ace value is too high
      eval dtotal %dval1% + %dval2% + %dval3%
      if %dval4% == 11
        if %dtotal% < 11
          eval dval4 11
        else
          eval dval4 1
        end
      end
      eval dtotal %dval1% + %dval2% + %dval3% + %dval4%
      if %dtotal% > 21
        if %dval1% == 11
          eval dval1 1
        elseif %dval2% == 11
          eval dval2 1
        elseif %dval3% == 11
          eval dval3 1
        end
      end
      %echo% %self.name% deals %self.himher%self a %dnam4% of %dsuit4%, worth %dval4% points.
      eval dtotal %dval1% + %dval2% + %dval3% + %dval4%
      if %dtotal% > 21
        say Whoops, I bust! You win, %actor.name%!
        eval prize %betamt% * 2
        nop %actor.gold(%prize%)%
        %send% %actor% You win %prize% coins!
        eval endgame 1
      end
      if %dtotal% >= 17 && !%endgame%
        %echo% %self.name% reveals a %dnam1% of %dsuit1%, worth %dval1% points.
        %echo% %self.name% reveals a %dnam2% of %dsuit2%, worth %dval2% points.
        %echo% %self.name% reveals a %dnam3% of %dsuit3%, worth %dval3% points.
        %echo% %self.name% reveals a %dnam4% of %dsuit4%, worth %dval4% points.
        %echo% %self.name% stands with %dtotal%.
        if %ptotal% > %dtotal%
          say You beat my %dtotal% with %ptotal%. You win, %actor.name%!
          eval prize %betamt% * 2
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
        elseif %ptotal% == %dtotal%
          say It's a push, %actor.name%. Here's your coins back.
          nop %actor.gold(%betamt%)%
          %send% %actor% %self.name% gives you %betamt% coins.
        elseif %ptotal% < %dtotal%
          say Sorry %actor.name%, but my %dtotal% beats your %ptotal%. You lose!
        end
        eval endgame 1
      end
    end
    * Done with dealer fourth card
    ********************************************************
    * Dealer fifth card
    if !%endgame%
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard5 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam5 %nam% %dcard5%
      extract dval5 %val% %dcard5%
      extract dsuit5 %suit% %dcard5%
      * Calc total and check if Ace value is too high
      eval dtotal %dval1% + %dval2% + %dval3% + %dval4%
      if %dval5% == 11
        if %dtotal% < 11
          eval dval5 11
        else
          eval dval5 1
        end
      end
      eval dtotal %dval1% + %dval2% + %dval3% + %dval4% + %dval5%
      if %dtotal% > 21
        if %dval1% == 11
          eval dval1 1
        elseif %dval2% == 11
          eval dval2 1
        elseif %dval3% == 11
          eval dval3 1
        elseif %dval4% == 11
          eval dval4 1
        end
      end
      %echo% %self.name% deals %self.himher%self a %dnam5% of %dsuit5%, worth %dval5% points.
      eval dtotal %dval1% + %dval2% + %dval3% + %dval4% + %dval5%
      if %dtotal% > 21
        say Whoops, I bust! You win, %actor.name%!
        eval prize %betamt% * 2
        nop %actor.gold(%prize%)%
        %send% %actor% You win %prize% coins!
        eval endgame 1
      end
      if %dtotal% >= 17 && !%endgame%
        say Woohoo! 5-Card Charlie! Sorry, %actor.name%, but I win!
      end
    end
    rdelete pval1 %plr%
    rdelete pnam1 %plr%
    rdelete psuit1 %plr%
    rdelete pval2 %plr%
    rdelete pnam2 %plr%
    rdelete psuit2 %plr%
    if %actor.varexists(pval3)%
      rdelete pval3 %plr%
      rdelete pnam3 %plr%
      rdelete psuit3 %plr%
    end
    if %actor.varexists(pval4)%
      rdelete pval4 %plr%
      rdelete pnam4 %plr%
      rdelete psuit4 %plr%
    end
    rdelete dval1 %plr%
    rdelete dnam1 %plr%
    rdelete dsuit1 %plr%
    rdelete dval2 %plr%
    rdelete dnam2 %plr%
    rdelete dsuit2 %plr%
    rdelete used %plr%
    rdelete betamt %plr%
    rdelete playing_blackjack %plr%
    halt
  end
else
  return 0
end

Enjoy!


17 Feb 2010 - 21:422355
Typo in Bet Command
Here's an updated Bet command. Fixed a typo when adding a card to the used string. Also noticed I wasn't checking the first dealer card to see if it had been used yet.

Bet Command:
1) Name         : Blackjack Bet Cmd
2) Intended for : Mobiles
3) Trigger types: Command 
4) Numeric Arg  : 1
5) Arguments    : bet
6) Commands:
eval deck[01] Ace   11 Diamonds
eval deck[02] Two   2  Diamonds
eval deck[03] Three 3  Diamonds
eval deck[04] Four  4  Diamonds
eval deck[05] Five  5  Diamonds
eval deck[06] Six   6  Diamonds
eval deck[07] Seven 7  Diamonds
eval deck[08] Eight 8  Diamonds
eval deck[09] Nine  9  Diamonds
eval deck[10] Ten   10 Diamonds
eval deck[11] Jack  10 Diamonds
eval deck[12] Queen 10 Diamonds
eval deck[13] King  10 Diamonds
eval deck[14] Ace   11 Hearts
eval deck[15] Two   2  Hearts
eval deck[16] Three 3  Hearts
eval deck[17] Four  4  Hearts
eval deck[18] Five  5  Hearts
eval deck[19] Six   6  Hearts
eval deck[20] Seven 7  Hearts
eval deck[21] Eight 8  Hearts
eval deck[22] Nine  9  Hearts
eval deck[23] Ten   10 Hearts
eval deck[24] Jack  10 Hearts
eval deck[25] Queen 10 Hearts
eval deck[26] King  10 Hearts
eval deck[27] Ace   11 Spades
eval deck[28] Two   2  Spades
eval deck[29] Three 3  Spades
eval deck[30] Four  4  Spades
eval deck[31] Five  5  Spades
eval deck[32] Six   6  Spades
eval deck[33] Seven 7  Spades
eval deck[34] Eight 8  Spades
eval deck[35] Nine  9  Spades
eval deck[36] Ten   10 Spades
eval deck[37] Jack  10 Spades
eval deck[38] Queen 10 Spades
eval deck[39] King  10 Spades
eval deck[40] Ace   11 Clubs
eval deck[41] Two   2  Clubs
eval deck[42] Three 3  Clubs
eval deck[43] Four  4  Clubs
eval deck[44] Five  5  Clubs
eval deck[45] Six   6  Clubs
eval deck[46] Seven 7  Clubs
eval deck[47] Eight 8  Clubs
eval deck[48] Nine  9  Clubs
eval deck[49] Ten   10 Clubs
eval deck[50] Jack  10 Clubs
eval deck[51] Queen 10 Clubs
eval deck[52] King  10 Clubs
eval nam 1
eval val 2
eval suit 3
eval plr %actor.id%
if bet == %cmd%
  if %actor.varexists(playing_blackjack)%
    %send% %actor% You're already playing! Finish your current game first.
    halt
  end
  if %arg% < 100 || %arg% > 100000 || !%arg%
    %send% %actor% You must bet an amount from 100 to 100,000.
    halt
  else
    eval betamt %arg%
    if %actor.gold% < %betamt%
      %send% %actor% You don't have that much gold!
      halt
    else
      nop %actor.gold(-%betamt%)%
      %echo% %self.name% shuffles the deck.
      **********************************************************
      * New Game - Draw first card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Get the card from the deck
      eval pcard1 %%deck[%i%]%%
      * Add the card to the used string. Since this is the
      * first card, simply eval it
      eval used %i% 
      * Extract the values from the array
      extract pnam1 %nam% %pcard1%
      extract pval1 %val% %pcard1%
      extract psuit1 %suit% %pcard1%
      %echoaround% %actor% %self.name% deals %actor.name% a card face-down.
      %send% %actor% %self.name% deals you a %pnam1% of %psuit1%, worth %pval1% points.
      * Done with first player card
      **********************************************************
      * Draw first dealer card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard2 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam1 %nam% %dcard1%
      extract dval1 %val% %dcard1%
      extract dsuit1 %suit% %dcard1%
      %echo% %self.name% deals %self.himher%self a card face-down.
      * Done with first dealer card
      **********************************************************
      * Draw second player card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard2 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract pnam2 %nam% %pcard2%
      extract pval2 %val% %pcard2%
      extract psuit2 %suit% %pcard2%
      if %pval1% == 11 && %pval2% == 11
        eval pval1 1
      end
      %echoaround% %actor% %self.name% deals %actor.name% a %pnam2% of %psuit2%, worth %pval2% points.
      %send% %actor% %self.name% deals you a %pnam2% of %psuit2%, worth %pval2% points.
      **********************************************************
      * Draw second dealer card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard2 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam2 %nam% %dcard2%
      extract dval2 %val% %dcard2%
      extract dsuit2 %suit% %dcard2%
      if %dval1% == 11 && %dval2% == 11
        eval dval1 1
      end
      eval cards 2
      %echo% %self.name% deals %self.himher%self a %dnam2% of %dsuit2%, worth %dval2% points.
      eval ptotal %pval1% + %pval2%
      %send% %actor% Your %cards% cards total %ptotal%.
      eval dtotal %dval1% + %dval2%
      %echo% %self.name% checks %self.hisher% cards.
      * If we have blackjack, check for dealer blackjack tie, quit
      if %ptotal% == 21
        * Did dealer also get blackjack? Return bet if so
        if %dtotal% == 21
          %echo% %self.name% looks boggled.
          %echo% %self.name% reveals their hand showing %dnam1% of %dsuit1% and %dnam2% of %dsuit2%.
          say Well, I guess we tie on this one, %actor.name%.
          %send% %actor% %self.name% hands you back your %betamt% coins.
          nop %actor.gold(%betamt%)%
          halt
        end
        if %psuit1% == %psuit2%
          * Same-suit blackjack pays out 6:1
          say Same-suit Blackjack! You win the big payout, %actor.name%!
          eval prize %betamt% * 6
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
          halt
        else
          * Regular blackjack pays out 3:1
          say Blackjack! You win, %actor.name%!
          eval prize %betamt% * 3
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
          halt
        end
      end
      if %dtotal% == 21
        say Woohoo! Blackjack! Sorry, %actor.name%, you lose!
        halt
      end
      * No blackjack, assign variables to player
      eval playing_blackjack 1
      remote playing_blackjack %plr%
      remote pval1 %plr%
      remote pnam1 %plr%
      remote psuit1 %plr%
      remote pval2 %plr%
      remote pnam2 %plr%
      remote psuit2 %plr%
      remote dval1 %plr%
      remote dnam1 %plr%
      remote dsuit1 %plr%
      remote dval2 %plr%
      remote dnam2 %plr%
      remote dsuit2 %plr%
      remote used %plr%
      remote betamt %plr%
      say Ok, no blackjacks. Would you like to hit, stand, or know your total, %actor.name%?
      halt
      * Done with second card
      **********************************************************
    end
  end
else
  return 0
end


18 Feb 2010 - 07:082358
Might be worth toying with the idea of somehow globalling all the evals so they only have to be listed once.

I'm not talking about this though:

eval deck[1] blah
global deck1

more like

set num 1
while %num% <= 52
  if %num.strlen% == 1
    set value 0%num%
  else
    set value %num%
  end
  eval card %%deck[%value%]%%
  global deck[%num%]
  eval card %card% + 1
done


__________________

Last edited by Fizban (18 Feb 2010 - 07:42)
18 Feb 2010 - 15:342360
Thanks Fizban!
Taking Fizban's advice, I created a new trigger that will setup the deck when the mob loads. This removes the need to setup the deck with every command. Also added some loops for getting/deleting/remoting player data.

New Deck Setup Trigger:
1) Name         : Blackjack Deck Setup
2) Intended for : Mobiles
3) Trigger types: Load 
4) Numeric Arg  : 100
5) Arguments    : 
6) Commands:
eval deck[01] Ace   11 Diamonds
eval deck[02] Two   2  Diamonds
eval deck[03] Three 3  Diamonds
eval deck[04] Four  4  Diamonds
eval deck[05] Five  5  Diamonds
eval deck[06] Six   6  Diamonds
eval deck[07] Seven 7  Diamonds
eval deck[08] Eight 8  Diamonds
eval deck[09] Nine  9  Diamonds
eval deck[10] Ten   10 Diamonds
eval deck[11] Jack  10 Diamonds
eval deck[12] Queen 10 Diamonds
eval deck[13] King  10 Diamonds
eval deck[14] Ace   11 Hearts
eval deck[15] Two   2  Hearts
eval deck[16] Three 3  Hearts
eval deck[17] Four  4  Hearts
eval deck[18] Five  5  Hearts
eval deck[19] Six   6  Hearts
eval deck[20] Seven 7  Hearts
eval deck[21] Eight 8  Hearts
eval deck[22] Nine  9  Hearts
eval deck[23] Ten   10 Hearts
eval deck[24] Jack  10 Hearts
eval deck[25] Queen 10 Hearts
eval deck[26] King  10 Hearts
eval deck[27] Ace   11 Spades
eval deck[28] Two   2  Spades
eval deck[29] Three 3  Spades
eval deck[30] Four  4  Spades
eval deck[31] Five  5  Spades
eval deck[32] Six   6  Spades
eval deck[33] Seven 7  Spades
eval deck[34] Eight 8  Spades
eval deck[35] Nine  9  Spades
eval deck[36] Ten   10 Spades
eval deck[37] Jack  10 Spades
eval deck[38] Queen 10 Spades
eval deck[39] King  10 Spades
eval deck[40] Ace   11 Clubs
eval deck[41] Two   2  Clubs
eval deck[42] Three 3  Clubs
eval deck[43] Four  4  Clubs
eval deck[44] Five  5  Clubs
eval deck[45] Six   6  Clubs
eval deck[46] Seven 7  Clubs
eval deck[47] Eight 8  Clubs
eval deck[48] Nine  9  Clubs
eval deck[49] Ten   10 Clubs
eval deck[50] Jack  10 Clubs
eval deck[51] Queen 10 Clubs
eval deck[52] King  10 Clubs
eval cnum 1
while %cnum% <= 52
  if %cnum% < 10
    eval value 0%cnum%
  else
    eval value %cnum%
  end
  global deck[%value%]
  eval cnum %cnum% + 1
done
eval nam 1
eval val 2
eval suit 3
global nam
global val
global suit

Updated Bet Command:
1) Name         : Blackjack Bet Cmd
2) Intended for : Mobiles
3) Trigger types: Command 
4) Numeric Arg  : 1
5) Arguments    : bet
6) Commands:
eval plr %actor.id%
if bet == %cmd%
  if %actor.varexists(playing_blackjack)%
    %send% %actor% You're already playing! Finish your current game first.
    halt
  end
  if %arg% < 100 || %arg% > 100000 || !%arg%
    %send% %actor% You must bet an amount from 100 to 100,000.
    halt
  else
    eval betamt %arg%
    if %actor.gold% < %betamt%
      %send% %actor% You don't have that much gold!
      halt
    else
      nop %actor.gold(-%betamt%)%
      %echo% %self.name% shuffles the deck.
      **********************************************************
      * New Game - Draw first card
      eval i %random.52%
      if %i% < 10
        eval i 0%i%
      end
      * Get the card from the deck
      eval pcard1 %%deck[%i%]%%
      * Add the card to the used string. Since this is the
      * first card, simply eval it
      eval used %i%
      * Extract the values from the array
      extract pnam1 %nam% %pcard1%
      extract pval1 %val% %pcard1%
      extract psuit1 %suit% %pcard1%
      %echoaround% %actor% %self.name% deals %actor.name% a card face-down.
      %send% %actor% %self.name% deals you a %pnam1% of %psuit1%, worth %pval1% points.
      * Done with first player card
      **********************************************************
      * Draw first dealer card
      eval i %random.52%
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard1 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam1 %nam% %dcard1%
      extract dval1 %val% %dcard1%
      extract dsuit1 %suit% %dcard1%
      %echo% %self.name% deals %self.himher%self a card face-down.
      * Done with first dealer card
      **********************************************************
      * Draw second player card
      eval i %random.52%
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard2 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract pnam2 %nam% %pcard2%
      extract pval2 %val% %pcard2%
      extract psuit2 %suit% %pcard2%
      if %pval1% == 11 && %pval2% == 11
        eval pval1 1
      end
      %echoaround% %actor% %self.name% deals %actor.name% a %pnam2% of %psuit2%, worth %pval2% points.
      %send% %actor% %self.name% deals you a %pnam2% of %psuit2%, worth %pval2% points.
      **********************************************************
      * Draw second dealer card
      eval i %random.52%
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard2 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam2 %nam% %dcard2%
      extract dval2 %val% %dcard2%
      extract dsuit2 %suit% %dcard2%
      if %dval1% == 11 && %dval2% == 11
        eval dval1 1
      end
      eval cards 2
      %echo% %self.name% deals %self.himher%self a %dnam2% of %dsuit2%, worth %dval2% points.
      eval ptotal %pval1% + %pval2%
      %send% %actor% Your %cards% cards total %ptotal%.
      eval dtotal %dval1% + %dval2%
      %echo% %self.name% checks %self.hisher% cards.
      * If we have blackjack, check for dealer blackjack tie, quit
      if %ptotal% == 21
        * Did dealer also get blackjack? Return bet if so
        if %dtotal% == 21
          %echo% %self.name% looks boggled.
          %echo% %self.name% reveals their hand showing %dnam1% of %dsuit1% and %dnam2% of %dsuit2%.
          say Well, I guess we tie on this one, %actor.name%.
          %send% %actor% %self.name% hands you back your %betamt% coins.
          nop %actor.gold(%betamt%)%
          halt
        end
        if %psuit1% == %psuit2%
          * Same-suit blackjack pays out 6:1
          say Same-suit Blackjack! You win the big payout, %actor.name%!
          eval prize %betamt% * 6
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
          halt
        else
          * Regular blackjack pays out 3:1
          say Blackjack! You win, %actor.name%!
          eval prize %betamt% * 3
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
          halt
        end
      end
      if %dtotal% == 21
        say Woohoo! Blackjack! Sorry, %actor.name%, you lose!
        halt
      end
      * No blackjack, assign variables to player
      eval playing_blackjack 1
      remote playing_blackjack %plr%
      remote ptotal %plr%
      remote dtotal %plr%
      remote pval1 %plr%
      remote pnam1 %plr%
      remote psuit1 %plr%
      remote pval2 %plr%
      remote pnam2 %plr%
      remote psuit2 %plr%
      remote dval1 %plr%
      remote dnam1 %plr%
      remote dsuit1 %plr%
      remote dval2 %plr%
      remote dnam2 %plr%
      remote dsuit2 %plr%
      remote cards %plr%
      remote used %plr%
      remote betamt %plr%
      say Ok, no blackjacks. Would you like to hit, stand, or know your total, %actor.name%?
      halt
      * Done with second card
      **********************************************************
    end
  end
else
  return 0
end

Updated Hit Command:
1) Name         : Blackjack Hit Cmd
2) Intended for : Mobiles
3) Trigger types: Command 
4) Numeric Arg  : 1
5) Arguments    : hit
6) Commands:
eval plr %actor.id%
if hit == %cmd%
  if !%actor.varexists(playing_blackjack)%
    %send% %actor% You must place a bet first!
    halt
  else
    * Already playing, get existing cards
    eval cards %actor.cards%
    eval i 1
    while %i% <= %cards%
      eval pval%i% %%actor.pval%i%%%
      eval pnam%i% %%actor.pnam%i%%%
      eval psuit%i% %%actor.psuit%i%%%
      if %i% <= 2
        eval dval%i% %%actor.dval%i%%%
        eval dnam%i% %%actor.dnam%i%%%
        eval dsuit%i% %%actor.dsuit%i%%%
      end
      eval i %i% + 1
    done
    eval ptotal %actor.ptotal%
    eval dtotal %actor.dtotal%
    eval used %actor.used%
    eval betamt %actor.betamt%   
    * Done initializing
    ************************************************
    * Deal hit cards
    switch %cards%
      case 2
      * Draw third player card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard3 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract pnam3 %nam% %pcard3%
      extract pval3 %val% %pcard3%
      extract psuit3 %suit% %pcard3%
      * Calc total and check if Ace value is too high
      if %pval3% == 11
        if %ptotal% < 11
          eval pval3 11
        else
          eval pval3 1
        end
      end
      eval ptotal %pval1% + %pval2% + %pval3%
      if %ptotal% > 21
        if %pval1% == 11
          eval pval1 1
          remote pval1 %plr%
        elseif %pval2% == 11
          eval pval2 1
          remote pval2 %plr%
        end
      end
      %echoaround% %actor% %self.name% deals %actor.name% a card.
      %send% %actor% %self.name% deals you a %pnam3% of %psuit3%, worth %pval3% points.
      eval ptotal %pval1% + %pval2% + %pval3%
      * If bust, quit and delete player vars, else add card3 to player
      if %ptotal% > 21
        say Sorry, %actor.name%, you bust with %ptotal%!
        eval i 1
        while %i% <= 2
          rdelete pval%i% %plr%
          rdelete pnam%i% %plr%
          rdelete psuit%i% %plr%
          rdelete dval%i% %plr%
          rdelete dnam%i% %plr%
          rdelete dsuit%i% %plr%
          eval i %i% + 1
        done
        rdelete ptotal %plr%
        rdelete dtotal %plr%
        rdelete cards %plr%
        rdelete used %plr%
        rdelete betamt %plr%
        rdelete playing_blackjack %plr%
        halt
      else
        eval cards 3
        remote cards %plr%
        remote pval3 %plr%
        remote pnam3 %plr%
        remote psuit3 %plr%
        remote used %plr%
        remote ptotal %plr%
        %send% %actor% Your %cards% cards total %ptotal%.
        say Would you like to hit, stand, or know your total, %actor.name%?
        halt
      end
      * Done with third card
    break
    case 3
      * Draw fourth player card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard4 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract pnam4 %nam% %pcard4%
      extract pval4 %val% %pcard4%
      extract psuit4 %suit% %pcard4%
      * Calc total and check if Ace value is too high
      if %pval4% == 11
        if %ptotal% < 11
          eval pval4 11
        else
          eval pval4 1
        end
      end
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4%
      if %ptotal% > 21
        if %pval1% == 11
          eval pval1 1
          remote pval1 %plr%
        elseif %pval2% == 11
          eval pval2 1
          remote pval2 %plr%
        elseif %pval3% == 11
          eval pval3 1
          remote pval3 %plr%
        end
      end
      %echoaround% %actor% %self.name% deals %actor.name% a card.
      %send% %actor% %self.name% deals you a %pnam4% of %psuit4%, worth %pval4% points.
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4%
      * If bust, quit and delete player vars, else add card3 to player
      if %ptotal% > 21
        say Sorry, %actor.name%, you bust with %ptotal%!
        eval i 1
        while %i% <= 3
          rdelete pval%i% %plr%
          rdelete pnam%i% %plr%
          rdelete psuit%i% %plr%
          if %i% <= 2
            rdelete dval%i% %plr%
            rdelete dnam%i% %plr%
            rdelete dsuit%i% %plr%
          end
          eval i %i% + 1
        done
        rdelete ptotal %plr%
        rdelete dtotal %plr%
        rdelete cards %plr%
        rdelete used %plr%
        rdelete betamt %plr%
        rdelete playing_blackjack %plr%
        halt
      else
        eval cards 4
        remote cards %plr%
        remote pval4 %plr%
        remote pnam4 %plr%
        remote psuit4 %plr%
        remote used %plr%
        remote ptotal %plr%
        %send% %actor% Your %cards% cards total %ptotal%.
        say Would you like to hit, stand, or know your total, %actor.name%?
        halt
      end
      * Done with fourth card
    break
    case 4
      * Draw fifth card
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval pcard5 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array and say to player
      extract pnam5 %nam% %pcard5%
      extract pval5 %val% %pcard5%
      extract psuit5 %suit% %pcard5%
      * Calc total and check if Ace value is too high
      if %pval5% == 11
        if %ptotal% < 11
          eval pval5 11
        else
          eval pval5 1
        end
      end
      %echoaround% %actor% %self.name% deals %actor.name% a card.
      %send% %actor% %self.name% deals you a %pnam5% of %psuit5%, worth %pval5% points.
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4% + %pval5%
      * Last card, don't need to update remotes
      if %ptotal% > 21
        if %pval1% == 11
          eval pval1 1
        elseif %pval2% == 11
          eval pval2 1
        elseif %pval3% == 11
          eval pval3 1
        elseif %pval4% == 11
          eval pval4 1
        end
      end
      eval ptotal %pval1% + %pval2% + %pval3% + %pval4% + %pval5%
      eval cards 5
      %send% %actor% Your %cards% cards total %ptotal%.
      * Check for bust or 5-card charlie. Delete player vars.
      if %ptotal% > 21
        say Sorry, %actor.name%, you bust with %ptotal%!
      else
        say 5-Card Charlie! You win, %actor.name%!
        eval prize %betamt% * 5
        nop %actor.gold(%prize%)%
        %send% %actor% You win %prize% coins!
      end
      eval i 1
      while %i% <= 4
        rdelete pval%i% %plr%
        rdelete pnam%i% %plr%
        rdelete psuit%i% %plr%
        if %i% <= 2
          rdelete dval%i% %plr%
          rdelete dnam%i% %plr%
          rdelete dsuit%i% %plr%
        end
        eval i %i% + 1
      done
      rdelete ptotal %plr%
      rdelete dtotal %plr%
      rdelete cards %plr%
      rdelete used %plr%
      rdelete betamt %plr%
      rdelete playing_blackjack %plr%
      halt
      * Done with fifth card
    break
  end
else
  return 0
end

Updated Stand Command:
1) Name         : Blackjack Stand Cmd
2) Intended for : Mobiles
3) Trigger types: Command 
4) Numeric Arg  : 1
5) Arguments    : stand
6) Commands:
eval plr %actor.id%
if stand == %cmd%
  if !%actor.varexists(playing_blackjack)%
    return 0
  else
    * Already playing, get existing cards
    eval cards %actor.cards%
    eval i 1
    while %i% <= %cards%
      eval pval%i% %%actor.pval%i%%%
      eval pnam%i% %%actor.pnam%i%%%
      eval psuit%i% %%actor.psuit%i%%%
      if %i% <= 2
        eval dval%i% %%actor.dval%i%%%
        eval dnam%i% %%actor.dnam%i%%%
        eval dsuit%i% %%actor.dsuit%i%%%
      end
      eval i %i% + 1
    done
    eval used %actor.used%
    eval betamt %actor.betamt%
    eval ptotal %actor.ptotal%
    eval dtotal %actor.dtotal%  
    %send% %actor% You stand with %ptotal%.
    %echoaround% %actor% %actor.name% stands with %ptotal%.
    * Done initializing
    ************************************************
    * First check to see if dealer total >= 17
    if %dtotal% >= 17
      %echo% %self.name% reveals a %dnam1% of %dsuit1%, worth %dval1% points.
      %echo% %self.name% reveals a %dnam2% of %dsuit2%, worth %dval2% points.
      %echo% %self.name% stands with %dtotal%.
      if %ptotal% > %dtotal%
        say You beat my %dtotal% with %ptotal%. You win, %actor.name%!
        eval prize %betamt% * 2
        nop %actor.gold(%prize%)%
        %send% %actor% You win %prize% coins!
      elseif %ptotal% == %dtotal%
        say It's a push, %actor.name%. Here's your coins back.
        nop %actor.gold(%betamt%)%
        %send% %actor% %self.name% gives you %betamt% coins.
      elseif %ptotal% < %dtotal%
        say Sorry %actor.name%, but my %dtotal% beats your %ptotal%. You lose!
      end
      eval endgame 1
    end
    * Now deal cards to dealer until dtotal >= 17, bust,
    * or 5-card charlie.
    if !%endgame%
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard3 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam3 %nam% %dcard3%
      extract dval3 %val% %dcard3%
      extract dsuit3 %suit% %dcard3%
      * Calc total and check if Ace value is too high
      if %dval3% == 11
        if %dtotal% < 11
          eval dval3 11
        else
          eval dval3 1
        end
      end
      eval dtotal %dval1% + %dval2% + %dval3%
      if %dtotal% > 21
        if %dval1% == 11
          eval dval1 1
        elseif %dval2% == 11
          eval dval2 1
        end
      end
      %echo% %self.name% deals %self.himher%self a %dnam3% of %dsuit3%, worth %dval3% points.
      eval dtotal %dval1% + %dval2% + %dval3%
      if %dtotal% > 21
        say Whoops, I bust! You win, %actor.name%!
        eval prize %betamt% * 2
        nop %actor.gold(%prize%)%
        %send% %actor% You win %prize% coins!
        eval endgame 1
      end
      if %dtotal% >= 17 && !%endgame%
        %echo% %self.name% reveals a %dnam1% of %dsuit1%, worth %dval1% points.
        %echo% %self.name% reveals a %dnam2% of %dsuit2%, worth %dval2% points.
        %echo% %self.name% reveals a %dnam3% of %dsuit3%, worth %dval3% points.
        %echo% %self.name% stands with %dtotal%.
        if %ptotal% > %dtotal%
          say You beat my %dtotal% with %ptotal%. You win, %actor.name%!
          eval prize %betamt% * 2
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
        elseif %ptotal% == %dtotal%
          say It's a push, %actor.name%. Here's your coins back.
          nop %actor.gold(%betamt%)%
          %send% %actor% %self.name% gives you %betamt% coins.
        elseif %ptotal% < %dtotal%
          say Sorry %actor.name%, but my %dtotal% beats your %ptotal%. You lose!
        end
        eval endgame 1
      end
    end
    * Done with dealer third card
    ********************************************************
    if !%endgame%
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard4 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam4 %nam% %dcard4%
      extract dval4 %val% %dcard4%
      extract dsuit4 %suit% %dcard4%
      * Calc total and check if Ace value is too high
      if %dval4% == 11
        if %dtotal% < 11
          eval dval4 11
        else
          eval dval4 1
        end
      end
      eval dtotal %dval1% + %dval2% + %dval3% + %dval4%
      if %dtotal% > 21
        if %dval1% == 11
          eval dval1 1
        elseif %dval2% == 11
          eval dval2 1
        elseif %dval3% == 11
          eval dval3 1
        end
      end
      %echo% %self.name% deals %self.himher%self a %dnam4% of %dsuit4%, worth %dval4% points.
      eval dtotal %dval1% + %dval2% + %dval3% + %dval4%
      if %dtotal% > 21
        say Whoops, I bust! You win, %actor.name%!
        eval prize %betamt% * 2
        nop %actor.gold(%prize%)%
        %send% %actor% You win %prize% coins!
        eval endgame 1
      end
      if %dtotal% >= 17 && !%endgame%
        %echo% %self.name% reveals a %dnam1% of %dsuit1%, worth %dval1% points.
        %echo% %self.name% reveals a %dnam2% of %dsuit2%, worth %dval2% points.
        %echo% %self.name% reveals a %dnam3% of %dsuit3%, worth %dval3% points.
        %echo% %self.name% reveals a %dnam4% of %dsuit4%, worth %dval4% points.
        %echo% %self.name% stands with %dtotal%.
        if %ptotal% > %dtotal%
          say You beat my %dtotal% with %ptotal%. You win, %actor.name%!
          eval prize %betamt% * 2
          nop %actor.gold(%prize%)%
          %send% %actor% You win %prize% coins!
        elseif %ptotal% == %dtotal%
          say It's a push, %actor.name%. Here's your coins back.
          nop %actor.gold(%betamt%)%
          %send% %actor% %self.name% gives you %betamt% coins.
        elseif %ptotal% < %dtotal%
          say Sorry %actor.name%, but my %dtotal% beats your %ptotal%. You lose!
        end
        eval endgame 1
      end
    end
    * Done with dealer fourth card
    ********************************************************
    * Dealer fifth card
    if !%endgame%
      eval i %random.52%
      * This makes i = 01 or 08, etc instead of 1 or 8
      if %i% < 10
        eval i 0%i%
      end
      * Check the used string to see if this card is already used
      eval test 0
      while %test% == 0
        * If the card # is a substring of the used string, pick another
        if %used% /= %i%
          eval i %random.52%
          if %i% < 10
            eval i 0%i%
          end
        else
          * Card has not been used, add to used string
          eval dcard5 %%deck[%i%]%%
          eval used %used% %i%
          eval test 1
        end
      done
      * Extract the values from the array
      extract dnam5 %nam% %dcard5%
      extract dval5 %val% %dcard5%
      extract dsuit5 %suit% %dcard5%
      * Calc total and check if Ace value is too high
      if %dval5% == 11
        if %dtotal% < 11
          eval dval5 11
        else
          eval dval5 1
        end
      end
      eval dtotal %dval1% + %dval2% + %dval3% + %dval4% + %dval5%
      if %dtotal% > 21
        if %dval1% == 11
          eval dval1 1
        elseif %dval2% == 11
          eval dval2 1
        elseif %dval3% == 11
          eval dval3 1
        elseif %dval4% == 11
          eval dval4 1
        end
      end
      %echo% %self.name% deals %self.himher%self a %dnam5% of %dsuit5%, worth %dval5% points.
      eval dtotal %dval1% + %dval2% + %dval3% + %dval4% + %dval5%
      if %dtotal% > 21
        say Whoops, I bust! You win, %actor.name%!
        eval prize %betamt% * 2
        nop %actor.gold(%prize%)%
        %send% %actor% You win %prize% coins!
        eval endgame 1
      end
      if %dtotal% >= 17 && !%endgame%
        say Woohoo! 5-Card Charlie! Sorry, %actor.name%, but I win!
      end
    end
    eval i 1
    while %i% <= %cards%
      rdelete pval%i% %plr%
      rdelete pnam%i% %plr%
      rdelete psuit%i% %plr%
      if %i% <= 2
        rdelete dval%i% %plr%
        rdelete dnam%i% %plr%
        rdelete dsuit%i% %plr%
      end
      eval i %i% + 1
    done
    rdelete ptotal %plr%
    rdelete dtotal %plr%
    rdelete cards %plr%
    rdelete used %plr%
    rdelete betamt %plr%
    rdelete playing_blackjack %plr%
    halt
  end
else
  return 0
end


25 Feb 2010 - 21:232391
No gamblers in the forums? :-P


26 Feb 2010 - 00:262392
Not lately, but I'll work on developing that habit since I moved closer to Vegas. Thanks for the example. We can always use more trigedit examples of the day.


__________________
Rumble
The Builder Academy
tbamud.com 9091
Login to reply  Page: « < 1 of 1 > »