Fightcade Lua Hotkey < FREE — 2025 >

A hotkey script requires three fundamental components:

Here is the skeleton of a basic hotkey script:

-- my_hotkeys.lua
local hotkey_pressed = false

function on_frame() -- This runs 60 times per second -- Check if the 'R' key is pressed (key code 0x13) if input.get_key_state(0x13) == 1 and not hotkey_pressed then hotkey_pressed = true -- ACTION: Reset the game state reset_system() elseif input.get_key_state(0x13) == 0 then hotkey_pressed = false end end

-- Register the function emu.register_frame(on_frame)

Key Codes: You need the hex codes for keys.

Pro tip: Search "Windows virtual key codes" for a full list.


| Problem | Likely Fix | | :--- | :--- | | Script won’t load | Check the file extension (.lua, not .txt). Use Fightcade’s System > Lua Scripting > Run Script. | | Hotkey does nothing | Verify the key code. Use print(input.get_key_state(0x13)) to see if Fightcade detects your key. | | Game crashes when script runs | You attempted to read an invalid memory address. Double-check your peek/poke addresses. | | Hotkey triggers multiple times | Add a debounce flag (the hotkey_pressed pattern shown earlier). | | Script works in FBNeo standalone but not Fightcade | Some functions (like emu.pause()) are disabled in Fightcade’s network play to prevent desyncs. Use save/load states instead. |


One of my favorite scripts turns a held key into a turbo fire button. Perfect for games with rapid-fire pickups or to save your wrist during Gunbird 2. fightcade lua hotkey

local turbo_state =  active = false, button = nil, frame_counter = 0

function input_frame() local keys = input.get_keys() -- Hold F1 + A to turbo A if keys["f1"] and keys["a"] then if not turbo_state.active then turbo_state.active = true turbo_state.button = "a" turbo_state.frame_counter = 0 end else turbo_state.active = false end

if turbo_state.active then
    turbo_state.frame_counter = turbo_state.frame_counter + 1
    if turbo_state.frame_counter % 3 == 0 then  -- 3-frame cycle = 20Hz
        input.set(turbo_state.button, true)
    else
        input.set(turbo_state.button, false)
    end
end

end

This doesn’t just repeat the key; it releases it cleanly, ensuring the game registers individual presses.

Here’s the important part: Fightcade does not police Lua scripts. You could write an auto-block script that reads enemy position memory and blocks low every time. That would be cheating. Most players and lobbies consider macros for difficult but legitimate techniques (like pretzels in Garou) as gray-area, and anything that reads game state (memory reading) as outright cheating.

My rule of thumb:

Respect the lobby. Ask opponents if they’re okay with macros. Keep the spirit of the arcade alive.

The most useful hotkeys for practice:

local function save_state()
    emu.savestate(0)
    console.print("State saved to slot 0")
end

local function load_state() emu.loadstate(0) console.print("State loaded from slot 0") end

emu.registerhotkey(59, save_state) -- F1 = save emu.registerhotkey(60, load_state) -- F2 = load

This uses memory reading (game-specific). The example below is for Street Fighter III: 3rd Strike (USA). You must find the correct memory addresses for your game.

local hitbox_key = 0x68 -- H key
local hitbox_enabled = false

-- Addresses for 3rd Strike hitboxes (example only – verify with emulator) local P1_X = 0x203F20 local P1_HITBOX = 0x2040A0

function toggle_hitboxes() hitbox_enabled = not hitbox_enabled if hitbox_enabled then gui.text(10, 10, "Hitboxes ON", 0xFFFFFF, 0x000000) -- In a real script, you'd draw rectangles via gui.draw_box() -- This requires reading memory offsets per character. else gui.text(10, 10, "Hitboxes OFF", 0xFFFFFF, 0x000000) end end

function on_frame() if input.get_key_state(hitbox_key) == 1 and not hitbox_enabled then toggle_hitboxes() end end

emu.register_frame(on_frame)


In Fightcade's training mode, resetting to the corner or neutral position requires navigating the dipswitch menu. This script resets to your recorded state instantly.

-- Reset hotkey: F1 (0x70)
local reset_key = 0x70
local last_reset = false

function reset_game() -- This sends the coin and start inputs quickly -- Adjust based on your game. For Street Fighter III: input.set_digital(1, INPUT_COIN, 1) -- Insert coin emu.wait_frames(2) input.set_digital(1, INPUT_START, 1) -- Press Start emu.wait_frames(2) input.set_digital(1, INPUT_COIN, 0) input.set_digital(1, INPUT_START, 0)

-- For training mode dipswitch reset: Use memory poke
-- (Simpler method: use Save/Load State hotkeys)

end

function on_frame() if input.get_key_state(reset_key) == 1 and not last_reset then last_reset = true emu.save_state("state0") -- Save current state as "neutral" emu.load_state("state0") -- Instantly reload elseif input.get_key_state(reset_key) == 0 then last_reset = false end end

emu.register_frame(on_frame)