super mario 64 movement system mobile
Key RequiredUniversal

super mario 64 movement system mobile

Universal Scriptgrilled_cheesegrilled_cheese 259 views 1.9K executesUpdated Jul 14, 2026
Unrated
00
Lua Script•218 lines (7513 chars)
-- DELTA MOBILE COMPATIBLE - SM64 MOVEMENT ENGINE (WALL KICK PURGED)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")

local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local rootPart = character:WaitForChild("HumanoidRootPart")

-- Default Physics Constants
local SM64_BASE_SPEED = 14
local SM64_MAX_SPEED = 30 
local ACCELERATION_RATE = 0.55
local GROUND_FRICTION = 0.94

-- Core System Flags
local lastLandTime = 0
local jumpCombo = 0
local isZHeld = false
local wasAirborne = false
local moveState = "FREE" -- FREE, LONGJUMP, TRIPLEJUMP, DIVING, SLIDING, GROUNDPOUND

-- Enforce Delta-Safe Settings
workspace.Gravity = 195 
humanoid.PlatformStand = false
humanoid.WalkSpeed = SM64_BASE_SPEED
humanoid.JumpPower = 50

-- --- DELTA HUD GENERATION (Z, B BUTTONS, SPEEDOMETER) ---
local screenGui = player:WaitForChild("PlayerGui"):FindFirstChild("SM64_DeltaHUD")
if screenGui then screenGui:Destroy() end

screenGui = Instance.new("ScreenGui")
screenGui.Name = "SM64_DeltaHUD"
screenGui.ResetOnSpawn = false
screenGui.Parent = player.PlayerGui

local hudContainer = Instance.new("Frame")
hudContainer.Size = UDim2.new(0, 220, 0, 260)
hudContainer.Position = UDim2.new(1, -260, 1, -280)
hudContainer.BackgroundTransparency = 1
hudContainer.Parent = screenGui

local speedometer = Instance.new("TextLabel")
speedometer.Name = "Speedometer"
speedometer.Size = UDim2.new(1, 0, 0, 40)
speedometer.BackgroundTransparency = 0.6
speedometer.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
speedometer.Text = "SPEED: 0 STUDS/S"
speedometer.TextColor3 = Color3.fromRGB(50, 255, 50)
speedometer.Font = Enum.Font.Code
speedometer.TextSize = 16
speedometer.Parent = hudContainer

local uiCornerHUD = Instance.new("UICorner")
uiCornerHUD.CornerRadius = UDim.new(0, 8)
uiCornerHUD.Parent = speedometer

local buttonContainer = Instance.new("Frame")
buttonContainer.Size = UDim2.new(1, 0, 1, -50)
buttonContainer.Position = UDim2.new(0, 0, 0, 50)
buttonContainer.BackgroundTransparency = 1
buttonContainer.Parent = hudContainer

local function createMobileButton(name, color, pos, text)
    local btn = Instance.new("TextButton")
    btn.Name = name
    btn.Size = UDim2.new(0, 75, 0, 75)
    btn.Position = pos
    btn.BackgroundColor3 = color
    btn.Text = text
    btn.TextColor3 = Color3.fromRGB(255, 255, 255)
    btn.Font = Enum.Font.SourceSansBold
    btn.TextSize = 28
    btn.Parent = buttonContainer
    
    local corner = Instance.new("UICorner")
    corner.CornerRadius = UDim.new(1, 0)
    corner.Parent = btn
    return btn
end

local btnZ = createMobileButton("Z_Button", Color3.fromRGB(100, 100, 100), UDim2.new(0, 10, 0, 100), "Z")
local btnB = createMobileButton("B_Button", Color3.fromRGB(200, 50, 50), UDim2.new(0, 110, 0, 30), "B")

-- --- CORE ENGINE TICK (MOMENTUM & COMBO LOCK PHYSICS) ---
RunService.PreSimulation:Connect(function()
    if not rootPart or not humanoid or humanoid.Health <= 0 then return end
    
    local moveDir = humanoid.MoveDirection
    local lookVector = rootPart.CFrame.LookVector
    local rawVelocity = rootPart.AssemblyLinearVelocity
    local horizontalSpeed = Vector3.new(rawVelocity.X, 0, rawVelocity.Z).Magnitude
    
    local currentState = humanoid:GetState()
    local isGrounded = currentState ~= Enum.HumanoidStateType.Freefall and currentState ~= Enum.HumanoidStateType.Jumping
    
    speedometer.Text = string.format("SPEED: %d STUDS/S", math.floor(horizontalSpeed))

    -- --- JUMP VECTOR CHANGER MATRIX ---
    if not isGrounded and not wasAirborne then
        wasAirborne = true
        
        local now = tick()
        if now - lastLandTime < 0.55 then
            jumpCombo = (jumpCombo % 3) + 1
        else
            jumpCombo = 1
        end
        
        if isZHeld and humanoid.WalkSpeed > 14 then
            moveState = "LONGJUMP"
            rootPart.AssemblyLinearVelocity = (lookVector * 78) + Vector3.new(0, 24, 0)
        elseif isZHeld and moveDir:Dot(lookVector) < -0.2 then
            moveState = "LONGJUMP"
            rootPart.AssemblyLinearVelocity = (lookVector * -96) + Vector3.new(0, 20, 0)
        elseif jumpCombo == 2 and humanoid.WalkSpeed > 16 then
            moveState = "FREE"
            rootPart.AssemblyLinearVelocity = Vector3.new(rawVelocity.X, 62, rawVelocity.Z)
        elseif jumpCombo == 3 and humanoid.WalkSpeed > 20 then
            moveState = "TRIPLEJUMP"
            rootPart.AssemblyLinearVelocity = Vector3.new(rawVelocity.X * 1.25, 90, rawVelocity.Z * 1.25)
            jumpCombo = 0
        else
            moveState = "FREE"
            jumpCombo = 1
        end
    end
    
    if isGrounded and wasAirborne then
        lastLandTime = tick()
        wasAirborne = false
        if moveState == "DIVING" then 
            moveState = "SLIDING" 
        elseif moveState == "GROUNDPOUND" then
            moveState = "FREE"
        end
    end
    
    -- --- ACCELERATION MOMENTUM SYSTEM ---
    if moveDir.Magnitude > 0 then
        if isZHeld then
            humanoid.WalkSpeed = 7
        else
            humanoid.WalkSpeed = math.min(humanoid.WalkSpeed + ACCELERATION_RATE, SM64_MAX_SPEED)
        end
    else
        humanoid.WalkSpeed = SM64_BASE_SPEED
    end
    
    -- --- DYNAMIC N64 ANIMATION RUN SCALER ---
    local animator = humanoid:FindFirstChildOfClass("Animator")
    if animator then
        for _, track in ipairs(animator:GetPlayingAnimationTracks()) do
            if track.Name:lower():find("run") or track.Name:lower():find("walk") then
                if moveDir.Magnitude > 0 then
                    local animSpeedRatio = humanoid.WalkSpeed / SM64_BASE_SPEED
                    track:AdjustSpeed(math.clamp(animSpeedRatio, 0.6, 2.3))
                else
                    track:AdjustSpeed(1)
                end
            end
        end
    end
    
    if moveState == "SLIDING" and isGrounded then
        rootPart.AssemblyLinearVelocity = rawVelocity * GROUND_FRICTION
        if rawVelocity.Magnitude < 5 then
            moveState = "FREE"
        end
    end
end)

-- --- EXTRA ACTION HUD EXTENSIONS ---

btnB.MouseButton1Down:Connect(function()
    if not rootPart or humanoid.Health <= 0 then return end
    moveState = "DIVING"
    local lookVector = rootPart.CFrame.LookVector
    rootPart.AssemblyLinearVelocity = (lookVector * 64) + Vector3.new(0, 24, 0)
end)

btnZ.MouseButton1Down:Connect(function()
    isZHeld = true
    btnZ.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
    
    local isAirborne = humanoid:GetState() == Enum.HumanoidStateType.Freefall
    if isAirborne then
        moveState = "GROUNDPOUND"
        rootPart.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
        task.wait(0.15)
        if moveState == "GROUNDPOUND" then
            rootPart.AssemblyLinearVelocity = Vector3.new(0, -140, 0) 
        end
    end
end)

btnZ.MouseButton1Up:Connect(function()
    isZHeld = false
    btnZ.BackgroundColor3 = Color3.fromRGB(100, 100, 100)
end)

player.CharacterAdded:Connect(function(newChar)
    character = newChar
    humanoid = character:WaitForChild("Humanoid")
    rootPart = character:WaitForChild("HumanoidRootPart")
    
    workspace.Gravity = 195
    humanoid.PlatformStand = false
    humanoid.WalkSpeed = SM64_BASE_SPEED
    humanoid.JumpPower = 50
    moveState = "FREE"
    isZHeld = false
    jumpCombo = 0
    wasAirborne = false
end)

print("mario pee pee")

Features & Information

this is a script i made thats pretty close to sm64 movement thats unaversal mobile only Super bloxy 64™
#mario#movement#silly#funny#retro

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts