Ir para conteúdo
Entre para seguir isso  
PoSo

BlackJack Dealer 1.0

Recommended Posts

PoSo    0
PoSo

Nome do Sistema: BlackJack

Versão: 1.0

Tipo: NPC+Lib

Autor: Poso

Servidor Testado: TFS 0.3b2

 

Como prometido estou aqui com exclusividade na OTNETpara divulgar o sistema que rendeu Segundo Lugar no Script Tournment #3.

 

O que é ?

Se você já jogou o famoso 21 (vinte-e-um) também conhecido mundialmente por Black Jack, saberá como funciona o sistema.

O sistema conta com uma lib para ser usada inicialmente a npcs, porém é fácilmente adaptada para actions, movements e talkactions!

-!-!-!-!-!-!-!-!-!-

A LIB:

A LIB foi realizada há pouco tempo atras, mas nunca divulgada. Foi feita usando storage values, está meio precária nessa versão ainda assim totalmente funcionável. Em futuras versões utilizarei Orientação a Objetos e trarei atualizações com outros jogos clássicos de baralho.

-!-!-!-!-!-!-!-!-!-

O NPC:

O NPC foi feito às pressas especialmente para o torneio, também está 100% funcionável e jogável. No momento ele interage com um player por vez, mas em versões futuras em que não sejam utilizados global storages, farei que seja multi-jogável.

-!-!-!-!-!-!-!-!-!-

O JOGO:

O Jogo funciona da seguinte maneira:

Você chega ao Dealer (NPC) diz que quer jogar 'blackjack' e ele pergunta se deseja 'iniciar' ou ler as 'regras'.

Se disser 'regras' ele te dará uma breve explicação.

Assim que deseja iniciar, ele te perguntará a aposta.

Inicialmente as apostas são: '10', '50', '100' ou '500' gps.

E assim inicia-se o jogo.

De princípio ele mostra 1 (uma) carta dele e 2 (duas) suas.

O objetivo é somar 21 pontos.

Tente chegar o mais próximo de 21 pontos, se você passar essa pontuação você perde automaticamente.

Assim que você achar que seus pontos têm chances de ganhar, diga: 'parar'.

Ao fazer isso o Dealer começará a pegar as cartas dele.

Ele só para se estourar, ou se os pontos dele estiverem maiores que os seus.

Finalizando:

Se você vencer: Você recebe o dobro do valor de sua aposta.

Se você perder: Você perde o valor de sua aposta.

Se empatar: Você recebe apenas o valor de sua aposta.

-!-!-!-!-!-!-!-!-!-

Os Códigos:

Dealer.xml:

[spoiler=Dealer.xml]--> Colocar em data\npc

<?xml version="1.0" encoding="UTF-8"?>
<npc name="[b]Dealer[/b]" script="[b]data/npc/scripts/dealer.lua[/b]" walkinterval="[b]1500[/b]" floorchange="[b]0[/b]">
      <health now="[b]100[/b]" max="[b]100[/b]"/>
      <look type="[b]139[/b]" head="[b]20[/b]" body="[b]39[/b]" legs="[b]45[/b]" feet="[b]7[/b]" addons="[b]0[/b]"/>
</npc>

 

 

dealer.lua:

[spoiler=dealer.lua]--> Colocar em data\npc\scripts

local focus = 0
local talk_start = 0
local target = 0
local days = 0

function onThingMove(creature, thing, oldpos, oldstackpos)

end


function onCreatureAppear(creature)

end


function onCreatureDisappear(cid, pos)
if focus == cid then
selfSay('Good bye then.')
focus = 0
talk_start = 0
end
end


function onCreatureTurn(creature)

end


function msgcontains(txt, str)
return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end


function onCreatureSay(cid, type, msg)
   msg = string.lower(msg)

   if (msgcontains(msg, 'hi') or msgcontains(msg, 'oi')) and (focus == 0) and getDistanceTo(cid) < 4 then
       selfSay('Ola ' .. getCreatureName(cid) .. '! Deseja jogar \'blackjack\' ?')
       talk_state = 0
       focus = cid
       talk_start = os.clock()

   elseif (msgcontains(msg, 'hi') or msgcontains(msg, 'oi')) and (focus ~= cid) and getDistanceTo(cid) < 4 then
       selfSay('Desculpe, ' .. getCreatureName(cid) .. '! Eu atendo apenas um jogador por vez, eu só tenho um baralho...')

   elseif focus == cid then
       talk_start = os.clock()
       if (msgcontains(msg, 'blackjack') or msgcontains(msg, '21')) and (talk_state == 0) then
           selfSay('Vejo que quer jogar blackjack, então deseja \'iniciar\' ou ler as \'regras\' ?')

       elseif (msgcontains(msg, 'regras') or msgcontains(msg, 'rules')) and (talk_state == 0) then
           selfSay('As regras são simples: O jogador ganha se a sua mão tiver mais pontos que a do dealer, sem ir acima de 21.') 
           selfSay('Assim uma mão de 21 pontos é a mais elevada e é por isso que o jogo é chamado às vezes de 21.') 
           selfSay('Se o jogador ou o dealer forem acima de 21 o mesmo perde automaticamente.')
           selfSay('Podemos \'iniciar\'?')
       elseif (msgcontains(msg, 'nao') or msgcontains(msg, 'no') or msgcontains(msg, 'não')) and (talk_state == 0) then
           selfSay('Volte quando quiser jogar.')
           focus = 0
           talk_state = 0
       elseif (msgcontains(msg, 'iniciar') or msgcontains(msg, 'start') or msgcontains(msg, 'sim')) and (talk_state == 0) then
           selfSay('Quanto deseja apostar ? \'10\',\'50\',\'100\' ou \'500\' gps?')
           talk_state = 1
       elseif talk_state == 1 then
           if msgcontains(msg, '10') then
               aposta = 10
           elseif msgcontains(msg, '50') then
               aposta = 50
           elseif msgcontains(msg, '100') then
               aposta = 100
           elseif msgcontains(msg, '500') then
               aposta = 500
           end
           if (aposta ~= nil) then
               if (getPlayerMoney(cid) >= aposta) then
                   doPlayerRemoveMoney(cid,aposta)
                   newBet(aposta)
                   selfSay('A aposta atual é de: '..aposta..', posso começar?')
                   talk_state = 2
               else
                   selfSay('Você não possui '..aposta..' gps para aposta.Volte quando tiver grana!')
                   focus = 0
                   talk_state = 0
               end                    
           end    
       elseif (msgcontains(msg, 'sim') or msgcontains(msg, 'yes') or msgcontains(msg, 'pode')) and (talk_state == 2) then
           prepareGame()
           newCard(1)
           newCard(1)
           newCard(2)
           yourScore = getScore(1)
           myScore = getScore(2)
           yourCards = getCardsTranslated(1)
           myCards = getCardsTranslated(2)
           selfSay('Você possui no momento: '..yourCards..'('..yourScore..' Pontos)')
           selfSay('Enquanto eu tenho: '..myCards..'('..myScore..' Pontos)')
           selfSay('Deseja \'parar\' ou \'tirar\' outra carta?')
           talk_state = 3
       elseif msgcontains(msg, 'tirar') and talk_state == 3 then    
           newCard(1)
           yourScore = getScore(1)
           myScore = getScore(2)
           yourCards = getCardsTranslated(1)
           myCards = getCardsTranslated(2)
               selfSay('Você possui no momento: '..yourCards..'('..yourScore..' Pontos)')
               selfSay('Enquanto eu tenho: '..myCards..'('..myScore..' Pontos)')
           if (yourScore<=21) then                
               selfSay('Deseja \'parar\' ou \'tirar\' outra carta?')
               talk_state = 3
           else
               selfSay('Você estourou! Seu dinheiro ficará com a Casa.')
               selfSay('Deseja \'iniciar\' novamente?')
               talk_state = 0
           end
       elseif msgcontains(msg, 'parar') and talk_state == 3 then
           yourScore = getScore(1)
           myScore = getScore(2)
           while (yourScore > myScore) do
               newCard(2)
               myScore = getScore(2)
           end
           yourCards = getCardsTranslated(1)
           myCards = getCardsTranslated(2)
           vencedor = winner()
           aposta = getBet()
           dobro = aposta*2
           selfSay('Você possui no momento: '..yourCards..'('..yourScore..' Pontos)')
               selfSay('Enquanto eu tenho: '..myCards..'('..myScore..' Pontos)')
           if (vencedor == 1) then
               selfSay('Parabéns! Você levou '..dobro..' contigo.')
               doPlayerAddMoney(cid, dobro)
           elseif(vencedor == 2) then
               selfSay('Você perdeu! Seu dinheiro ficará com a Casa.')
           else
               selfSay('Empate ! Ninguem ganha nem perde. Com isso você recebe apenas o dinheiro da aposta.')
               doPlayerAddMoney(cid, aposta)
           end    
           selfSay('Deseja \'iniciar\' novamente?')
           talk_state = 0
       elseif msgcontains(msg, 'bye') and getDistanceTo(cid) < 4 then
           selfSay('Ate Logo, ' .. getCreatureName(cid) .. '!')
           focus = 0
           talk_start = 0
       end 
   end 
end


function onCreatureChangeOutfit(creature)

end


function onThink()
doNpcSetCreatureFocus(focus)
if (os.clock() - talk_start) > 30 then
if focus > 0 then
selfSay('Mais alguem querendo jogar?')
end
focus = 0
end
if focus ~= 0 then
if getDistanceTo(focus) > 5 then
selfSay('Ate Logo.')
focus = 0
end
end
end 


--[[
Dealer by Poso
Ultima Atualização - 26/02/09
Divulgação não autorizada em outros fóruns.
]]

 

 

blackJackLib.lua:

[spoiler=blackJackLib.lua]

--> Colocar em data\lib

--[[
BlackJack Lib by Poso
Ultima Atualização - 31/01/09
Divulgação não autorizada em outros fóruns.
]]
globalBaralho = 100 --Global Storage Inicial (serão usadas mais 52 apartir dessa)
globalAposta  = 50 --Global Storage Para guardar o valor da aposta

--prepara o jogo, inicia as cartas
function prepareGame()
   for x=1, 52 do
   setGlobalStorageValue(globalBaralho+x, 0)    
   end
return true
end

--pega uma carta do baralho
function newCard(who)
   continue = false
   while (continue == false) do
       card = math.random(1,52)
       storage = globalBaralho + card
       if (getGlobalStorageValue(storage)==0) then
           continue = true
       end
   end
   if (who == 1) then
       setGlobalStorageValue(storage, 1)
   elseif (who == 2) then
       setGlobalStorageValue(storage, 2)
   end
   return card
end
--grava uma nova aposta
function newBet(bet)
   if (setGlobalStorageValue(globalAposta, bet)) then
   return true
   end
return false
end
--retorna a aposta realizada
function getBet()
   return getGlobalStorageValue(globalAposta)
end
--recebe um numero e diz sua carta equivalente
function translateCard(card)
   if (card ~= nil) then
       if (card <= 13) then
           naipe = "Paus"
       elseif ((card > 13) and    (card <= 26)) then
           naipe = "Copas"
       elseif ((card > 26) and    (card <= 39)) then
           naipe = "Espadilhas"
       elseif ((card > 39) and    (card <= 52)) then
           naipe = "Ouros"
       end
       while (card > 13) do
           card = card-13
       end
       if (card == 1) then
           return "A de "..naipe
       elseif (card == 11) then
           return "J de "..naipe
       elseif (card == 12) then
           return "Q de "..naipe
       elseif (card == 13) then
           return "K de "..naipe
       else
           return card.." de "..naipe
       end    
   end    
end
--Mostra as cartas de um jogador
function getCards(who)
cards = {}
   for x = 1,52 do
       valor = getGlobalStorageValue(globalBaralho+x)
       if (valor == who) then
           table.insert(cards, x)
       end
   end
   return cards
end
--Mostra as cartas de um jogador traduzidas
function getCardsTranslated(who)
cards = getCards(who)
local translated = {}
local ret = ""
   for x=0,#cards do
       card = cards[x]
       if (card ~= nil) then
           nome = translateCard(card)
           table.insert(translated, nome)
       end    
   end
   for x=0, #translated do
       if (translated[x] ~= nil) then
           ret = ret.." ["..translated[x].."] "
       end    
   end
   return ret
end
--da a pontuação equivalente de uma carta
function cardScore(card)
   if(card ~= nil) then
       while ( card > 13 )do
           card = card -13
       end
       if (card == 1) then
           return 11
       elseif (card >= 10) then
           return 10
       else
           return card
       end    
   end
end
--retorna quantas cartas "A" o player possui (a=1 ou 11 pontos)
function getAces(who)
aces = 0
   cards = getCards(who)
   for x=0, #cards do
       score = cardScore(cards[x])
       if (score == 11) then
       aces = aces+1
       end
   end
return aces
end
--retorna a pontuação atual de um jogador
function getScore(who)
   pontos = 0
   cards = getCards(who)
   for x=0, #cards do
       card = cards[x]
       if (card ~= nil) then
           ultimo = cardScore(card)
           pontos = pontos + ultimo    
       end    
   end
   aces = getAces(who)
   for j = 1,aces do
       if (pontos > 21) then
           pontos = pontos - 10
       else
           break
       end
   end
   return pontos
end
--retorna quem venceu: 1 = jogador; 2= dealer; 3 = empate
function winner()
   player = getScore(1)
   dealer = getScore(2)
   if (player > 21) then
       return 2
   elseif (dealer > 21) then
       return 1
   elseif (player > dealer) then
       return 1
   elseif (player < dealer) then
       return 2
   elseif (player == dealer) then
       return 3
   end
return 3    
end

 

 

 

Ao final do arquivo "function.lua" adicionar a seguinte linha:

[spoiler=function.lua]

  dofile('data/lib/blackJackLib.lua')

-!-!-!-!-!-!-!-!-!-

 

 

É isso aí galerinha, esse é o script que recebeu o 2º Lugar no Torneio, quaisquer possíveis erros, bugs, sugestões, críticas e dúvidas sintam-se livres para postar.

 

Abraços.

Até a próxima!

Editado por Black Ice

Compartilhar este post


Link para o post
Mock    32
Mock

Comentario:Esse script achei interessante.

SUPER Aprovadoico_aprovado.png & Movidoicon_movido.giffechado22xnux7.gif

Compartilhar este post


Link para o post
Gpwjhlkdcf    21
Gpwjhlkdcf

Caramba! Ficou bom demais!

Você quer deixar ele multi-jogável, né?

 

Sugestão:

Usa Jiddo NPC System ou selfSayChannel(cid, "Mensagem")

Mas vai der trabalho pra converter. :P

 

E coloca os *.xml como código PHP que fica colorido algumas partes.

Compartilhar este post


Link para o post
PoSo    0
PoSo
Caramba! Ficou bom demais!

Você quer deixar ele multi-jogável, né?

 

Sugestão:

Usa Jiddo NPC System ou selfSayChannel(cid, "Mensagem")

Mas vai der trabalho pra converter. :P

 

E coloca os *.xml como código PHP que fica colorido algumas partes.

 

Sim, eu sei oque teria de fazer, mas pra isso eu precisaria utilizar OO, porque no momento estou usando GlobalStorage, no caso, existe apenas um unico baralho... Então, se eu retiro uma carta, uma variavel global recebe um valor.. e assim por diante..

Preciso fazer um Objeto Baralho.. aí sim ficará 100% ;D

Compartilhar este post


Link para o post
Mock    32
Mock

é mais facil usar seflsay('oi',cid)

usa uma tabela chamada focus = {}

ai toda vez que o player falar hi vc faz isso:

table.insert(focus,1,cid)

pra ver se o player ta falando com o npc

isInArray(focus,cid)

e pro ai vai.. :P

Compartilhar este post


Link para o post
PoSo    0
PoSo
Monk tu sempre graça tu tirar as palavras da minha boca -.-

 

Para a pessoa ve seta falando com o NPC ...

é mais facil usar seflsay('oi',cid)

usa uma tabela chamada focus = {}

ai toda vez que o player falar hi vc faz isso:

table.insert(focus,1,cid)

pra ver se o player ta falando com o npc

isInArray(focus,cid)

 

Aprovadoo <-- (Y)

Tente não querer ganhar posts nessa seção, evite dizer oque já foi dito e evite ser alertado.

Eu já tinha conhecimento das funções, porém eu prefiro desse modo, pois fica na CARA que há um motivo para ser assim, deve haver uma fila, se deve haver uma fila não se pode usar mais de uma função junta para diferentes players, entendeu?

Espero que sim,

Abraços.

Compartilhar este post


Link para o post
Mock    32
Mock

por que e tao dificlo ler as regras da seção?

@lols

é moCk não moNk

 

Seu post foi deletado.

Compartilhar este post


Link para o post
Fereu    0
Fereu

teria um jeito de faze um script tipo esse maas sendo truco?

//só uma sugestão :]

Editado por Fereu

Compartilhar este post


Link para o post
Kisin~*    0
Kisin~*

Aquele bagulho do Ás valer 1 ou 10 funciona tb?

Compartilhar este post


Link para o post
PoSo    0
PoSo
Aquele bagulho do Ás valer 1 ou 10 funciona tb?

Se voce ler o código verá que funciona, mas os Ases valem 1 ou 11, dependendo de sua pontuação.

Abraços.

Compartilhar este post


Link para o post
gnomow157    0
gnomow157

não tem nenhuma pasta lib dentro da pasta data do ot, e aonde se encontra o arquivo functions.lua?

Edit.

A mals, aqui era outro o nome da pasta (classes) mas o functions.lua não é o global.lua?

Editado por gnomow157

Compartilhar este post


Link para o post
Dargosh    0
Dargosh

Muito legal e intereçante

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×