SM64CDPY

Crie seu primeiro mod de vida com Lua para SM64CoopDX

Crie um pequeno modo de jogo Lua que recupera uma fatia de vida ao pressionar para cima no direcional enquanto aprende MarioState e hooks.

Dificuldade
Iniciante
Plataformas
Windows, Linux, macOS
Tempo prático
15 min
Disponível em
O mascote programador do Retired64 ensina um mod de vida em Lua com um medidor em fatias e o direcional.

Seu primeiro modo de jogo não precisa de uma estrutura enorme. Neste tutorial, você criará uma pasta, escreverá um arquivo main.lua e conectará uma função ao evento que atualiza Mario.

O resultado será um pequeno treinador de vida: ao pressionar para cima no direcional, você recuperará uma fatia da vida do jogador local sem ultrapassar o valor normal de vida completa.

O medidor de vida do Mario recuperando uma fatia de cada vez no SM64CoopDX
O mod concluído recupera uma fatia do medidor circular a cada pressionamento.

O que você aprenderá

  • Como o SM64CoopDX encontra um mod escrito em Lua.
  • Como HOOK_MARIO_UPDATE chama sua função para cada jogador.
  • Por que o parâmetro m é mais seguro do que ler gMarioStates[0] dentro deste hook.
  • Como o medidor circular de vida corresponde a valores inteiros e hexadecimais.
  • Como testar e depurar o mod pelo console do jogo.

Pré-requisitos

Pré-requisitos

  • SM64CoopDXSoftware

    Uma instalação funcional administrada por você. Este tutorial não fornece o jogo, uma ROM ou recursos extraídos do jogo.

  • Editor de textoSoftware

    Qualquer editor de texto simples que possa salvar um arquivo com a extensão .lua.

  • Pasta de modsPermissões

    Permissão para criar uma pasta e um arquivo main.lua dentro de um dos locais compatíveis.

Plataformas documentadas pela referência oficial de instalação de Lua
PlataformaStatusVersão mínimaObservações
WindowsCompatível%appdata%/sm64coopdx/mods ou a pasta mods ao lado do jogo
LinuxCompatível~/.local/share/sm64coopdx/mods ou a pasta mods ao lado do jogo
macOSCompatível~/Library/Application Support/sm64coopdx/mods ou a pasta mods ao lado do jogo

Última verificação: 30 de setembro de 2026

Entenda o medidor de vida

O campo MarioState.health é um número inteiro. O guia oficial de MarioState identifica 0x880 como vida completa, enquanto o exemplo oficial de HUD documenta o intervalo do medidor entre 0xFF e 0x880.

Cada fatia visível ocupa 0x100 unidades de vida. Em decimal, 0x100 equivale a 256. Lua aceita os dois formatos, portanto estas operações são equivalentes:

Arquivolua
m.health = m.health + 256
m.health = m.health + 0x100
Valor de vida Hexadecimal Medidor circular
0 a 255 0x000 a 0x0FF Sem fatias utilizáveis
256 a 511 0x100 a 0x1FF 1 fatia
512 a 767 0x200 a 0x2FF 2 fatias
768 a 1023 0x300 a 0x3FF 3 fatias
1024 a 1279 0x400 a 0x4FF 4 fatias
1280 a 1535 0x500 a 0x5FF 5 fatias
1536 a 1791 0x600 a 0x6FF 6 fatias
1792 a 2047 0x700 a 0x7FF 7 fatias
2048 a 2176 0x800 a 0x880 8 fatias, até a vida completa

Construa o mod

  1. Crie a pasta do mod

    Crie uma pasta chamada first-health-mod dentro da sua pasta mods.

    A referência oficial permite que a pasta de um mod contenha vários arquivos Lua, desde que um deles se chame main.lua. Este tutorial precisa apenas desse arquivo.

    Verificação: A nova pasta está dentro de um local de mods compatível com o SM64CoopDX.

  2. Crie main.lua

    Dentro de first-health-mod, crie um arquivo de texto simples chamado main.lua.

    Verificação: O arquivo se chama main.lua, e não main.lua.txt.

  3. Adicione o treinador de vida

    Cole este exemplo completo em main.lua:

    Arquivofirst-health-mod/main.lualua
    -- name: First Health Mod
    -- description: Press D-pad Up to restore one health slice.
    
    local HEALTH_SLICE = 0x100
    local FULL_HEALTH = 0x880
    
    local function mario_update(m)
      -- HOOK_MARIO_UPDATE runs once per player each frame.
      -- Player index 0 is the local player on each client.
      if m.playerIndex ~= 0 then return end
    
      if (m.controller.buttonPressed & U_JPAD) ~= 0 then
          m.health = math.min(m.health + HEALTH_SLICE, FULL_HEALTH)
          djui_chat_message_create("Restored one health slice")
      end
    end
    
    hook_event(HOOK_MARIO_UPDATE, mario_update)

    Verificação: O arquivo contém as constantes, a função de atualização e o hook mostrados abaixo.

  4. Inicie o jogo e ative o mod

    Inicie o SM64CoopDX, abra a lista de mods e ative First Health Mod. Se o jogo já estava aberto quando você criou os arquivos, reinicie-o para carregar o novo mod.

    Verificação: First Health Mod aparece na lista de mods e está ativado.

  5. Teste o resultado

    Entre em uma fase, perca pelo menos uma fatia de vida e pressione para cima no direcional uma vez. O medidor deve aumentar uma fatia, a menos que Mario já esteja com a vida completa.

    Verificação: Uma pressão para cima recupera vida e o chat confirma a ação.

Como o código funciona

As constantes deixam as regras legíveis

HEALTH_SLICE armazena 0x100, que equivale a 256 em decimal. FULL_HEALTH armazena o máximo documentado de 0x880. Dar nomes a esses valores esclarece a intenção e evita repetir números sem explicação.

O hook fornece MarioState

A referência oficial informa que HOOK_MARIO_UPDATE é executado uma vez por jogador e por quadro, no final da atualização desse jogador. Ele também entrega um valor MarioState à função. Esse valor é o parâmetro m de mario_update(m).

O guia de MarioState recomenda utilizar esse m em vez de gMarioStates[0] quando o hook já o fornece.

A verificação limita a mudança ao jogador local

Como o hook é executado para cada jogador, esta linha interrompe a função para jogadores remotos:

Arquivolua
if m.playerIndex ~= 0 then return end

Isso transforma o treinador em um efeito local. Ele não tenta sincronizar nem modificar a vida de outro jogador.

buttonPressed realiza uma ação por pressão

A estrutura Controller expõe buttonPressed, e a referência de constantes expõe U_JPAD. A verificação de bits detecta para cima no direcional durante a atualização atual. Ao contrário de buttonDown, buttonPressed evita somar vida continuamente enquanto o botão permanece pressionado.

math.min respeita o máximo normal

Esta expressão soma uma fatia e escolhe o menor valor entre o resultado e a vida completa:

Arquivolua
m.health = math.min(m.health + HEALTH_SLICE, FULL_HEALTH)

Resultado esperado

Resultado esperado

Depois que o mod carregar corretamente, você poderá recuperar a vida do jogador local em passos controlados de uma fatia.

  • First Health Mod aparece na lista de mods do jogo
  • Pressionar para cima uma vez adiciona no máximo uma fatia
  • O chat mostra Restored one health slice
  • Pressões repetidas nunca ultrapassam 0x880
  • O callback local não modifica outros jogadores

Problemas comuns

O mod não aparece

Confirme se a estrutura de pastas é exatamente esta:

Arquivoplaintext
mods/
└── first-health-mod/
  └── main.lua

Verifique também se o editor não salvou o arquivo como main.lua.txt.

Pressionar para cima não faz nada

Verifique se o mod está ativado e se o jogo reconhece o direcional. Faça o teste depois que Mario perder vida, pois o limite impede intencionalmente que o valor ultrapasse 0x880.

O jogo mostra um erro de Lua

A referência oficial recomenda iniciar o jogo por um console com o parâmetro --console durante o desenvolvimento de mods Lua. Os erros de Lua e a saída de print() aparecerão ali. Leia o primeiro erro, identifique o arquivo e a linha, corrija-o e depois reinicie ou recarregue o mod.

Próximo passo

Agora você tem a estrutura essencial de um modo de jogo Lua: um arquivo de entrada main.lua, um callback, um hook documentado, um campo do estado do jogador e um resultado observável.

Como próximo exercício, você pode substituir a constante do botão por outra constante documentada de Controller ou mostrar o valor atual com djui_chat_message_create(tostring(m.health)). Continue utilizando o m fornecido por HOOK_MARIO_UPDATE e mantenha a verificação do jogador local quando o comportamento for destinado apenas ao jogador atual.

Fontes oficiais

Documentaçãogithub.com

Referência Lua do SM64CoopDX

Colaboradores do SM64CoopDX

Última verificação
30 de setembro de 2026
Documentaçãogithub.com

Como utilizar gMarioStates

Colaboradores do SM64CoopDX

Última verificação
30 de setembro de 2026
Documentaçãogithub.com

Guia de hooks

Colaboradores do SM64CoopDX

Última verificação
30 de setembro de 2026

Os detalhes técnicos deste tutorial foram verificados pela última vez em 30 de setembro de 2026 com o commit 8cd6e5977d9f920d51ca71f2c61801d019ed79c6 do SM64CoopDX.