FANDOM


; Blackjack Dealer NPC Script 
; By UUICEO on REALITYCRAFTERS
; Place this in the right click script of the dealer npc

Dim Deck$(52), Hand$(2, 9)

Function Main()
   Player = Actor()
   Dealer = ContextActor()
   DWWindowBG = 65535; <-Background texture for the dealer window
   Repeat
      ResetHands()
      Result% = 0
      PlayerCash% = Money(Player)
      DW = OpenDialog(Player, Dealer, "Blackjack", DWWindowBG)
         If PlayerCash% > 0 Then
            DialogOutput(Player, DW, "Greetings friend, what would you like to do?", 155, 155, 155)
            If Bet% > 0 And (PlayerCash% >= Bet%) Then
               SelectResult% = DialogInput(Player, DW, "Bet " + Bet% + "|Bet new amount|Rules|Nothing, I changed my mind", "|")
               Selection = 1
            Else
               SelectResult% = DialogInput(Player, DW, "Play Blackjack|Rules|Nothing, I changed my mind", "|")
               Selection = 2
            EndIf
         Else
            DialogOutput(Player, DW, "Sorry " + Name(Player) + " but you don't have any money.")
            DialogInput(Player, DW, "Leave", "|")
            CloseDialog(Player, DW)
            Return
         EndIf
         If Selection = 1 Then
            SelectResult% = SelectResult% - 1
            If SelectResult% = 1 Then
               Selection = 2
            EndIf
            If SelectResult% = 0 Then
               SelectResult% = 1
            EndIf
         EndIf
       
         Select SelectResult%
       
            Case 1 ; <-- Play the game.
           
               CloseDialog(Player, DW)
               BuildDeck()
               If Selection = 2 Then
                  Bet% = 0
                  Repeat
                     If PlayerCash% > 99 Then
                        MaxBet% = 99
                     Else
                        MaxBet% = PlayerCash%
                     EndIf
                     Bet% = Input(Player, "Bet Amount max=" + MaxBet%, "$", 2)
                  Until Bet% <= PlayerCash% And Bet% <= MaxBet%
               Wager% = Bet%
               EndIf
;               PlaySound(Player, SoundID, 1) ; <---  Bet Money Sound goes here
               ChangeMoney(Player, -Bet%)
               DW = OpenDialog(Player, Dealer, "Blackjack", DWWindowBG)
                  DialogOutput(Player, DW, "Shuffleing the deck...")
                  ShuffleDeck(Player, Dealer)
                  DoEvents(1000)
                  DialogOutput(Player, DW, "Dealing")
                  NextCardFromDeck% = 0
;      This deals the first 2 cards to each player
                  For i = 1 to 2
                     NextCardFromDeck% = DealCard%(1, NextCardFromDeck%, Player, Dealer)
                     DoEvents(1000)
                     NextCardFromDeck% = DealCard%(2, NextCardFromDeck%, Player, Dealer)
                     DoEvents(1000)
                  Next
                  PlayerHandValue% = TallyCards%(1, PlayerHandValue%)
                  DealerHandValue% = TallyCards%(2, PlayerHandValue%)
                  Temp$ = Hand$(1, 1) + " + " + Hand$(1, 2)
                  DealerTemp$ = " ?" + " + " + Hand$(2, 2)
                  If DealerHandValue% = 21 Then
                     Temp$ = Hand$(2, 1) + " + " + Hand$(2, 2)
                     DialogOutput(Player, DW, "Dealer has " + Temp$, 10, 255, 255)
                     DialogOutput(Player, DW, "Dealer card total is :" + DealerHandValue%, 10, 255, 255)
                     DialogOutput(Player, DW, "Sorry, You loss.  Dealer has Blackjack!")
                     Result% = DialogInput(Player, DW, "Continue", "|")
                     CloseDialog(Player, DW)
                  EndIf
                  If PlayerHandValue% = 21 Then
                     DialogOutput(Player, DW, "You have " + Temp$, 10, 255, 255)
                     DialogOutput(Player, DW, "Your card total is :" + PlayerHandValue%, 10, 255, 255)
                     DialogOutput(Player, DW, "You Win.  You have Blackjack!")
                     ChangeMoney(Player, Bet% * 3)
                     Result% = DialogInput(Player, DW, "Continue", "|")
                     CloseDialog(Player, DW)
                  EndIf
                  If Result = 0
                     PlayerIsDone = False
               
                     Repeat
                        CloseDialog(Player, DW)
                        DW = OpenDialog(Player, Dealer, "Blackjack", DWWindowBG)
                        DialogOutput(Player, DW, "Dealer has " + DealerTemp$, 0, 200, 200)
                        DialogOutput(Player, DW, "You have " + Temp$, 10, 255, 255)
                        DialogOutput(Player, DW, "Your card total is :" + PlayerHandValue%, 10, 255, 255)
                        DialogOutput(Player, DW, "What would you like to do?", 10, 255, 255)
                        If (PlayerHandValue% = 10 Or PlayerHandValue% = 11) And (PlayerCash% >= Bet%) Then
                           InptString$ = "Double Down|Take a Hit|Stand"
                        Else
                           InptString$ = "Take a Hit|Stand"
                        EndIf
                        Result% = DialogInput(Player, DW, InptString$, "|")
                        If Result% = 1 And Len(InptString$) > 20 Then
                           Result% = 4
                        ElseIf Result% = 2 And Len(InptString$) > 20 Then
                           Result% = 1
                        EndIf
                        Select Result%

                           Case 1; Player took a hit

                              NextCardFromDeck% = DealCard%(1, NextCardFromDeck%, Player, Dealer)
                              PlayerHandValue% = TallyCards%(1, PlayerHandValue%)
                              Temp$ = ""
                              For i = 1 To 5
                                 If Hand$(1, i) <> "" Then
                                    Temp$ = Temp$ + Hand$(1, i) + " + "
                                    If PlayerHandValue% < 22 And i = 5 Then
                                       FiveCardCharlie = True
                                    EndIf
                                 EndIf
                              Next
                              Temp$ = Left(Temp$, Len(Temp$) - 3)
                              If PlayerHandValue% < 22 And FiveCardCharlie = True Then
                                 PlayerIsDone = True
                                 CloseDialog(Player, DW)
                                 DW = OpenDialog(Player, Dealer, "Blackjack", DWWindowBG)
                                 DialogOutput(Player, DW, "You have " + Temp$, 10, 255, 255)
                                 DialogOutput(Player, DW, "Your card total is :" + PlayerHandValue%, 10, 255, 255)
                                 DialogOutput(Player, DW, "You have Five Card Charlie.")
                                 ChangeMoney(Player, Bet% * 3)
                                 Result% = DialogInput(Player, DW, "Continue.", "|")
                              EndIf

                           Case 4; Player Doubled down

                              ChangeMoney(Player, -Bet%)
                              Wager% = Bet% * 2
;                              PlaySound(Player, SoundID, 1) ; <---  Bet Money Sound goes here
                              NextCardFromDeck% = DealCard%(1, NextCardFromDeck%, Player, Dealer)
                              PlayerHandValue% = TallyCards%(1, PlayerHandValue%)
                              Temp$ = ""
                              For i = 1 To 3
                                 If Hand$(1, i) <> "" Then
                                    Temp$ = Temp$ + Hand$(1, i) + " + "
                                 EndIf
                              Next
                                 Temp$ = Left(Temp$, Len(Temp$) - 3)
                              Result% = 2

                        End Select
                        If PlayerHandValue% > 21 Then
                           PlayerIsDone = True
                           CloseDialog(Player, DW)
                           DW = OpenDialog(Player, Dealer, "Blackjack", DWWindowBG)
                           DialogOutput(Player, DW, "You have " + Temp$, 10, 255, 255)
                           DialogOutput(Player, DW, "Your card total is :" + PlayerHandValue%, 10, 255, 255)
                           DialogOutput(Player, DW, "You busted.")
                           Result% = DialogInput(Player, DW, "Continue.", "|")
                        EndIf
                        If PlayerHandValue% = 21 Then
                           If Int(Hand$(1, 1)) = 7 And Int(Hand$(1, 2)) = 7 Then
                              TrippleSeven = True
                              PlayerIsDone = True
                              CloseDialog(Player, DW)
                              DW = OpenDialog(Player, Dealer, "Blackjack", DWWindowBG)
                              DialogOutput(Player, DW, "You have " + Temp$, 10, 255, 255)
                              DialogOutput(Player, DW, "Your card total is :" + PlayerHandValue%, 10, 255, 255)
                              DialogOutput(Player, DW, "You have Tripple Seven 21.")
                              ChangeMoney(Player, Bet% * 3)
                              Result% = DialogInput(Player, DW, "Continue.", "|")
                           EndIf
                        EndIf
                     Until Result% = 2 Or PlayerIsDone = True Or TrippleSeven = True Or FiveCardCharlie = True
                     PlayerFinalHand$ = Temp$
                     If PlayerIsDone = False Then
                        Repeat
                           Temp$ = ""
                           For i = 1 To 8
                              If Hand$(2, i) <> "" Then
                                 Temp$ = Temp$ + Hand$(2, i) + " + "
                              EndIf
                           Next
                           If Hand$(2, 9) <> "" Then
                              Temp$ = Temp$ + Hand$(2, 9)
                           Else
                              Temp$ = Left(Temp$, Len(Temp$) - 3)
                           EndIf
                           CloseDialog(Player, DW)
                           DW = OpenDialog(Player, Dealer, "Blackjack", DWWindowBG)
                           DialogOutput(Player, DW, "Player has: " + PlayerFinalHand$, 10, 255, 255)
                           DialogOutput(Player, DW, "Player card total is :" + PlayerHandValue%, 10, 255, 255)
                           DialogOutput(Player, DW, "Dealer has: " + Temp$)
                           DialogOutput(Player, DW, "Dealer card total is :" + DealerHandValue%)
                           DealerFinished = False
                           If DealerHandValue% > 16 Then
                              DealerFinished = True
                              DialogOutput(Player, DW, "Dealer stands")
                           Else
                              DialogOutput(Player, DW, "Dealer takes a hit")
                              NextCardFromDeck% = DealCard%(2, NextCardFromDeck%, Player, Dealer)
                              DealerHandValue% = TallyCards%(2, PlayerHandValue%)
                           EndIf
                        Until DealerFinished = True
                        If DealerHandValue% > PlayerHandValue% And DealerHandValue% < 22 Then
                           DialogOutput(Player, DW, "Dealer wins with :" + DealerHandValue%)
                        ElseIf DealerHandValue% = PlayerHandValue% Then
                           DialogOutput(Player, DW, "It's a TIE.")
                           ChangeMoney(Player, Wager%)
                        Else
                           DialogOutput(Player, DW, "You win with :" + PlayerHandValue%)
                           ChangeMoney(Player, Wager% * 2)
                        EndIf
                        DialogInput(Player, DW, "Continue")
                     EndIf
                     CloseDialog(Player, DW)
                  EndIf
               
            Case 2 ; <-- Display the rules of the game.
           
               CloseDialog(Player, DW)
               DW = OpenDialog(Player, Dealer, "BlackJack Rules")
               DialogOutput(Player, DW, "The rules to balckjack are fairly simple,")
               DialogOutput(Player, DW, "you try to beat the dealers hand by having")
               DialogOutput(Player, DW, "a higher point total without going over 21.")
               DialogOutput(Player, DW, "Cards are valued at face value except FACE")
               DialogOutput(Player, DW, "CARDS (K, Q, J) which count as 10 points")
               DialogOutput(Player, DW, "and ACES which can be either 1 or 11. If")
               DialogOutput(Player, DW, "you get an ACE and FACE CARD or 10,")
               DialogOutput(Player, DW, "that is considered a Blackjack which pays")
               DialogOutput(Player, DW, "2 to 1, all other wins pay even money.")
               DialogInput(Player, DW, "Next", "|")
               CloseDialog(Player, DW)
               DW = OpenDialog(Player, Dealer, "BlackJack Rules")
               DialogOutput(Player, DW, "You may double down if your initial hand")
               DialogOutput(Player, DW, "total is 10 or 11. If you choose to do this,")
               DialogOutput(Player, DW, "you would double your bet and the dealer")
               DialogOutput(Player, DW, "will give you one additional card. The")
               DialogOutput(Player, DW, "dealer will then play his hand. Remember")
               DialogOutput(Player, DW, "that you only get ONE card when you")
               DialogOutput(Player, DW, "double down and are NOT allowed to take")
               DialogOutput(Player, DW, "a hit afterwards.")
               DialogInput(Player, DW, "Next", "|")
               CloseDialog(Player, DW)
               DW = OpenDialog(Player, Dealer, "BlackJack Rules")
               DialogOutput(Player, DW, "Getting Three Sevens is commonly called")
               DialogOutput(Player, DW, "TRIPPLE SEVEN 21. If you get this hand")
               DialogOutput(Player, DW, "you automatically win the same as a regular")
               DialogOutput(Player, DW, "BlackJack.")
               DialogOutput(Player, DW, "")
               DialogOutput(Player, DW, "Getting 5 cards total without going bust is")
               DialogOutput(Player, DW, "called a FIVE CARD CHARLIE. If you")
               DialogOutput(Player, DW, "get this hand you automatically win the")
               DialogOutput(Player, DW, "same as a regular BlackJack.")
               DialogInput(Player, DW, "Next", "|")
               CloseDialog(Player, DW)
               DW = OpenDialog(Player, Dealer, "BlackJack Rules")
               DialogOutput(Player, DW, "When playing, the dealer MUST say with a")
               DialogOutput(Player, DW, "total of 17 or better and take a hit on")
               DialogOutput(Player, DW, "anything less. You are allowed to stay or")
               DialogOutput(Player, DW, "hit on anything until you either stand or")
               DialogOutput(Player, DW, "go over 21. If you go over 21, the dealer")
               DialogOutput(Player, DW, "automatically wins. When taking a hit, the")
               DialogOutput(Player, DW, "dealer gives you 1 additional card, the")
               DialogOutput(Player, DW, "value of which is added to your total. You")
               DialogOutput(Player, DW, "can stop at any time by Standing with what")
               DialogOutput(Player, DW, "you have provided it is not over 21.")
               DialogOutput(Player, DW, "Good Luck!!")
               DialogInput(Player, DW, "Exit Rules", "|")
               CloseDialog(Player, DW)
               
            Default
           
               CloseDialog(Player, DW)
               Return
           
         End Select
         NextCardFromDeck% = 0
         PlayerIsDone = False
         Wager% = 0
         TrippleSeven = False
         FiveCardCharlie = False
   Forever
End Function

Function DealCard%(curHand%, NextCardFromDeck%, Player, Dealer) ; <-- ADD SOUND ID to this function

;    PlaySound(Player, SoundID, 1) ; <---  Card Dealing Sound goes here
;    AnimateActor(Dealer, "Deal", 0.5) ; <-- Deal Card ANIMATION

;   <-- This function deals a single card at a time to the
;    -- curHand% player and also increments the counter that
;    -- allows us to track the last card drawn from the deck

   NextCardFromDeck = NextCardFromDeck + 1
   Repeat
      Counter = Counter + 1
   Until Hand$(curHand, Counter) = "" Or Counter > 5
   If Counter < 6 Then
      Hand$(curHand, Counter) = Deck$(NextCardFromDeck)
   Else
      NextCardFromDeck = -1
   EndIf
   DoEvents(400)
   Return(NextCardFromDeck)

End Function

Function ResetHands() ;         <-- 100% Complete

;   <-- This function resets the hand variables of both players
;    -- after each hand.

   For i = 1 To 9
      Hand$(1, i) = ""
      Hand$(2, i) = ""
   Next

End Function

Function BuildDeck() ;          <-- 100% Complete

;   <-- This function creates the 52 card deck

   DeckString$ = Chr(245) + Chr(244) + Chr(243) + Chr(242) + Chr(252) + Chr(251) + Chr(250) + Chr(249) + Chr(255) + Chr(227) + Chr(226) + Chr(225) + Chr(224)

;   DeckString$ = " A K Q J10 9 8 7 6 5 4 3 2"
   For i = 1 to 52
      Counter = Counter + 1
      If Counter = 13 Then
         Counter = 1
      EndIf
      Deck$(i) = Mid(DeckString$, (2 * Counter) - 1, 2)
   Next

End Function

Function ShuffleDeck(Player, Dealer) ;        <-- ADD SOUND ID to this function

;   PlaySound(Player, SoundID, 1) ; <---  Card Shuffleing Sound goes here
;   AnimateActor(Dealer, "Shuffle", 0.5) ; <-- Shuffle Cards ANIMATION

;   <-- This function uses variable swapping to shuffle the deck. It
;    -- goes through 3 times to ensure the deck is well shuffled.

   For j = 1 to 3
      For i = 1 to 52
         Repeat
            CardSwap = Rand(1, 52)
         Until CardSwap <> i
         Temp$ = Deck$(i)
         Deck$(i) = Deck$(CardSwap)
         Deck$(CardSwap) = Temp$
      Next
   Next

End Function

Function TallyCards%(curHand, PlayerHandValue%) ; <-- 100% Complete

;   <-- This calculates the total value of the current hand and
;    -- returns that value.

   For i = 1 to 9
      If Hand$(curHand, i) <> "" Then
         If Hand$(curHand, i) = Chr(245) Then
            Ace = Ace + 1 : Points = Points + 11
         ElseIf Hand$(curHand, i) = Chr(244) Then
            Points = Points + 10
         ElseIf Hand$(curHand, i) = Chr(243) Then
            Points = Points + 10
         ElseIf Hand$(curHand, i) = Chr(242) Then
            Points = Points + 10
         ElseIf Hand$(curHand, i) = Chr(252) Then
              Points = Points + 10
         ElseIf Hand$(curHand, i) = Chr(251) Then
            Points = Points + 9
         ElseIf Hand$(curHand, i) = Chr(250) Then
            Points = Points + 8
         ElseIf Hand$(curHand, i) = Chr(249) Then
            Points = Points + 7
         ElseIf Hand$(curHand, i) = Chr(255) Then
            Points = Points + 6
         ElseIf Hand$(curHand, i) = Chr(227) Then
            Points = Points + 5
         ElseIf Hand$(curHand, i) = Chr(226) Then
            Points = Points + 4
         ElseIf Hand$(curHand, i) = Chr(225) Then
            Points = Points + 3
         ElseIf Hand$(curHand, i) = Chr(224) Then
            Points = Points + 2
         EndIf
      EndIf
   Next
   Repeat

;   <-- This will adjust the point total of a hand that goes over 21 IF
;    -- they have an ACE in their hand.

      If Points > 21 And Ace > 0 Then
         Ace = Ace - 1 : Points = Points - 10
      EndIf

;   <-- This section allows the dealer to hit on a soft 17 if the player has
;    -- a better hand than the dealer.

      If curHand = 2
         If Points > 16
            If Ace > 0
               If PlayerHandValue% > Points
                  Ace = Ace - 1 : Points = Points - 10
               EndIf
            EndIf
         EndIf
      EndIf
   Until Points < 22 Or Ace = 0

   Return(Points)


End Function