Ir para conteúdo
Propaganda

Posts Recomendados

🎴 Apresentação do NPC - Jogo de Cartas 🎴

🤵‍♂️ "Aposte sua sorte contra mim e veja se consegue vencer no truco!"

Este NPC é um desafiante habilidoso que convida os jogadores para uma partida de cartas. Ele inicia um jogo dinâmico onde estratégia e sorte se combinam para decidir o vencedor!

🃏 Regras do Jogo:
Cada jogador recebe 3 cartas aleatórias.
As cartas possuem hierarquia de força, e algumas vencem outras.
Aposta inicial é 1x, mas pode ser aumentada com "truco"!
Uma carta coringa pode mudar o rumo da partida.
O jogo termina quando todas as cartas forem jogadas!

💬 Comandos principais:
🔹 "iniciar" - Começa uma nova partida.
🔹 "jogar carta <número> de <naipe>" - Joga uma carta.
🔹 "truco" - Aumenta a aposta!
🔹 "regras" - Exibe as regras do jogo.
🔹 "proxima" - Começa uma nova rodada.
🔹 "bye" - Sai do jogo.

🎲 Você tem coragem de desafiar este NPC? Teste sua sorte e estratégia agora!


 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

local playerGames = {}  -- Armazenar o estado do jogo para cada jogador

-- Cartas e suas descrições
local cardNames = {"zap", "copas", "ouro", "espada"}
local cardNumbers = {1, 2, 3, 4}

-- Prefixos possíveis para o nome do NPC
local npcPrefixes = {"- Kevin", "- Max", "- Alex", "- Mike"}

-- Função para obter um número de carta correspondente ao nome
local function getCardNumber(name)
    for i, cardName in ipairs(cardNames) do
        if cardName == name then
            return cardNumbers[i]
        end
    end
    return nil
end

-- Função para obter o nome da carta a partir do número
local function getCardName(number)
    for i, cardNumber in ipairs(cardNumbers) do
        if cardNumber == number then
            return cardNames[i]
        end
    end
    return nil
end

-- Função para obter uma carta aleatória
local function getRandomCard()
    local index = math.random(#cardNames)
    return cardNumbers[index], cardNames[index]
end

-- Função para obter um prefixo aleatório para o NPC
local function getRandomPrefix()
    return npcPrefixes[math.random(#npcPrefixes)]
end

-- Inicializa o jogo
local function initializeGame(cid)
    local npcPrefix = getRandomPrefix() -- Gera um prefixo aleatório

    local cardDeck = {}
    for _, cardNumber in ipairs(cardNumbers) do
        for _, cardName in ipairs(cardNames) do
            table.insert(cardDeck, {number = cardNumber, name = cardName})
        end
    end

    -- Embaralhar cartas
    for i = #cardDeck, 2, -1 do
        local j = math.random(i)
        cardDeck[i], cardDeck[j] = cardDeck[j], cardDeck[i]
    end

    local playerHand = {table.remove(cardDeck, 1), table.remove(cardDeck, 1), table.remove(cardDeck, 1)}
    local npcHand = {table.remove(cardDeck, 1), table.remove(cardDeck, 1), table.remove(cardDeck, 1)}

    local jokerCardNumber, jokerCardName = getRandomCard()
    -- Verifique se getRandomCard retorna valores válidos
    if not jokerCardNumber or not jokerCardName then
        selfSay(npcPrefix .. ": Erro ao sortear a carta coringa. Por favor, tente novamente.", cid)
        return
    end

    local jokerCard = {number = jokerCardNumber, name = jokerCardName}

    playerGames[cid] = {
        playerHand = playerHand,
        npcHand = npcHand,
        jokerCard = jokerCard, -- Carta coringa
        currentMultiplier = 1,  -- Multiplicador inicial
        npcPrefix = npcPrefix  -- Armazenar o prefixo gerado
    }

    -- Informar sobre a carta coringa sorteada
    selfSay(npcPrefix .. ": A carta coringa sorteada é " .. jokerCard.number .. " de " .. jokerCard.name .. ".", cid)
end

-- Converte uma mão de cartas em uma string
local function handToString(hand)
    local handString = ""
    for _, card in ipairs(hand) do
        handString = handString .. card.number .. " de " .. card.name .. ", "
    end
    return handString:sub(1, -3)  -- Remove a última vírgula e espaço
end

local function determineWinner(playerCard, npcCard)
    -- Carta 4 vence todas as outras cartas
    if playerCard.number == 4 then
        return "player"
    elseif npcCard.number == 4 then
        return "npc"
    -- Carta 3 vence Carta 2 e Carta 1
    elseif playerCard.number == 3 then
        return (npcCard.number == 1 or npcCard.number == 2) and "player" or "npc"
    elseif npcCard.number == 3 then
        return (playerCard.number == 1 or playerCard.number == 2) and "npc" or "player"
    -- Carta 2 vence Carta 1
    elseif playerCard.number == 2 then
        return (npcCard.number == 1) and "player" or "npc"
    elseif npcCard.number == 2 then
        return (playerCard.number == 1) and "npc" or "player"
    -- Carta 1 perde para todas as outras cartas
    elseif playerCard.number == 1 then
        return "npc"
    elseif npcCard.number == 1 then
        return "player"
    end

    -- Comparar naipes se os números forem iguais
    if playerCard.number == npcCard.number then
        return compareSuits(playerCard.name, npcCard.name) and "player" or "npc"
    end
end

local function npcDecide()
    local actions = {"accept", "increase", "run"}
    -- Define as probabilidades para cada ação (soma deve ser 100)
    local probabilities = {80, 10, 10}
    local randomChance = math.random(100)
    
    local cumulativeChance = 0
    for i, action in ipairs(actions) do
        cumulativeChance = cumulativeChance + probabilities[i]
        if randomChance <= cumulativeChance then
            if action == "increase" then
                local npcTrucoPhrase = playerTrucoPhrases[math.random(#playerTrucoPhrases)]
                selfSay(npcTrucoPhrase:format(game.currentMultiplier * 2), cid)
            end
            return action
        end
    end
end

-- Função para resolver uma rodada e verificar se o jogo terminou
local function resolveRound(cid, multiplier, chosenCardNumber, chosenCardName)
    local game = playerGames[cid]
    local npcPrefix = game.npcPrefix

    -- Verifique se o jogo está definido
    if not game then
        selfSay(npcPrefix .. ": Erro no jogo. O jogo não foi iniciado corretamente.", cid)
        return false
    end

    -- Encontrar o índice da carta escolhida na mão do jogador
    local playerCardIndex = nil
    for i, card in ipairs(game.playerHand) do
        if card.number == chosenCardNumber and card.name == chosenCardName then
            playerCardIndex = i
            break
        end
    end

    -- Verificar se a carta escolhida está na mão do jogador
    if not playerCardIndex then
        selfSay(npcPrefix .. ": Você não tem essa carta. Escolha uma carta válida.", cid)
        return false
    end

    -- Remover a carta escolhida da mão do jogador
    local playerCard = table.remove(game.playerHand, playerCardIndex)

    -- Selecionar uma carta aleatória para o NPC
    local npcCard = game.npcHand[math.random(#game.npcHand)]

    -- Exibir as cartas jogadas
    selfSay(npcPrefix .. ": Você jogou: " .. playerCard.number .. " de " .. playerCard.name .. ".", cid)
    selfSay(npcPrefix .. ": Eu joguei: " .. npcCard.number .. " de " .. npcCard.name .. ".", cid)

    -- Verificar a vitória com base na lógica definida
    if playerCard.number == game.jokerCard.number and playerCard.name == game.jokerCard.name then
        selfSay(npcPrefix .. ": Você jogou o valete (coringa) e ganhou automaticamente esta rodada!", cid)
    elseif npcCard.number == game.jokerCard.number and npcCard.name == game.jokerCard.name then
        selfSay(npcPrefix .. ": Eu joguei o valete (coringa) e ganhei automaticamente esta rodada!", cid)
    elseif determineWinner(playerCard, npcCard) == "player" then
        selfSay(npcPrefix .. ": Você venceu esta rodada. Vamos continuar. Diga 'proxima' para uma nova rodada!", cid)
    else
        selfSay(npcPrefix .. ": Eu venci esta rodada. Vamos continuar. Diga 'proxima' para uma nova rodada!", cid)
    end

    -- Verificar se alguém ganhou o jogo
    if #game.playerHand == 0 and #game.npcHand == 0 then
        selfSay(npcPrefix .. ": A partida acabou. Diga 'próxima' para começar um novo jogo ou 'bye' para encerrar.", cid)
        endGame(cid)
        return true
    end
end


-- Frases aleatórias para quando o NPC aumenta a aposta
local trucoPhrases = {
    "Desafio aceito! A aposta é agora de %dx.",
    "Ótimo! Aposta elevada para %dx!",
    "Vamos lá, a aposta agora é de %dx!",
    "Aposta dobrada! Agora está em %dx.",
    "Você quer jogar pesado! Aposta ajustada para %dx."
}

-- Frases aleatórias para quando o jogador pede truco
local playerTrucoPhrases = {
    "Você quer aumentar a aposta? Muito bem, a nova aposta é %dx!",
    "Aposta aumentada! Está agora em %dx.",
    "Você está apostando alto! Agora é %dx.",
    "Aposte mais se conseguir! O novo valor é %dx.",
    "Aposta ajustada para %dx, vamos ver o que você tem!"
}

-- Função para finalizar o jogo e limpar o estado
local function endGame(cid)
    playerGames[cid] = nil
end

function onCreatureAppear(cid)
    npcHandler:onCreatureAppear(cid)
end

function onCreatureDisappear(cid)
    npcHandler:onCreatureDisappear(cid)
end

function onCreatureSay(cid, type, msg)
    npcHandler:onCreatureSay(cid, type, msg)
end

function onThink()
    npcHandler:onThink()
end

function creatureSayCallback(cid, type, msg)
    if not npcHandler:isFocused(cid) then
        return false
    end

    local state = talkState[cid]

    if state == nil then
        state = {}
        talkState[cid] = state
    end

    local game = playerGames[cid]

    -- Exibe as regras do jogo
    if msg == "regras" then
        selfSay("Regras do Jogo:\n1. O jogo é uma disputa de cartas entre você e o NPC.\n2. Cada jogador começa com 3 cartas.\n3. A carta 4 vence todas as outras.\n4. A carta 3 vence as cartas 1 e 2.\n5. A carta 2 vence a carta 1.\n6. A carta 1 perde para todas as outras.\n7. Se as cartas tiverem o mesmo número, o naipe decide.\n8. Aposta inicial é 1x, mas você pode aumentar dizendo 'truco'.\n9. O jogo termina quando todas as cartas são jogadas. Boa sorte!", cid)
        return true
    end

    -- Inicia o jogo
    if msg == "iniciar" then
        initializeGame(cid)
        local handDescription = "Suas cartas são: " .. handToString(playerGames[cid].playerHand)
        selfSay(playerGames[cid].npcPrefix .. ": " .. handDescription .. ". Diga 'jogar carta <número> de <naipe>' para jogar uma carta ou 'truco' para aumentar a aposta.", cid)
        return true
    end

    -- Verifica se o jogador quer jogar uma carta
    local playCardPattern = "jogar carta (%d) de (%a+)"
    local chosenCardNumber, chosenCardName = msg:match(playCardPattern)
    if chosenCardNumber and chosenCardName then
        chosenCardNumber = tonumber(chosenCardNumber)
        return resolveRound(cid, game.currentMultiplier, chosenCardNumber, chosenCardName)
    end

-- Função para tratar o aumento da aposta
if msg == "truco" then
    local maxMultiplier = 12
    local increment = 3

    -- Verifica se a aposta está no valor inicial (1 ponto) ou já foi aumentada
    if game.currentMultiplier == 1 then
        game.currentMultiplier = 3
    else
        local nextMultiplier = game.currentMultiplier + increment
        
        -- Verifica se o próximo valor da aposta não excede o máximo permitido
        if nextMultiplier <= maxMultiplier then
            game.currentMultiplier = nextMultiplier
        else
            selfSay(game.npcPrefix .. ": O máximo de aposta já foi atingido.", cid)
            return true
        end
    end

    -- Exibe a frase com o novo valor da aposta
    local trucoPhrase = trucoPhrases[math.random(#trucoPhrases)]
    selfSay(trucoPhrase:format(game.currentMultiplier), cid)
    return true
end


    -- Verifica se o jogador quer terminar o jogo
    if msg == "bye" then
        selfSay(game.npcPrefix .. ": Obrigado por jogar! Até a próxima.", cid)
        endGame(cid)
        npcHandler:releaseFocus(cid)
        return true
    end
    
    -- Verifica se o jogador quer iniciar uma nova partida
    if msg == "proxima" then
        initializeGame(cid)
        local handDescription = "Suas cartas são: " .. handToString(playerGames[cid].playerHand)
        selfSay(playerGames[cid].npcPrefix .. ": " .. handDescription .. ". Diga 'jogar carta <número> de <naipe>' para jogar uma carta ou 'truco' para aumentar a aposta.", cid)
        return true
    end

    return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

  • Like 3
Link para o comentário
https://tibiadevs.com/forums/topic/925-npc-truco/
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...