sm64-roblox-liberty-prime/client/Mario/Automatic/init.server.lua
2023-07-08 18:42:28 -05:00

169 lines
4.5 KiB
Lua

--!strict
local System = require(script.Parent)
local Animations = System.Animations
local Sounds = System.Sounds
local Enums = System.Enums
local Util = System.Util
local Action = Enums.Action
local ActionFlags = Enums.ActionFlags
local ActionGroup = Enums.ActionGroups
local AirStep = Enums.AirStep
local MarioEyes = Enums.MarioEyes
local InputFlags = Enums.InputFlags
local MarioFlags = Enums.MarioFlags
local ParticleFlags = Enums.ParticleFlags
type Mario = System.Mario
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Helpers
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
local function letGoOfLedge(m: Mario)
local floorHeight
m.Velocity *= Vector3.new(1, 0, 1)
m.ForwardVel = -8
local x = 60 * Util.Sins(m.FaceAngle.Y)
local z = 60 * Util.Coss(m.FaceAngle.Y)
m.Position -= Vector3.new(x, 0, z)
floorHeight = Util.FindFloor(m.Position)
if floorHeight < m.Position.Y - 100 then
m.Position -= (Vector3.yAxis * 100)
else
m.Position = Util.SetY(m.Position, floorHeight)
end
return m:SetAction(Action.SOFT_BONK)
end
local function climbUpLedge(m: Mario)
local x = 14 * Util.Sins(m.FaceAngle.Y)
local z = 14 * Util.Coss(m.FaceAngle.Y)
m:SetAnimation(Animations.IDLE_HEAD_LEFT)
m.Position += Vector3.new(x, 0, z)
end
local function updateLedgeClimb(m: Mario, anim: Animation, endAction: number)
m:StopAndSetHeightToFloor()
m:SetAnimation(anim)
if m:IsAnimAtEnd() then
m:SetAction(endAction)
if endAction == Action.IDLE then
climbUpLedge(m)
end
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Actions
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
local DEF_ACTION: (number, (Mario) -> boolean) -> () = System.RegisterAction
DEF_ACTION(Action.LEDGE_GRAB, function(m: Mario)
local intendedDYaw = m.IntendedYaw - m.FaceAngle.Y
local hasSpaceForMario = m.CeilHeight - m.FloorHeight >= 160
if m.ActionTimer < 10 then
m.ActionTimer += 1
end
if m.Floor and m.Floor.Normal.Y < 0.9063078 then
return letGoOfLedge(m)
end
if m.Input:Has(InputFlags.Z_PRESSED, InputFlags.OFF_FLOOR) then
return letGoOfLedge(m)
end
if m.Input:Has(InputFlags.A_PRESSED) and hasSpaceForMario then
return m:SetAction(Action.LEDGE_CLIMB_FAST)
end
if m.Input:Has(InputFlags.STOMPED) then
return letGoOfLedge(m)
end
if m.ActionTimer == 10 and m.Input:Has(InputFlags.NONZERO_ANALOG) then
if math.abs(intendedDYaw) <= 0x4000 then
if hasSpaceForMario then
return m:SetAction(Action.LEDGE_CLIMB_SLOW)
end
else
return letGoOfLedge(m)
end
end
local heightAboveFloor = m.Position.Y - m:FindFloorHeightRelativePolar(-0x8000, 30)
if hasSpaceForMario and heightAboveFloor < 100 then
return m:SetAction(Action.LEDGE_CLIMB_FAST)
end
if m.ActionArg == 0 then
m:PlaySoundIfNoFlag(Sounds.MARIO_WHOA, MarioFlags.MARIO_SOUND_PLAYED)
end
m:StopAndSetHeightToFloor()
m:SetAnimation(Animations.IDLE_ON_LEDGE)
return false
end)
DEF_ACTION(Action.LEDGE_CLIMB_SLOW, function(m: Mario)
if m.Input:Has(InputFlags.OFF_FLOOR) then
return letGoOfLedge(m)
end
if m.ActionTimer >= 28 then
if
m.Input:Has(InputFlags.NONZERO_ANALOG, InputFlags.A_PRESSED, InputFlags.OFF_FLOOR, InputFlags.ABOVE_SLIDE)
then
climbUpLedge(m)
return m:CheckCommonActionExits()
end
end
if m.ActionTimer == 10 then
m:PlaySoundIfNoFlag(Sounds.MARIO_EEUH, MarioFlags.MARIO_SOUND_PLAYED)
end
updateLedgeClimb(m, Animations.SLOW_LEDGE_GRAB, Action.IDLE)
return false
end)
DEF_ACTION(Action.LEDGE_CLIMB_DOWN, function(m: Mario)
if m.Input:Has(InputFlags.OFF_FLOOR) then
return letGoOfLedge(m)
end
m:PlaySoundIfNoFlag(Sounds.MARIO_WHOA, MarioFlags.MARIO_SOUND_PLAYED)
updateLedgeClimb(m, Animations.CLIMB_DOWN_LEDGE, Action.LEDGE_GRAB)
m.ActionArg = 1
return false
end)
DEF_ACTION(Action.LEDGE_CLIMB_FAST, function(m: Mario)
if m.Input:Has(InputFlags.OFF_FLOOR) then
return letGoOfLedge(m)
end
m:PlaySoundIfNoFlag(Sounds.MARIO_UH2, MarioFlags.MARIO_SOUND_PLAYED)
updateLedgeClimb(m, Animations.FAST_LEDGE_GRAB, Action.IDLE)
if m.AnimFrame == 8 then
m:PlayLandingSound(Sounds.ACTION_TERRAIN_LANDING)
end
return false
end)