Advertisement
MasterCheats

Mini game Archero 3

Feb 3rd, 2025
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 17.77 KB | Gaming | 0 0
  1. -- Configurações iniciais
  2. local tabuleiro = ""
  3. local jogador_posicao_x = 14  -- Linha do jogador (válido de 1 a 14, pois 0 e 15 são as bordas)
  4. local jogador_posicao_y = 7   -- Coluna do jogador (válido de 1 a 14)
  5. local porta_x, porta_y = nil, nil  -- A porta só aparece após derrotar os inimigos
  6. local cenarios = {"🧱", "🏕️", "🏖️", "🏜️", "🏝️", "🏟️", "🏛️", "🌃", "🕌", "️🕋"}  -- Símbolos das bordas
  7. local cenario_atual = 1
  8. --local inimigos = {}
  9. local inimigos = {"😈", "🤡", "👹", "👻", "👺"}
  10. local obstaculos = {}  -- Obstáculos serão definidos com um padrão fixo
  11. local dificuldade = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50}  -- Número de inimigos para cada cenário
  12. local monster = 0
  13. local pontuacao = 0
  14. local vida = 3  -- Internamente, usamos um número; na exibição, mostraremos corações.
  15. local level = 1
  16. local mortes = {}  -- Registra as posições dos inimigos derrotados
  17.  
  18. ----------------------------------------------------------
  19. -- Padrão fixo para obstáculos (células interiores: linhas 1 a 14, colunas 1 a 14)
  20. -- Cada string tem 14 caracteres: "O" representa obstáculo, "." representa célula aberta.
  21. ----------------------------------------------------------
  22. local fixedPattern = {
  23.   "..............",   -- Linha 1
  24.   "..O..O..O..O..",   -- Linha 2
  25.   "..............",   -- Linha 3
  26.   "..O..O..O..O..",   -- Linha 4
  27.   "..............",   -- Linha 5
  28.   "..O..O..O..O..",   -- Linha 6
  29.   "..............",   -- Linha 7
  30.   "..............",   -- Linha 8
  31.   "..O..O..O..O..",   -- Linha 9
  32.   "..............",   -- Linha 10
  33.   "..O..O..O..O..",   -- Linha 11
  34.   "..............",   -- Linha 12
  35.   "..O..O..O..O..",   -- Linha 13
  36.   ".............."    -- Linha 14
  37. }
  38.  
  39. ----------------------------------------------------------
  40. -- Preenche a tabela "obstaculos" usando o padrão fixo
  41. ----------------------------------------------------------
  42. function gerar_obstaculos()
  43.     obstaculos = {}
  44.     for i = 1, 14 do
  45.         local row = fixedPattern[i]
  46.         for j = 1, 14 do
  47.             local ch = row:sub(j, j)
  48.             if ch == "O" then
  49.                 table.insert(obstaculos, {x = i, y = j})
  50.             end
  51.         end
  52.     end
  53. end
  54. ----------------------------------------------------------
  55. -- Função para verificar se há um obstáculo em uma dada posição
  56. ----------------------------------------------------------
  57. function is_obstaculo_at(x, y)
  58.     for _, o in ipairs(obstaculos) do
  59.         if o.x == x and o.y == y then
  60.             return true
  61.         end
  62.     end
  63.     return false
  64. end
  65. ----------------------------------------------------------
  66. -- Função para verificar se há um inimigo em uma dada posição (opcionalmente excluindo um índice)
  67. ----------------------------------------------------------
  68. function is_inimigo_at(x, y, excluir_index)
  69.     for idx, inimigo in ipairs(inimigos) do
  70.         if idx ~= excluir_index and inimigo.x == x and inimigo.y == y then
  71.             return true
  72.         end
  73.     end
  74.     return false
  75. end
  76. ----------------------------------------------------------
  77. -- Função para verificar se existe algum obstáculo entre duas posições (linha ou coluna)
  78. ----------------------------------------------------------
  79. function obstaculo_no_caminho(x1, y1, x2, y2)
  80.     for _, o in ipairs(obstaculos) do
  81.         if x1 == x2 and o.x == x1 and o.y > math.min(y1, y2) and o.y < math.max(y1, y2) then
  82.             return true
  83.         elseif y1 == y2 and o.y == y1 and o.x > math.min(x1, x2) and o.x < math.max(x1, x2) then
  84.             return true
  85.         end
  86.     end
  87.     return false
  88. end
  89. ----------------------------------------------------------
  90. -- Função para gerar inimigos aleatórios
  91. ----------------------------------------------------------
  92. function gerar_inimigos()
  93.     inimigos = {}
  94.     local quantidade = dificuldade[cenario_atual] or 50
  95.     local tipos_inimigos = {"😈", "🤡", "👹", "👻", "👺"}  -- Lista de tipos de inimigos
  96.     for i = 1, quantidade do
  97.         local inimigo_x, inimigo_y
  98.         repeat
  99.             inimigo_x = math.random(1, 12)  -- posições válidas de 1 a 12
  100.             inimigo_y = math.random(1, 12)
  101.         until not (inimigo_x == jogador_posicao_x and inimigo_y == jogador_posicao_y)
  102.               and not is_obstaculo_at(inimigo_x, inimigo_y)
  103.               and not is_inimigo_at(inimigo_x, inimigo_y)
  104.        
  105.         -- Escolhendo aleatoriamente um tipo de inimigo
  106.         local tipo_inimigo = tipos_inimigos[math.random(#tipos_inimigos)]
  107.        
  108.         table.insert(inimigos, {x = inimigo_x, y = inimigo_y, tipo = tipo_inimigo})
  109.     end
  110.     porta_x, porta_y = nil, nil  -- Esconde a porta até eliminar os inimigos
  111. end
  112. ----------------------------------------------------------
  113. -- Função para atualizar a porta (aparece quando todos os inimigos forem derrotados)
  114. ----------------------------------------------------------
  115. function atualizar_porta()
  116.     if #inimigos == 0 and not porta_x then
  117.         porta_x, porta_y = 8, 7  -- A porta é exibida na borda esquerda, coluna 7
  118.     end
  119. end
  120. ----------------------------------------------------------
  121. -- Função para mover os inimigos
  122. -- Os inimigos se movem somente se estiverem alinhados com o jogador, sem obstáculos no caminho,
  123. -- e sem colisão com outro inimigo (exceto se for a primeira a ocupar a célula do jogador).
  124. ----------------------------------------------------------
  125. function mover_inimigos()
  126.     for idx, inimigo in ipairs(inimigos) do
  127.         if inimigo.x == jogador_posicao_x and not obstaculo_no_caminho(inimigo.x, inimigo.y, jogador_posicao_x, jogador_posicao_y) then
  128.             local nova_y = inimigo.y
  129.             if inimigo.y < jogador_posicao_y then
  130.                 nova_y = inimigo.y + 1
  131.             elseif inimigo.y > jogador_posicao_y then
  132.                 nova_y = inimigo.y - 1
  133.             end
  134.             if nova_y == jogador_posicao_y then
  135.                 if not is_inimigo_at(inimigo.x, nova_y, idx) then
  136.                     inimigo.y = nova_y
  137.                 end
  138.             else
  139.                 if not is_obstaculo_at(inimigo.x, nova_y) and not is_inimigo_at(inimigo.x, nova_y, idx) then
  140.                     inimigo.y = nova_y
  141.                 end
  142.             end
  143.         elseif inimigo.y == jogador_posicao_y and not obstaculo_no_caminho(inimigo.x, inimigo.y, jogador_posicao_x, jogador_posicao_y) then
  144.             local nova_x = inimigo.x
  145.             if inimigo.x < jogador_posicao_x then
  146.                 nova_x = inimigo.x + 1
  147.             elseif inimigo.x > jogador_posicao_x then
  148.                 nova_x = inimigo.x - 1
  149.             end
  150.             if nova_x == jogador_posicao_x then
  151.                 if not is_inimigo_at(nova_x, inimigo.y, idx) then
  152.                     inimigo.x = nova_x
  153.                 end
  154.             else
  155.                 if not is_obstaculo_at(nova_x, inimigo.y) and not is_inimigo_at(nova_x, inimigo.y, idx) then
  156.                     inimigo.x = nova_x
  157.                 end
  158.             end
  159.         end
  160.     end
  161. end
  162. ----------------------------------------------------------
  163. -- Função para desenhar o tabuleiro
  164. ----------------------------------------------------------
  165. function desenhar_tabuleiro()
  166.     tabuleiro = ""
  167.     local cor = cenarios[cenario_atual]
  168.     local shooting_trail = {}
  169.    
  170.     -- Define a trilha de disparo (5) se houver um inimigo alinhado com o jogador, a distância for <= 5,
  171.     -- e sem obstáculos no caminho
  172.     for _, inimigo in ipairs(inimigos) do
  173.         if inimigo.x == jogador_posicao_x then
  174.             local distancia = math.abs(inimigo.y - jogador_posicao_y)
  175.             if distancia <= 5 and not obstaculo_no_caminho(jogador_posicao_x, jogador_posicao_y, inimigo.x, inimigo.y) then
  176.                 local dir = (inimigo.y > jogador_posicao_y) and 1 or -1
  177.                 for i = 1, 5 do
  178.                     table.insert(shooting_trail, {x = jogador_posicao_x, y = jogador_posicao_y + i * dir})
  179.                 end
  180.                 break  -- Usa o primeiro inimigo alinhado encontrado
  181.             end
  182.         elseif inimigo.y == jogador_posicao_y then
  183.             local distancia = math.abs(inimigo.x - jogador_posicao_x)
  184.             if distancia <= 5 and not obstaculo_no_caminho(jogador_posicao_x, jogador_posicao_y, inimigo.x, inimigo.y) then
  185.                 local dir = (inimigo.x > jogador_posicao_x) and 1 or -1
  186.                 for i = 1, 5 do
  187.                     table.insert(shooting_trail, {x = jogador_posicao_x + i * dir, y = jogador_posicao_y})
  188.                 end
  189.                 break
  190.             end
  191.         end
  192.     end
  193.     for i = 0, 15 do
  194.         for j = 0, 15 do
  195.             -- 1. Bordas
  196.             if i == 0 or i == 15 or j == 0 or j == 15 then
  197.                 tabuleiro = tabuleiro .. cor
  198.             -- 2. Posição do jogador
  199.             elseif i == jogador_posicao_x and j == jogador_posicao_y then
  200.                 tabuleiro = tabuleiro .. "🧕"
  201.             -- 3. Porta
  202.             elseif porta_x and i == porta_x and j == porta_y then
  203.                 tabuleiro = tabuleiro .. "️🚩"
  204.             else
  205.                 local especial = false
  206.                 -- 4. Se houver um inimigo na célula, exibe o inimigo
  207.                 for _, inimigo in ipairs(inimigos) do
  208.     if i == inimigo.x and j == inimigo.y then
  209.         tabuleiro = tabuleiro .. inimigo.tipo  -- Usa o tipo do inimigo
  210.         especial = true
  211.         break
  212.     end
  213. end
  214.                 if not especial then
  215.                     -- 5. Se houver um inimigo morto na célula, exibe o símbolo de morte (caveira)
  216.                     local morto = false
  217.                     for _, morte in ipairs(mortes) do
  218.                         if i == morte.x and j == morte.y then
  219.                             tabuleiro = tabuleiro .. "☠️"
  220.                             morto = true
  221.                             break
  222.                         end
  223.                     end
  224.                     if not morto then
  225.                         -- 6. Se a célula for um obstáculo fixo (do padrão), exibe 🗿
  226.                         if i >= 1 and i <= 14 and j >= 1 and j <= 14 then
  227.                             local row = fixedPattern[i]
  228.                             local ch = row:sub(j, j)
  229.                             if ch == "O" then
  230.                                 tabuleiro = tabuleiro .. "🗿"
  231.                             else
  232.                                 -- 7. Se a célula fizer parte da trilha de disparo, exibe ⚡
  233.                                 if (function()
  234.                                         for _, pos in ipairs(shooting_trail) do
  235.                                             if pos.x == i and pos.y == j then
  236.                                                 return true
  237.                                             end
  238.                                         end
  239.                                         return false
  240.                                      end)() then
  241.                                     tabuleiro = tabuleiro .. "⚡"
  242.                                 else
  243.                                     -- 8. Caso contrário, exibe o marcador padrão
  244.                                     tabuleiro = tabuleiro .. "✔"
  245.                                 end
  246.                             end
  247.                         else
  248.                             tabuleiro = tabuleiro .. "✔"
  249.                         end
  250.                     end
  251.                 end
  252.             end
  253.         end
  254.         tabuleiro = tabuleiro .. "\n"
  255.     end
  256.     return "Pontuação: " .. pontuacao .. "                          Nível: " .. level ..
  257.            "\nInimigos Mortos: " .. monster .. "               Vidas: " .. string.rep("❤️", vida) .. "\n" .. tabuleiro
  258. end
  259. ----------------------------------------------------------
  260. -- Função para atacar inimigos
  261. -- O ataque atinge o inimigo em linha reta (mesma linha ou coluna) que esteja mais próximo do jogador,
  262. -- desde que esteja a no máximo 5 espaços e sem obstáculos no caminho.
  263. ----------------------------------------------------------
  264. function atacar()
  265.     local inimigo_alvo = nil
  266.     local distancia_min = math.huge  -- Inicializa com um número muito grande
  267.    
  268.     for _, inimigo in ipairs(inimigos) do
  269.         if inimigo.x == jogador_posicao_x or inimigo.y == jogador_posicao_y then
  270.             local distancia = math.abs(inimigo.x - jogador_posicao_x) + math.abs(inimigo.y - jogador_posicao_y)
  271.             if distancia <= 5 then  -- Verifica se o inimigo está no alcance (5 células)
  272.                 local bloqueado = false
  273.                 if jogador_posicao_x == inimigo.x then
  274.                     for _, obstaculo in ipairs(obstaculos) do
  275.                         if obstaculo.x == jogador_posicao_x and obstaculo.y > math.min(jogador_posicao_y, inimigo.y) and obstaculo.y < math.max(jogador_posicao_y, inimigo.y) then
  276.                             bloqueado = true
  277.                             break
  278.                         end
  279.                     end
  280.                 elseif jogador_posicao_y == inimigo.y then
  281.                     for _, obstaculo in ipairs(obstaculos) do
  282.                         if obstaculo.y == jogador_posicao_y and obstaculo.x > math.min(jogador_posicao_x, inimigo.x) and obstaculo.x < math.max(jogador_posicao_x, inimigo.x) then
  283.                             bloqueado = true
  284.                             break
  285.                         end
  286.                     end
  287.                 end
  288.                 if not bloqueado and distancia < distancia_min then
  289.                     distancia_min = distancia
  290.                     inimigo_alvo = inimigo
  291.                 end
  292.             end
  293.         end
  294.     end
  295.     if inimigo_alvo then
  296.         table.insert(mortes, {x = inimigo_alvo.x, y = inimigo_alvo.y})
  297.         for i = #inimigos, 1, -1 do
  298.             if inimigos[i] == inimigo_alvo then
  299.                 table.remove(inimigos, i)
  300.                 break
  301.             end
  302.         end
  303.         pontuacao = pontuacao + 150
  304.         monster = monster + 1
  305.         atualizar_porta()
  306.     end
  307. end
  308. ----------------------------------------------------------
  309. -- Função para reiniciar o jogo
  310. ----------------------------------------------------------
  311. function resetar_jogo()
  312.     local escolha = gg.choice({"🔄 Reiniciar Jogo", "❌ Sair"}, nil, "O jogo terminou! Deseja reiniciar?")
  313.     if escolha == 1 then
  314.         -- Reseta todas as variáveis do jogo
  315.         jogador_posicao_x, jogador_posicao_y = 14, 7
  316.         porta_x, porta_y = nil, nil
  317.         cenario_atual = 1
  318.         inimigos = {}
  319.         obstaculos = {}  -- Será refeito via fixedPattern
  320.         dificuldade = {5, 10, 15, 20, 25, 30, 35, 50}
  321.         monster = 0
  322.         pontuacao = 0
  323.         vida = 3
  324.         mortes = {}
  325.         level = 15
  326.         gg.toast("Jogo reiniciado!")
  327.         jogar()  -- Inicia um novo jogo
  328.     else
  329.         gg.toast("Jogo encerrado.")
  330.     end
  331. end
  332. ----------------------------------------------------------
  333. -- Função principal do jogo
  334. ----------------------------------------------------------
  335. function jogar()
  336.     gerar_obstaculos()  -- Preenche os obstáculos com o padrão fixo
  337.     gerar_inimigos()
  338.     while true do
  339.         local tabuleiro_atual = desenhar_tabuleiro()
  340.        
  341.         local escolha = gg.choice({
  342.                 "                    ⬆️ Cima\n",
  343.                 "\n⬅️ Esquerda\n",
  344.                 "\n                                        ➡️ Direita\n",
  345.                 "\n                    ⬇️ Baixo\n",
  346.                 "\n                                                ⚡ Atacar\n",
  347.                 "❌ Sair"
  348.             }, nil, tabuleiro_atual)
  349.        
  350.         -- Movimentação do jogador (não pode atravessar obstáculos fixos)
  351.         if escolha == 1 and jogador_posicao_x > 1 and not is_obstaculo_at(jogador_posicao_x - 1, jogador_posicao_y) then
  352.             jogador_posicao_x = jogador_posicao_x - 1  -- Cima
  353.         elseif escolha == 2 and jogador_posicao_y > 1 and not is_obstaculo_at(jogador_posicao_x, jogador_posicao_y - 1) then
  354.             jogador_posicao_y = jogador_posicao_y - 1  -- Esquerda
  355.         elseif escolha == 3 and jogador_posicao_y < 14 and not is_obstaculo_at(jogador_posicao_x, jogador_posicao_y + 1) then
  356.             jogador_posicao_y = jogador_posicao_y + 1  -- Direita
  357.         elseif escolha == 4 and jogador_posicao_x < 14 and not is_obstaculo_at(jogador_posicao_x + 1, jogador_posicao_y) then
  358.             jogador_posicao_x = jogador_posicao_x + 1  -- Baixo
  359.         elseif escolha == 5 then
  360.             atacar()
  361.         elseif escolha == 6 or escolha == nil then
  362.             gg.toast("Jogo encerrado.")
  363.             break
  364.         end
  365.         mover_inimigos()
  366.        
  367.         -- Verifica se algum inimigo atingiu o jogador (se estiver na mesma célula)
  368.         for _, inimigo in ipairs(inimigos) do
  369.             if inimigo.x == jogador_posicao_x and inimigo.y == jogador_posicao_y then
  370.                 vida = vida - 1
  371.                 gg.toast("Você foi atingido! Vidas restantes: " .. string.rep("❤️", vida))
  372.                 if vida == 0 then
  373.                     gg.toast("Você foi derrotado pelos inimigos!")
  374.                     resetar_jogo()
  375.                     return
  376.                 end
  377.             end
  378.         end
  379.         -- Verifica se o jogador entrou na porta para avançar de cenário
  380.         if porta_x and jogador_posicao_x == porta_x and jogador_posicao_y == porta_y then
  381.             if cenario_atual < #cenarios then
  382.                 cenario_atual = cenario_atual + 1
  383.                 level = cenario_atual
  384.                 jogador_posicao_x, jogador_posicao_y = 14, 7
  385.                 mortes = {}
  386.                 gerar_obstaculos()
  387.                 gerar_inimigos()
  388.                 gg.toast("Novo cenário!")
  389.             else
  390.                 gg.toast("Você venceu o jogo!")
  391.                 resetar_jogo()
  392.                 return
  393.             end
  394.         end
  395.     end
  396. end
  397. -- Iniciar o jogo
  398. jogar()
  399.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement