MasterCheats

Mini game Archero 2

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