Kevin Luzetti 26 Postado 1 de Março Compartilhar Postado 1 de Março 🎴 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()) 3 Link para o comentário https://tibiadevs.com/forums/topic/925-npc-truco/ Compartilhar em outros sites Mais opções de compartilhamento...
Moderador Yomee 1.717 Postado 1 de Março Moderador Compartilhar Postado 1 de Março Obrigado pela contribuição Link para o comentário https://tibiadevs.com/forums/topic/925-npc-truco/#findComment-4830 Compartilhar em outros sites Mais opções de compartilhamento...
Administrador gutinha 1.579 Postado 2 de Março Administrador Compartilhar Postado 2 de Março Movido pra área correta. Link para o comentário https://tibiadevs.com/forums/topic/925-npc-truco/#findComment-4837 Compartilhar em outros sites Mais opções de compartilhamento...
Posts Recomendados
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 contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora