mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-29 07:23:01 +00:00
590 lines
No EOL
21 KiB
Lua
590 lines
No EOL
21 KiB
Lua
-- name: Cheats
|
||
-- description: The Official Cheats have been Recreated into a Single Mod, Due to the Removal of Cheats as a Settings Option \n\nMod By JairoThePlumber, Coolio and Blocky \n\nSyncing fixed by Blocky and Coolio\n\nBLJ Anywhere and Rapid Fire made by Sunk\n\nAlways Triple Jump made by Bread\n\nMenu made also by Blocky
|
||
-- incompatible: cheats
|
||
|
||
--localise function for performance
|
||
|
||
local approach_s32, collision_find_surface_on_ray, disable_time_stop_including_mario, enable_time_stop_including_mario, djui_hud_get_screen_width, djui_hud_measure_text,
|
||
djui_hud_set_color, djui_hud_set_font, djui_hud_print_text, djui_hud_render_rect, djui_hud_get_mouse_x, djui_hud_get_mouse_y, djui_hud_render_texture, play_sound,
|
||
djui_hud_set_resolution, hook_chat_command, hook_event =
|
||
|
||
approach_s32, collision_find_surface_on_ray, disable_time_stop_including_mario, enable_time_stop_including_mario, djui_hud_get_screen_width, djui_hud_measure_text,
|
||
djui_hud_set_color, djui_hud_set_font, djui_hud_print_text, djui_hud_render_rect, djui_hud_get_mouse_x, djui_hud_get_mouse_y, djui_hud_render_texture, play_sound,
|
||
djui_hud_set_resolution, hook_chat_command, hook_event
|
||
|
||
-- Cheats in Order --
|
||
for i = 0, MAX_PLAYERS - 1 do
|
||
gPlayerSyncTable[i].Moon_Jump = false
|
||
gPlayerSyncTable[i].God_Mode = false
|
||
gPlayerSyncTable[i].Infinite_lives = false
|
||
gPlayerSyncTable[i].Super_Speed = false
|
||
gPlayerSyncTable[i].Responsive_Controls = false
|
||
gPlayerSyncTable[i].Rapid_Fire = false
|
||
gPlayerSyncTable[i].BLJ_Anywhere = false
|
||
gPlayerSyncTable[i].Always_Triple_Jump = false
|
||
end
|
||
|
||
local function lang()
|
||
local l = gLang[smlua_text_utils_get_language()]
|
||
return l == nil and gLang["English"] or l
|
||
end
|
||
|
||
-- Text For Languages --
|
||
gLang = {
|
||
["English"] = {
|
||
MJ = "Moon Jump",
|
||
GM = "God Mode",
|
||
IL = "Infinite Lives",
|
||
SS = "Super Speed",
|
||
RC = "Responsive Controls",
|
||
RF = "Rapid Fire",
|
||
BLJA = "BLJ Anywhere",
|
||
ATJ = "Always Triple Jump",
|
||
CHEATS = 'cheats',
|
||
EXIT = 'Exit',
|
||
DESC = '- Opens the Cheats menu.',
|
||
EXIT_DESC = "Exit the cheat menu.",
|
||
MJ_DESC = "Allows Mario to jump very high.",
|
||
GM_DESC = "Makes Mario invincible.",
|
||
IL_DESC = "Gives Mario infinite lives.",
|
||
SS_DESC = "Increases Mario's movement speed.",
|
||
RC_DESC = "Improves control responsiveness.",
|
||
RF_DESC = "Enables rapid fire for Mario's A button.",
|
||
BLJA_DESC = "Allows Backwards Long Jumps anywhere.",
|
||
ATJ_DESC = "Allows Mario to always perform a triple jump.",
|
||
},
|
||
|
||
["Spanish"] = {
|
||
MJ = "Salto Lunar",
|
||
GM = "Modo Dios",
|
||
IL = "Vidas Infinitas",
|
||
SS = "Super Velocidad",
|
||
RC = "Controles Responsivos",
|
||
RF = "Pulsación Rápida",
|
||
BLJA = "BLJ Donde Sea",
|
||
ATJ = "Siempre Hacer Salto Triple",
|
||
CHEATS = 'trucos',
|
||
EXIT = 'Dejar',
|
||
DESC = '- Abre el menú Trucos.',
|
||
EXIT_DESC = "Sal del menú de trucos.",
|
||
MJ_DESC = "Permite a Mario saltar muy alto.",
|
||
GM_DESC = "Hace que Mario sea invencible.",
|
||
IL_DESC = "Le da a Mario vidas infinitas.",
|
||
SS_DESC = "Aumenta la velocidad de movimiento de Mario.",
|
||
RC_DESC = "Mejora la capacidad de respuesta del control.",
|
||
RF_DESC = "Permite disparar rápidamente el botón A de Mario.",
|
||
BLJA_DESC = "Permite saltos largos hacia atrás en cualquier lugar.",
|
||
ATJ_DESC = "Permite a Mario realizar siempre un Salto Triple.",
|
||
},
|
||
|
||
["French"] = {
|
||
MJ = "Saut Antigravité",
|
||
GM = "Mode Invincible",
|
||
IL = "Vies Infinies",
|
||
SS = "Super Vitesse",
|
||
RC = "Contrôles Réactifs",
|
||
RF = "Tir Rapide",
|
||
BLJA = "BLJ N'importe Où",
|
||
ATJ = "Triple Sauts Infinis",
|
||
CHEATS = 'triche',
|
||
EXIT = 'Partir',
|
||
DESC = '- Ouvrez le menu Astuces.',
|
||
EXIT_DESC = "Quittez le menu de triche.",
|
||
MJ_DESC = "Permet à Mario de sauter très haut.",
|
||
GM_DESC = "Rend Mario invincible.",
|
||
IL_DESC = "Donne à Mario des vies infinies.",
|
||
SS_DESC = "Augmente la vitesse de déplacement de Mario.",
|
||
RC_DESC = "Améliore la réactivité du contrôle.",
|
||
RF_DESC = "Permet un tir rapide pour le bouton A de Mario.",
|
||
BLJA_DESC = "PPermet des sauts longs en arrière n'importe où.",
|
||
ATJ_DESC = "Permet à Mario de toujours effectuer un triple saut.",
|
||
},
|
||
|
||
["Portuguese"] = {
|
||
MJ = "Pulo da Lua",
|
||
GM = "Modo Deus",
|
||
IL = "Vidas Infinitas",
|
||
SS = "Super Velocidade",
|
||
RC = "Controle Responsivos",
|
||
RF = "Fogo Rápido",
|
||
BLJA = "BLJ Em Qualquer Lugar",
|
||
ATJ = "Sempre Fazer Triple Jump",
|
||
CHEATS = 'trapaças',
|
||
EXIT = 'Deixar',
|
||
DESC = '- Abra o menu Truques.',
|
||
EXIT_DESC = "Saia do menu de truques.",
|
||
MJ_DESC = "Permite que Mario salte muito alto.",
|
||
GM_DESC = "Makes Mario invincible.",
|
||
IL_DESC = "Torna Mario invencível.",
|
||
SS_DESC = "Aumenta a velocidade de movimento de Mario.",
|
||
RC_DESC = "Melhora a capacidade de resposta do controle.",
|
||
RF_DESC = "Ativa o disparo rápido para o botão A de Mario.",
|
||
BLJA_DESC = "Permite saltos longos para trás em qualquer lugar.",
|
||
ATJ_DESC = "Permite que Mario sempre execute um salto triplo.",
|
||
},
|
||
|
||
["German"] = {
|
||
MJ = "Mond-Sprung",
|
||
GM = "Gott Modus",
|
||
IL = "Unbegrenzte Leben",
|
||
SS = "Supergeschwindigkeit",
|
||
RC = "Reaktionsschnelle Steuerung",
|
||
RF = "Schnellfeuer",
|
||
BLJA = "Überall Rückwertsweitspringen",
|
||
ATJ = "Immer Dreisprung",
|
||
CHEATS = 'betrugt',
|
||
EXIT = 'Verlassen',
|
||
DESC = '- Öffnet das Cheats-Menü.',
|
||
EXIT_DESC = "Verlassen Sie das Cheat-Menü.",
|
||
MJ_DESC = "Ermöglicht Mario, sehr hoch zu springen.",
|
||
GM_DESC = "Macht Mario unbesiegbar.",
|
||
IL_DESC = "Gibt Mario unendlich viele Leben.",
|
||
SS_DESC = "Erhöht Marios Bewegungsgeschwindigkeit.",
|
||
RC_DESC = "Verbessert die Reaktionsfähigkeit der Steuerung.",
|
||
RF_DESC = "Enables rapid fire for Mario's A button.",
|
||
BLJA_DESC = "Ermöglicht Schnellfeuer für Marios A-Taste.",
|
||
ATJ_DESC = "Ermöglicht Mario, immer einen Dreisprung auszuführen.",
|
||
},
|
||
|
||
["Russian"] = {
|
||
MJ = "Супер прыжок",
|
||
GM = "Режим бога",
|
||
IL = "Бесконечные жизни",
|
||
SS = "Супер cкорость",
|
||
RC = "Отзывчивое управление",
|
||
RF = "Быстрый огонь",
|
||
BLJA = "BLJ в любом месте",
|
||
ATJ = "Всегда тройной прыжок",
|
||
CHEATS = 'cheats',
|
||
EXIT = 'Покинуть',
|
||
DESC = '- Открывает меню читов.',
|
||
EXIT_DESC = "Выйдите из чит-меню.",
|
||
MJ_DESC = "Позволяет Марио прыгать очень высоко.",
|
||
GM_DESC = "Делает Марио непобедимым.",
|
||
IL_DESC = "Дает Марио бесконечное количество жизней.",
|
||
SS_DESC = "Увеличивает скорость передвижения Марио.",
|
||
RC_DESC = "Улучшает оперативность управления.",
|
||
RF_DESC = "Включает быстрый огонь для кнопки A Марио.",
|
||
BLJA_DESC = "Позволяет совершать прыжки назад в длину в любом месте.",
|
||
ATJ_DESC = "Позволяет Марио всегда выполнять тройной прыжок.",
|
||
},
|
||
|
||
["Italian"] = {
|
||
MJ = "Salto della Luna",
|
||
GM = "Modalità Dio",
|
||
IL = "Vite Infinite",
|
||
SS = "Super Velocità",
|
||
RC = "Controlli Reattivi",
|
||
RF = "Fuoco Rapido",
|
||
BLJA = "BLJ Ovunque",
|
||
ATJ = "Sempre Salto Triplo",
|
||
CHEATS = 'trucchi',
|
||
EXIT = 'lasciare',
|
||
DESC = '- Apre il menu Trucchi.',
|
||
EXIT_DESC = "Esci dal menu dei trucchi.",
|
||
MJ_DESC = "Permette a Mario di saltare molto in alto.",
|
||
GM_DESC = "Rende Mario invincibile.",
|
||
IL_DESC = "Dà a Mario vite infinite.",
|
||
SS_DESC = "Aumenta la velocità di movimento di Mario.",
|
||
RC_DESC = "Migliora la reattività del controllo.",
|
||
RF_DESC = "Abilita il fuoco rapido per il pulsante A di Mario.",
|
||
BLJA_DESC = "Permette salti in lungo all'indietro ovunque.",
|
||
ATJ_DESC = "Permette a Mario di eseguire sempre un triplo salto.",
|
||
},
|
||
|
||
["Czech"] = {
|
||
MJ = "Nekonečný Skok",
|
||
GM = "Nenech Se Zranit",
|
||
IL = "Nekonečné Životy",
|
||
SS = "Super Rychlost",
|
||
RC = "Citlivé Ovládání",
|
||
RF = "Rychle Mačkat Tlačítko",
|
||
BLJA = "BLJ Všude",
|
||
ATJ = "Vždy Trojitý Skok",
|
||
CHEATS = 'cheaty',
|
||
EXIT = 'opustit',
|
||
DESC = '- Otevře nabídku Cheatů.',
|
||
EXIT_DESC = "Opusťte cheat menu.",
|
||
MJ_DESC = "Umožňuje Mariovi skákat velmi vysoko.",
|
||
GM_DESC = "Učiní Maria neporazitelným.",
|
||
IL_DESC = "Dává Mariovi nekonečné životy.",
|
||
SS_DESC = "Zvyšuje Mariovu rychlost pohybu.",
|
||
RC_DESC = "Zlepšuje odezvu ovládání.",
|
||
RF_DESC = "Umožňuje rychlou střelbu pro Mariovo tlačítko A.",
|
||
BLJA_DESC = "Umožňuje dlouhé skoky vzad kdekoli.",
|
||
ATJ_DESC = "Umožňuje Mariovi vždy provést trojitý skok.",
|
||
},
|
||
|
||
["Dutch"] = {
|
||
MJ = "Maan Sprong",
|
||
GM = "God Modus",
|
||
IL = "Oneindige Levens",
|
||
SS = "Super Snelheid",
|
||
RC = "Snel Reagerende Controles",
|
||
RF = "Snel Vuur",
|
||
BLJA = "BLJ Overal",
|
||
ATJ = "Altijd Drievoudige Sprong",
|
||
CHEATS = 'cheats',
|
||
EXIT = 'Verlaten',
|
||
DESC = '- Opent het Cheats-menu.',
|
||
EXIT_DESC = "Verlaat het cheatmenu.",
|
||
MJ_DESC = "Hiermee kan Mario heel hoog springen.",
|
||
GM_DESC = "Maakt Mario onoverwinnelijk.",
|
||
IL_DESC = "Geeft Mario oneindige levens.",
|
||
SS_DESC = "Verhoogt de bewegingssnelheid van Mario.",
|
||
RC_DESC = "Verbetert het reactievermogen van de besturing.",
|
||
RF_DESC = "Maakt snel vuren voor Mario's A-knop mogelijk.",
|
||
BLJA_DESC = "Maakt achteruit lange sprongen overal mogelijk.",
|
||
ATJ_DESC = "Hiermee kan Mario altijd een hinkstapsprong uitvoeren."
|
||
}
|
||
}
|
||
|
||
local menu = false
|
||
|
||
-- Moon Jump --
|
||
|
||
local function limit_angle(a)
|
||
return (a + 0x8000) % 0x10000 - 0x8000
|
||
end
|
||
|
||
local function moon_jump_update(m)
|
||
if gPlayerSyncTable[m.playerIndex].Moon_Jump then
|
||
if (m.controller.buttonDown & L_TRIG) ~= 0 then
|
||
m.faceAngle.y = m.intendedYaw - approach_s32(limit_angle(m.intendedYaw - m.faceAngle.y), 0, 0x800, 0x800)
|
||
m.vel.y = 40
|
||
|
||
if (m.action == ACT_FORWARD_GROUND_KB or
|
||
m.action == ACT_BACKWARD_GROUND_KB or
|
||
m.action == ACT_SOFT_FORWARD_GROUND_KB or
|
||
m.action == ACT_HARD_BACKWARD_GROUND_KB or
|
||
m.action == ACT_FORWARD_AIR_KB or
|
||
m.action == ACT_BACKWARD_AIR_KB or
|
||
m.action == ACT_HARD_FORWARD_AIR_KB or
|
||
m.action == ACT_HARD_BACKWARD_AIR_KB or
|
||
m.action == ACT_AIR_HIT_WALL) then
|
||
set_mario_action(m, ACT_FREEFALL, 0)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
local function moon_jump_command()
|
||
gPlayerSyncTable[0].Moon_Jump = not gPlayerSyncTable[0].Moon_Jump
|
||
--djui_popup_create("Moon Jump is now " .. (gPlayerSyncTable[0].Moon_Jump and "Enabled" or "Disabled"), 1)
|
||
return true
|
||
end
|
||
|
||
-- God Mode --
|
||
|
||
local function god_mode_update(m)
|
||
if gPlayerSyncTable[m.playerIndex].God_Mode then
|
||
m.health = 0x880
|
||
m.healCounter = 0
|
||
m.hurtCounter = 0
|
||
end
|
||
end
|
||
|
||
local function god_mode_fall_update(m, type)
|
||
if gPlayerSyncTable[m.playerIndex].God_Mode then
|
||
if type == STEP_TYPE_AIR and m.vel.y < 0 then
|
||
ray = collision_find_surface_on_ray(m.pos.x, m.pos.y, m.pos.z, m.vel.x, m.vel.y, m.vel.z)
|
||
if ray.surface ~= nil then
|
||
if ray.surface.normal.y ~= 0 then
|
||
m.peakHeight = m.pos.y
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
local function god_mode_command()
|
||
gPlayerSyncTable[0].God_Mode = not gPlayerSyncTable[0].God_Mode
|
||
--djui_popup_create("God Mode is now " .. (gPlayerSyncTable[0].God_Mode and "Enabled" or "Disabled"), 1)
|
||
return true
|
||
end
|
||
|
||
-- Infinite Lives --
|
||
|
||
local function infinite_lives_update(m)
|
||
if gPlayerSyncTable[0].Infinite_lives then
|
||
m.numLives = 100
|
||
end
|
||
end
|
||
|
||
local function infinite_lives_command()
|
||
gPlayerSyncTable[0].Infinite_lives = not gPlayerSyncTable[0].Infinite_lives
|
||
--djui_popup_create("Infinite Lives is now " .. (Infinite_lives and "Enabled" or "Disabled"), 1)
|
||
return true
|
||
end
|
||
|
||
-- Super Speed --
|
||
|
||
local SUPER_SPEED_MULTIPLIER = 4
|
||
|
||
local function super_speed_update(m)
|
||
if gPlayerSyncTable[m.playerIndex].Super_Speed and m.action ~= ACT_BUBBLED then
|
||
m.vel.x = m.vel.x * SUPER_SPEED_MULTIPLIER
|
||
m.vel.z = m.vel.z * SUPER_SPEED_MULTIPLIER
|
||
end
|
||
end
|
||
|
||
local function super_speed_command()
|
||
gPlayerSyncTable[0].Super_Speed = not gPlayerSyncTable[0].Super_Speed
|
||
--djui_popup_create("Super Speed is now " .. (gPlayerSyncTable[0].Super_Speed and "Enabled" or "Disabled"), 1)
|
||
return true
|
||
end
|
||
|
||
-- Responsive Controls --
|
||
|
||
local function responsive_controls_update(m)
|
||
if gPlayerSyncTable[m.playerIndex].Responsive_Controls then
|
||
if m.action == ACT_WALKING or
|
||
m.action == ACT_HOLD_WALKING or
|
||
m.action == ACT_HOLD_HEAVY_WALKING or
|
||
m.action == ACT_FINISH_TURNING_AROUND or
|
||
m.action == ACT_CRAWLING then
|
||
m.faceAngle.y = m.intendedYaw
|
||
end
|
||
end
|
||
end
|
||
|
||
local function responsive_controls_command()
|
||
gPlayerSyncTable[0].Responsive_Controls = not gPlayerSyncTable[0].Responsive_Controls
|
||
--djui_popup_create("Responsive Controls is now " .. (gPlayerSyncTable[0].Responsive_Controls and "Enabled" or "Disabled"), 1)
|
||
return true
|
||
end
|
||
|
||
-- Rapid Fire --
|
||
|
||
local function rapid_fire_update(m)
|
||
if gPlayerSyncTable[m.playerIndex].Rapid_Fire then
|
||
if (m.controller.buttonDown & A_BUTTON) ~= 0 then
|
||
m.controller.buttonPressed = m.controller.buttonPressed | A_BUTTON
|
||
end
|
||
end
|
||
end
|
||
|
||
local function rapid_fire_command()
|
||
gPlayerSyncTable[0].Rapid_Fire = not gPlayerSyncTable[0].Rapid_Fire
|
||
--djui_popup_create("Rapid Fire is now " .. (gPlayerSyncTable[0].Rapid_Fire and "Enabled" or "Disabled"), 1)
|
||
return true
|
||
end
|
||
|
||
-- BLJ Anywhere --
|
||
|
||
local function blj_anywhere_update(m)
|
||
if gPlayerSyncTable[m.playerIndex].BLJ_Anywhere then
|
||
if (m.action == ACT_LONG_JUMP) and
|
||
(m.controller.buttonDown & Z_TRIG) ~= 0 and
|
||
m.forwardVel < -15 then
|
||
m.vel.y = -30
|
||
end
|
||
end
|
||
end
|
||
|
||
local function blj_anywhere_command()
|
||
gPlayerSyncTable[0].BLJ_Anywhere = not gPlayerSyncTable[0].BLJ_Anywhere
|
||
--djui_popup_create("BLJ Anywhere is now " .. (gPlayerSyncTable[0].BLJ_Anywhere and "Enabled" or "Disabled"), 1)
|
||
return true
|
||
end
|
||
|
||
-- Always Triple Jump --
|
||
|
||
---@param m MarioState
|
||
local function always_triple_jump_update(m, action)
|
||
if gPlayerSyncTable[m.playerIndex].Always_Triple_Jump then
|
||
if m.forwardVel < 20 and m.action == ACT_DOUBLE_JUMP_LAND and action == ACT_JUMP then
|
||
return ACT_TRIPLE_JUMP
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
local function always_triple_jump_command()
|
||
gPlayerSyncTable[0].Always_Triple_Jump = not gPlayerSyncTable[0].Always_Triple_Jump
|
||
--djui_popup_create("Always Triple Jump is now " .. (gPlayerSyncTable[0].Always_Triple_Jump and "Enabled" or "Disabled"), 1)
|
||
return true
|
||
end
|
||
|
||
local function mario_update(m)
|
||
if m.playerIndex ~= 0 then return end
|
||
moon_jump_update(m)
|
||
god_mode_update(m)
|
||
infinite_lives_update(m)
|
||
responsive_controls_update(m)
|
||
end
|
||
|
||
local function before_phys_step(m, type)
|
||
god_mode_fall_update(m, type)
|
||
super_speed_update(m)
|
||
end
|
||
|
||
local function before_mario_update(m)
|
||
if m.playerIndex ~= 0 then return end
|
||
blj_anywhere_update(m)
|
||
rapid_fire_update(m)
|
||
end
|
||
|
||
local function close_menu()
|
||
menu = false
|
||
selectedOption = 1
|
||
disable_time_stop_including_mario()
|
||
end
|
||
|
||
-- Define menu options
|
||
local menuOptions = {
|
||
{ label = lang().MJ, action = moon_jump_command, status = gPlayerSyncTable[0].Moon_Jump, description = lang().MJ_DESC },
|
||
{ label = lang().GM, action = god_mode_command, status = gPlayerSyncTable[0].God_Mode, description = lang().GM_DESC },
|
||
{ label = lang().IL, action = infinite_lives_command, status = gPlayerSyncTable[0].Infinite_lives, description = lang().IL_DESC },
|
||
{ label = lang().SS, action = super_speed_command, status = gPlayerSyncTable[0].Super_Speed, description = lang().SS_DESC },
|
||
{ label = lang().RC, action = responsive_controls_command, status = gPlayerSyncTable[0].Responsive_Controls, description = lang().RC_DESC },
|
||
{ label = lang().RF, action = rapid_fire_command, status = gPlayerSyncTable[0].Rapid_Fire, description = lang().RF_DESC },
|
||
{ label = lang().BLJA, action = blj_anywhere_command, status = gPlayerSyncTable[0].BLJ_Anywhere, description = lang().BLJA_DESC },
|
||
{ label = lang().ATJ, action = always_triple_jump_command, status = gPlayerSyncTable[0].Always_Triple_Jump, description = lang().ATJ_DESC },
|
||
{ label = lang().EXIT, action = function() close_menu() end, description = lang().EXIT_DESC },
|
||
}
|
||
|
||
-- Initialize the selected option
|
||
local selectedOption = 1
|
||
|
||
-- Set the scale factor for the menu
|
||
local menuScale = 2.0 -- Adjust this value as needed
|
||
|
||
-- Add a title for the menu
|
||
local menuTitle = lang().CHEATS
|
||
local titleY = 150
|
||
|
||
local function drawMenu()
|
||
if not menu then return end
|
||
enable_time_stop_including_mario()
|
||
|
||
djui_hud_set_color(0, 0, 0, 200)
|
||
djui_hud_render_rect(0, 0, 10000, 10000)
|
||
|
||
-- Set text color and position for the title
|
||
local titleX = ((djui_hud_get_screen_width() - djui_hud_measure_text(menuTitle) * menuScale * 2.5) / 2.1)
|
||
|
||
-- Draw the title
|
||
djui_hud_set_color(255, 255, 255, 255)
|
||
djui_hud_set_font(FONT_HUD)
|
||
djui_hud_print_text(menuTitle, titleX, titleY, menuScale * 2.5)
|
||
djui_hud_set_font(FONT_NORMAL)
|
||
|
||
-- Set text color and position for the menu options
|
||
local textY = titleY + 100
|
||
local textSpacing = 30 * menuScale
|
||
local rectPadding = 5
|
||
|
||
for i, option in ipairs(menuOptions) do
|
||
local textWidth = djui_hud_measure_text(option.label)
|
||
local textX = (djui_hud_get_screen_width() - textWidth * menuScale) / 2
|
||
|
||
if i == selectedOption then
|
||
-- Draw black rectangle behind the selected option
|
||
-- Draw the description with a smaller scale
|
||
local descX = (djui_hud_get_screen_width() - djui_hud_measure_text(option.description) * (menuScale - 0.5)) / 2
|
||
local descY = 850
|
||
djui_hud_set_color(255, 255, 255, 255)
|
||
djui_hud_set_font(FONT_NORMAL)
|
||
djui_hud_print_text(option.description, descX, descY, menuScale - 0.5)
|
||
local optionWidth = textWidth * menuScale + rectPadding * 2
|
||
local optionHeight = 16 * menuScale + rectPadding * 2
|
||
djui_hud_set_color(0, 255, 255, 150)
|
||
djui_hud_render_rect(textX - rectPadding, (textY + (i - 1) * textSpacing - rectPadding) + 15, optionWidth, optionHeight + 5)
|
||
end
|
||
|
||
-- Set text color based on the status
|
||
if option.status == nil then
|
||
djui_hud_set_color(255, 255, 255, 255) -- Green for "On"
|
||
elseif option.status then
|
||
djui_hud_set_color(0, 255, 0, 255) -- Green for "On"
|
||
else
|
||
djui_hud_set_color(255, 0, 0, 255) -- Red for "Off"
|
||
end
|
||
|
||
-- Draw the menu option with scale
|
||
djui_hud_print_text(option.label, textX, textY + (i - 1) * textSpacing, menuScale)
|
||
end
|
||
end
|
||
|
||
---comment
|
||
-----@param m MarioState
|
||
-- Add a cooldown for menu navigation
|
||
local cooldown = 5
|
||
local cooldownCounter = 0
|
||
|
||
local function updateMenu()
|
||
if not menu then return end
|
||
local m = gMarioStates[0]
|
||
if m.playerIndex ~= 0 then return end
|
||
|
||
local stickY = m.controller.stickY
|
||
local mouseX = djui_hud_get_mouse_x()
|
||
local mouseY = djui_hud_get_mouse_y()
|
||
|
||
djui_hud_render_texture(gTextures.star, mouseX - 8, mouseY - 8, 2, 2)
|
||
|
||
if selectedOption < 1 then
|
||
selectedOption = #menuOptions
|
||
elseif selectedOption > #menuOptions then
|
||
selectedOption = 1
|
||
end
|
||
|
||
if cooldownCounter > 0 then
|
||
cooldownCounter = cooldownCounter - 1
|
||
else
|
||
for i, option in ipairs(menuOptions) do
|
||
local textWidth = djui_hud_measure_text(option.label)
|
||
local textX = (djui_hud_get_screen_width() - textWidth * menuScale) / 2
|
||
local textY = titleY + 100 + (i - 1) * (30 * menuScale)
|
||
local optionWidth = textWidth * menuScale
|
||
local optionHeight = 16 * menuScale
|
||
|
||
-- Check if the mouse is within the bounds of the option
|
||
if mouseX >= textX and mouseX <= textX + optionWidth and mouseY >= textY and mouseY <= textY + optionHeight then
|
||
selectedOption = i
|
||
end
|
||
end
|
||
|
||
if stickY > 0.5 then
|
||
-- Move selection down
|
||
selectedOption = selectedOption - 1
|
||
play_sound(SOUND_MENU_CHANGE_SELECT, gMarioStates[0].pos)
|
||
cooldownCounter = cooldown
|
||
elseif stickY < -0.5 then
|
||
-- Move selection up
|
||
selectedOption = selectedOption + 1
|
||
play_sound(SOUND_MENU_CHANGE_SELECT, gMarioStates[0].pos)
|
||
cooldownCounter = cooldown
|
||
elseif m.controller.buttonPressed & A_BUTTON ~= 0 or m.controller.buttonPressed & B_BUTTON ~= 0 then
|
||
play_sound(SOUND_MENU_CLICK_FILE_SELECT, gMarioStates[0].pos)
|
||
-- Execute the selected menu option
|
||
menuOptions[selectedOption].action()
|
||
if menuOptions[selectedOption].status ~= nil then
|
||
menuOptions[selectedOption].status = not menuOptions[selectedOption].status
|
||
end
|
||
elseif m.controller.buttonPressed & START_BUTTON ~= 0 then
|
||
close_menu()
|
||
end
|
||
end
|
||
end
|
||
|
||
-- Main loop
|
||
local function hud_render()
|
||
djui_hud_set_resolution(RESOLUTION_DJUI)
|
||
drawMenu()
|
||
updateMenu()
|
||
end
|
||
|
||
local function menu_command()
|
||
menu = true
|
||
return true
|
||
end
|
||
|
||
hook_chat_command(lang().CHEATS, lang().DESC, menu_command)
|
||
hook_event(HOOK_ON_HUD_RENDER, hud_render)
|
||
hook_event(HOOK_MARIO_UPDATE, mario_update)
|
||
hook_event(HOOK_ALLOW_HAZARD_SURFACE, function (m) return not gPlayerSyncTable[m.playerIndex].God_Mode end)
|
||
hook_event(HOOK_BEFORE_PHYS_STEP, before_phys_step)
|
||
hook_event(HOOK_BEFORE_MARIO_UPDATE, before_mario_update)
|
||
hook_event(HOOK_BEFORE_SET_MARIO_ACTION,always_triple_jump_update) |