Initial commit.
This commit is contained in:
parent
54df585889
commit
585d94d2b2
45 changed files with 11194 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
sourcemap.json
|
6
.vscode/settings.json
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"[lua]": {
|
||||||
|
"editor.defaultFormatter": "JohnnyMorganz.stylua",
|
||||||
|
"editor.formatOnSave": true
|
||||||
|
}
|
||||||
|
}
|
2
aftman.toml
Normal file
2
aftman.toml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
[tools]
|
||||||
|
rojo = "rojo-rbx/rojo@7.2.1"
|
53
default.project.json
Normal file
53
default.project.json
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
{
|
||||||
|
"name": "Super Mario 64",
|
||||||
|
|
||||||
|
"tree": {
|
||||||
|
"$className": "DataModel",
|
||||||
|
"$ignoreUnknownInstances": true,
|
||||||
|
|
||||||
|
"ReplicatedFirst": {
|
||||||
|
"$className": "ReplicatedFirst",
|
||||||
|
"$ignoreUnknownInstances": true,
|
||||||
|
|
||||||
|
"SM64": {
|
||||||
|
"$path": "SM64",
|
||||||
|
"$ignoreUnknownInstances": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"ServerScriptService": {
|
||||||
|
"$className": "ServerScriptService",
|
||||||
|
"$ignoreUnknownInstances": true,
|
||||||
|
|
||||||
|
"LazyNetworking": {
|
||||||
|
"$path": "rbx/LazyNetworking.server.lua"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"StarterPlayer": {
|
||||||
|
"$className": "StarterPlayer",
|
||||||
|
"$ignoreUnknownInstances": true,
|
||||||
|
|
||||||
|
"StarterCharacterScripts": {
|
||||||
|
"$className": "StarterCharacterScripts",
|
||||||
|
"$ignoreUnknownInstances": true,
|
||||||
|
|
||||||
|
"Animate": {
|
||||||
|
"$className": "Hole"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Sound": {
|
||||||
|
"$className": "Hole"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Health": {
|
||||||
|
"$className": "Hole"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Character": {
|
||||||
|
"$path": "rbx/Character.server.lua"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
97
rbx/Character.server.lua
Normal file
97
rbx/Character.server.lua
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
--!strict
|
||||||
|
local Players = game:GetService("Players")
|
||||||
|
|
||||||
|
local character: any = script.Parent
|
||||||
|
local player = Players:GetPlayerFromCharacter(character)
|
||||||
|
|
||||||
|
if not player then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local userId = player.UserId
|
||||||
|
local hDesc: HumanoidDescription?
|
||||||
|
|
||||||
|
local function patchCollision(desc: Instance)
|
||||||
|
if desc:IsA("BasePart") and desc.CollisionGroupId ~= 1 then
|
||||||
|
local canCollide = desc:GetPropertyChangedSignal("CanCollide")
|
||||||
|
desc.CollisionGroup = "Player"
|
||||||
|
desc.CanQuery = false
|
||||||
|
desc.CanTouch = false
|
||||||
|
desc.Massless = true
|
||||||
|
|
||||||
|
canCollide:Connect(function()
|
||||||
|
desc.CanCollide = false
|
||||||
|
end)
|
||||||
|
|
||||||
|
desc.CanCollide = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function patchAllCollision()
|
||||||
|
for i, desc in character:GetDescendants() do
|
||||||
|
task.spawn(patchCollision, desc)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
task.spawn(patchAllCollision)
|
||||||
|
character.DescendantAdded:Connect(patchCollision)
|
||||||
|
|
||||||
|
local function reload()
|
||||||
|
for retry = 1, 10 do
|
||||||
|
local success, result = pcall(function()
|
||||||
|
return Players:GetHumanoidDescriptionFromUserId(userId)
|
||||||
|
end)
|
||||||
|
|
||||||
|
if success then
|
||||||
|
hDesc = result
|
||||||
|
break
|
||||||
|
else
|
||||||
|
task.wait(retry / 2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if hDesc then
|
||||||
|
hDesc.HeadScale = 1.8
|
||||||
|
hDesc.WidthScale = 1.3
|
||||||
|
hDesc.DepthScale = 1.4
|
||||||
|
hDesc.HeightScale = 1.2
|
||||||
|
hDesc.BodyTypeScale = 0
|
||||||
|
hDesc.ProportionScale = 0
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local humanoid = character:WaitForChild("Humanoid")
|
||||||
|
assert(hDesc)
|
||||||
|
|
||||||
|
if humanoid:IsA("Humanoid") then
|
||||||
|
while not humanoid.RootPart do
|
||||||
|
humanoid.Changed:Wait()
|
||||||
|
end
|
||||||
|
|
||||||
|
local rootPart = humanoid.RootPart
|
||||||
|
assert(rootPart, "No HumanoidRootPart??")
|
||||||
|
|
||||||
|
local particles = rootPart:FindFirstChild("Particles")
|
||||||
|
humanoid:ApplyDescription(hDesc)
|
||||||
|
|
||||||
|
if particles and particles:IsA("Attachment") then
|
||||||
|
local floorDec = humanoid.HipHeight + (rootPart.Size.Y / 2)
|
||||||
|
local pos = Vector3.new(0, -floorDec, 0)
|
||||||
|
rootPart.PivotOffset = CFrame.new(pos)
|
||||||
|
particles.Position = pos
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local reset = Instance.new("RemoteEvent")
|
||||||
|
reset.Parent = character
|
||||||
|
reset.Name = "Reset"
|
||||||
|
|
||||||
|
reset.OnServerEvent:Connect(function(player)
|
||||||
|
if player == Players:GetPlayerFromCharacter(character) then
|
||||||
|
reload()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
task.spawn(reload)
|
60
rbx/LazyNetworking.server.lua
Normal file
60
rbx/LazyNetworking.server.lua
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
--!strict
|
||||||
|
local Validators: { [string]: (Player, ...any) -> boolean } = {}
|
||||||
|
type Echo = () -> ()
|
||||||
|
|
||||||
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||||
|
local ReplicatedFirst = game:GetService("ReplicatedFirst")
|
||||||
|
local PhysicsService = game:GetService("PhysicsService")
|
||||||
|
local Sounds = require(ReplicatedFirst.SM64.Sounds)
|
||||||
|
|
||||||
|
local lazy = Instance.new("RemoteEvent")
|
||||||
|
lazy.Parent = ReplicatedStorage
|
||||||
|
lazy.Name = "LazyNetwork"
|
||||||
|
|
||||||
|
function Validators.PlaySound(player: Player, name: string)
|
||||||
|
local sound: Instance? = Sounds[name]
|
||||||
|
|
||||||
|
if sound and sound:IsA("Sound") then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function Validators.SetParticle(player: Player, name: string, set: boolean?)
|
||||||
|
if typeof(name) ~= "string" then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local character = player.Character
|
||||||
|
|
||||||
|
local rootPart = if character then character.PrimaryPart else nil
|
||||||
|
|
||||||
|
if rootPart then
|
||||||
|
local particles = rootPart:FindFirstChild("Particles")
|
||||||
|
|
||||||
|
local particle = if particles then particles:FindFirstChild(name) else nil
|
||||||
|
|
||||||
|
if particle then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function Validators.SetAngle(player: Player, angle: Vector3int16)
|
||||||
|
return typeof(angle) == "Vector3int16"
|
||||||
|
end
|
||||||
|
|
||||||
|
local function onNetworkReceive(player: Player, cmd: string, ...)
|
||||||
|
local validate = Validators[cmd]
|
||||||
|
|
||||||
|
if validate and validate(player, ...) then
|
||||||
|
lazy:FireAllClients(player, cmd, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
lazy.OnServerEvent:Connect(onNetworkReceive)
|
||||||
|
PhysicsService:CreateCollisionGroup("Player")
|
||||||
|
PhysicsService:CollisionGroupSetCollidable("Default", "Player", false)
|
1
selene.toml
Normal file
1
selene.toml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
std = "roblox"
|
229
sm64/Animations.lua
Normal file
229
sm64/Animations.lua
Normal file
|
@ -0,0 +1,229 @@
|
||||||
|
--!strict
|
||||||
|
local System = script.Parent
|
||||||
|
local Assets = System.Assets
|
||||||
|
local Anims = Assets.Animations
|
||||||
|
|
||||||
|
local Data = table.freeze({
|
||||||
|
SLOW_LEDGE_GRAB = Anims.SLOW_LEDGE_GRAB,
|
||||||
|
FALL_OVER_BACKWARDS = Anims.FALL_OVER_BACKWARDS,
|
||||||
|
BACKWARD_AIR_KB = Anims.BACKWARD_AIR_KB,
|
||||||
|
DYING_ON_BACK = Anims.DYING_ON_BACK,
|
||||||
|
BACKFLIP = Anims.BACKFLIP,
|
||||||
|
CLIMB_UP_POLE = Anims.CLIMB_UP_POLE,
|
||||||
|
GRAB_POLE_SHORT = Anims.GRAB_POLE_SHORT,
|
||||||
|
GRAB_POLE_SWING_PART1 = Anims.GRAB_POLE_SWING_PART1,
|
||||||
|
GRAB_POLE_SWING_PART2 = Anims.GRAB_POLE_SWING_PART2,
|
||||||
|
HANDSTAND_IDLE = Anims.HANDSTAND_IDLE,
|
||||||
|
HANDSTAND_JUMP = Anims.HANDSTAND_JUMP,
|
||||||
|
START_HANDSTAND = Anims.START_HANDSTAND,
|
||||||
|
RETURN_FROM_HANDSTAND = Anims.RETURN_FROM_HANDSTAND,
|
||||||
|
IDLE_ON_POLE = Anims.IDLE_ON_POLE,
|
||||||
|
A_POSE = Anims.A_POSE,
|
||||||
|
SKID_ON_GROUND = Anims.SKID_ON_GROUND,
|
||||||
|
STOP_SKID = Anims.STOP_SKID,
|
||||||
|
CROUCH_FROM_FAST_LONGJUMP = Anims.CROUCH_FROM_FAST_LONGJUMP,
|
||||||
|
CROUCH_FROM_SLOW_LONGJUMP = Anims.CROUCH_FROM_SLOW_LONGJUMP,
|
||||||
|
FAST_LONGJUMP = Anims.FAST_LONGJUMP,
|
||||||
|
SLOW_LONGJUMP = Anims.SLOW_LONGJUMP,
|
||||||
|
AIRBORNE_ON_STOMACH = Anims.AIRBORNE_ON_STOMACH,
|
||||||
|
WALK_WITH_LIGHT_OBJ = Anims.WALK_WITH_LIGHT_OBJ,
|
||||||
|
RUN_WITH_LIGHT_OBJ = Anims.RUN_WITH_LIGHT_OBJ,
|
||||||
|
SLOW_WALK_WITH_LIGHT_OBJ = Anims.SLOW_WALK_WITH_LIGHT_OBJ,
|
||||||
|
SHIVERING_WARMING_HAND = Anims.SHIVERING_WARMING_HAND,
|
||||||
|
SHIVERING_RETURN_TO_IDLE = Anims.SHIVERING_RETURN_TO_IDLE,
|
||||||
|
SHIVERING = Anims.SHIVERING,
|
||||||
|
CLIMB_DOWN_LEDGE = Anims.CLIMB_DOWN_LEDGE,
|
||||||
|
CREDITS_WAVING = Anims.CREDITS_WAVING,
|
||||||
|
CREDITS_LOOK_UP = Anims.CREDITS_LOOK_UP,
|
||||||
|
CREDITS_RETURN_FROM_LOOK_UP = Anims.CREDITS_RETURN_FROM_LOOK_UP,
|
||||||
|
CREDITS_RAISE_HAND = Anims.CREDITS_RAISE_HAND,
|
||||||
|
CREDITS_LOWER_HAND = Anims.CREDITS_LOWER_HAND,
|
||||||
|
CREDITS_TAKE_OFF_CAP = Anims.CREDITS_TAKE_OFF_CAP,
|
||||||
|
CREDITS_START_WALK_LOOK_UP = Anims.CREDITS_START_WALK_LOOK_UP,
|
||||||
|
CREDITS_LOOK_BACK_THEN_RUN = Anims.CREDITS_LOOK_BACK_THEN_RUN,
|
||||||
|
-- FINAL_BOWSER_RAISE_HAND_SPIN = Anims.FINAL_BOWSER_RAISE_HAND_SPIN;
|
||||||
|
-- FINAL_BOWSER_WING_CAP_TAKE_OFF = Anims.FINAL_BOWSER_WING_CAP_TAKE_OFF;
|
||||||
|
CREDITS_PEACE_SIGN = Anims.CREDITS_PEACE_SIGN,
|
||||||
|
STAND_UP_FROM_LAVA_BOOST = Anims.STAND_UP_FROM_LAVA_BOOST,
|
||||||
|
FIRE_LAVA_BURN = Anims.FIRE_LAVA_BURN,
|
||||||
|
WING_CAP_FLY = Anims.WING_CAP_FLY,
|
||||||
|
HANG_ON_OWL = Anims.HANG_ON_OWL,
|
||||||
|
LAND_ON_STOMACH = Anims.LAND_ON_STOMACH,
|
||||||
|
FORWARD_AIR_KB = Anims.FORWARD_AIR_KB,
|
||||||
|
DYING_ON_STOMACH = Anims.DYING_ON_STOMACH,
|
||||||
|
SUFFOCATING = Anims.SUFFOCATING,
|
||||||
|
COUGHING = Anims.COUGHING,
|
||||||
|
THROW_CATCH_KEY = Anims.THROW_CATCH_KEY,
|
||||||
|
DYING_FALL_OVER = Anims.DYING_FALL_OVER,
|
||||||
|
IDLE_ON_LEDGE = Anims.IDLE_ON_LEDGE,
|
||||||
|
FAST_LEDGE_GRAB = Anims.FAST_LEDGE_GRAB,
|
||||||
|
HANG_ON_CEILING = Anims.HANG_ON_CEILING,
|
||||||
|
PUT_CAP_ON = Anims.PUT_CAP_ON,
|
||||||
|
TAKE_CAP_OFF_THEN_ON = Anims.TAKE_CAP_OFF_THEN_ON,
|
||||||
|
QUICKLY_PUT_CAP_ON = Anims.QUICKLY_PUT_CAP_ON, -- unused
|
||||||
|
HEAD_STUCK_IN_GROUND = Anims.HEAD_STUCK_IN_GROUND,
|
||||||
|
GROUND_POUND_LANDING = Anims.GROUND_POUND_LANDING,
|
||||||
|
TRIPLE_JUMP_GROUND_POUND = Anims.TRIPLE_JUMP_GROUND_POUND,
|
||||||
|
START_GROUND_POUND = Anims.START_GROUND_POUND,
|
||||||
|
GROUND_POUND = Anims.GROUND_POUND,
|
||||||
|
BOTTOM_STUCK_IN_GROUND = Anims.BOTTOM_STUCK_IN_GROUND,
|
||||||
|
IDLE_WITH_LIGHT_OBJ = Anims.IDLE_WITH_LIGHT_OBJ,
|
||||||
|
JUMP_LAND_WITH_LIGHT_OBJ = Anims.JUMP_LAND_WITH_LIGHT_OBJ,
|
||||||
|
JUMP_WITH_LIGHT_OBJ = Anims.JUMP_WITH_LIGHT_OBJ,
|
||||||
|
FALL_LAND_WITH_LIGHT_OBJ = Anims.FALL_LAND_WITH_LIGHT_OBJ,
|
||||||
|
FALL_WITH_LIGHT_OBJ = Anims.FALL_WITH_LIGHT_OBJ,
|
||||||
|
FALL_FROM_SLIDING_WITH_LIGHT_OBJ = Anims.FALL_FROM_SLIDING_WITH_LIGHT_OBJ,
|
||||||
|
SLIDING_ON_BOTTOM_WITH_LIGHT_OBJ = Anims.SLIDING_ON_BOTTOM_WITH_LIGHT_OBJ,
|
||||||
|
STAND_UP_FROM_SLIDING_WITH_LIGHT_OBJ = Anims.STAND_UP_FROM_SLIDING_WITH_LIGHT_OBJ,
|
||||||
|
RIDING_SHELL = Anims.RIDING_SHELL,
|
||||||
|
WALKING = Anims.WALKING,
|
||||||
|
FORWARD_FLIP = Anims.FORWARD_FLIP, -- unused
|
||||||
|
JUMP_RIDING_SHELL = Anims.JUMP_RIDING_SHELL,
|
||||||
|
LAND_FROM_DOUBLE_JUMP = Anims.LAND_FROM_DOUBLE_JUMP,
|
||||||
|
DOUBLE_JUMP_FALL = Anims.DOUBLE_JUMP_FALL,
|
||||||
|
SINGLE_JUMP = Anims.SINGLE_JUMP,
|
||||||
|
LAND_FROM_SINGLE_JUMP = Anims.LAND_FROM_SINGLE_JUMP,
|
||||||
|
AIR_KICK = Anims.AIR_KICK,
|
||||||
|
DOUBLE_JUMP_RISE = Anims.DOUBLE_JUMP_RISE,
|
||||||
|
START_FORWARD_SPINNING = Anims.START_FORWARD_SPINNING, -- unused
|
||||||
|
THROW_LIGHT_OBJECT = Anims.THROW_LIGHT_OBJECT,
|
||||||
|
FALL_FROM_SLIDE_KICK = Anims.FALL_FROM_SLIDE_KICK,
|
||||||
|
BEND_KNESS_RIDING_SHELL = Anims.BEND_KNESS_RIDING_SHELL, -- unused
|
||||||
|
LEGS_STUCK_IN_GROUND = Anims.LEGS_STUCK_IN_GROUND,
|
||||||
|
GENERAL_FALL = Anims.GENERAL_FALL,
|
||||||
|
GENERAL_LAND = Anims.GENERAL_LAND,
|
||||||
|
BEING_GRABBED = Anims.BEING_GRABBED,
|
||||||
|
GRAB_HEAVY_OBJECT = Anims.GRAB_HEAVY_OBJECT,
|
||||||
|
SLOW_LAND_FROM_DIVE = Anims.SLOW_LAND_FROM_DIVE,
|
||||||
|
FLY_FROM_CANNON = Anims.FLY_FROM_CANNON,
|
||||||
|
MOVE_ON_WIRE_NET_RIGHT = Anims.MOVE_ON_WIRE_NET_RIGHT,
|
||||||
|
MOVE_ON_WIRE_NET_LEFT = Anims.MOVE_ON_WIRE_NET_LEFT,
|
||||||
|
MISSING_CAP = Anims.MISSING_CAP,
|
||||||
|
PULL_DOOR_WALK_IN = Anims.PULL_DOOR_WALK_IN,
|
||||||
|
PUSH_DOOR_WALK_IN = Anims.PUSH_DOOR_WALK_IN,
|
||||||
|
UNLOCK_DOOR = Anims.UNLOCK_DOOR,
|
||||||
|
START_REACH_POCKET = Anims.START_REACH_POCKET, -- unused, reaching keys maybe?
|
||||||
|
REACH_POCKET = Anims.REACH_POCKET, -- unused
|
||||||
|
STOP_REACH_POCKET = Anims.STOP_REACH_POCKET, -- unused
|
||||||
|
GROUND_THROW = Anims.GROUND_THROW,
|
||||||
|
GROUND_KICK = Anims.GROUND_KICK,
|
||||||
|
FIRST_PUNCH = Anims.FIRST_PUNCH,
|
||||||
|
SECOND_PUNCH = Anims.SECOND_PUNCH,
|
||||||
|
FIRST_PUNCH_FAST = Anims.FIRST_PUNCH_FAST,
|
||||||
|
SECOND_PUNCH_FAST = Anims.SECOND_PUNCH_FAST,
|
||||||
|
PICK_UP_LIGHT_OBJ = Anims.PICK_UP_LIGHT_OBJ,
|
||||||
|
PUSHING = Anims.PUSHING,
|
||||||
|
START_RIDING_SHELL = Anims.START_RIDING_SHELL,
|
||||||
|
PLACE_LIGHT_OBJ = Anims.PLACE_LIGHT_OBJ,
|
||||||
|
FORWARD_SPINNING = Anims.FORWARD_SPINNING,
|
||||||
|
BACKWARD_SPINNING = Anims.BACKWARD_SPINNING,
|
||||||
|
BREAKDANCE = Anims.BREAKDANCE,
|
||||||
|
RUNNING = Anims.RUNNING,
|
||||||
|
RUNNING_UNUSED = Anims.RUNNING_UNUSED, -- unused duplicate, originally part 2?
|
||||||
|
SOFT_BACK_KB = Anims.SOFT_BACK_KB,
|
||||||
|
SOFT_FRONT_KB = Anims.SOFT_FRONT_KB,
|
||||||
|
DYING_IN_QUICKSAND = Anims.DYING_IN_QUICKSAND,
|
||||||
|
IDLE_IN_QUICKSAND = Anims.IDLE_IN_QUICKSAND,
|
||||||
|
MOVE_IN_QUICKSAND = Anims.MOVE_IN_QUICKSAND,
|
||||||
|
ELECTROCUTION = Anims.ELECTROCUTION,
|
||||||
|
SHOCKED = Anims.SHOCKED,
|
||||||
|
BACKWARD_KB = Anims.BACKWARD_KB,
|
||||||
|
FORWARD_KB = Anims.FORWARD_KB,
|
||||||
|
IDLE_HEAVY_OBJ = Anims.IDLE_HEAVY_OBJ,
|
||||||
|
-- STAND_AGAINST_WALL = Anims.STAND_AGAINST_WALL;
|
||||||
|
SIDESTEP_LEFT = Anims.SIDESTEP_LEFT,
|
||||||
|
SIDESTEP_RIGHT = Anims.SIDESTEP_RIGHT,
|
||||||
|
START_SLEEP_IDLE = Anims.START_SLEEP_IDLE,
|
||||||
|
START_SLEEP_SCRATCH = Anims.START_SLEEP_SCRATCH,
|
||||||
|
START_SLEEP_YAWN = Anims.START_SLEEP_YAWN,
|
||||||
|
START_SLEEP_SITTING = Anims.START_SLEEP_SITTING,
|
||||||
|
SLEEP_IDLE = Anims.SLEEP_IDLE,
|
||||||
|
SLEEP_START_LYING = Anims.SLEEP_START_LYING,
|
||||||
|
SLEEP_LYING = Anims.SLEEP_LYING,
|
||||||
|
DIVE = Anims.DIVE,
|
||||||
|
SLIDE_DIVE = Anims.SLIDE_DIVE,
|
||||||
|
GROUND_BONK = Anims.GROUND_BONK,
|
||||||
|
STOP_SLIDE_LIGHT_OBJ = Anims.STOP_SLIDE_LIGHT_OBJ,
|
||||||
|
SLIDE_KICK = Anims.SLIDE_KICK,
|
||||||
|
CROUCH_FROM_SLIDE_KICK = Anims.CROUCH_FROM_SLIDE_KICK,
|
||||||
|
SLIDE_MOTIONLESS = Anims.SLIDE_MOTIONLESS, -- unused
|
||||||
|
STOP_SLIDE = Anims.STOP_SLIDE,
|
||||||
|
FALL_FROM_SLIDE = Anims.FALL_FROM_SLIDE,
|
||||||
|
SLIDE = Anims.SLIDE,
|
||||||
|
TIPTOE = Anims.TIPTOE,
|
||||||
|
TWIRL_LAND = Anims.TWIRL_LAND,
|
||||||
|
TWIRL = Anims.TWIRL,
|
||||||
|
START_TWIRL = Anims.START_TWIRL,
|
||||||
|
STOP_CROUCHING = Anims.STOP_CROUCHING,
|
||||||
|
START_CROUCHING = Anims.START_CROUCHING,
|
||||||
|
CROUCHING = Anims.CROUCHING,
|
||||||
|
CRAWLING = Anims.CRAWLING,
|
||||||
|
STOP_CRAWLING = Anims.STOP_CRAWLING,
|
||||||
|
START_CRAWLING = Anims.START_CRAWLING,
|
||||||
|
SUMMON_STAR = Anims.SUMMON_STAR,
|
||||||
|
RETURN_STAR_APPROACH_DOOR = Anims.RETURN_STAR_APPROACH_DOOR,
|
||||||
|
BACKWARDS_WATER_KB = Anims.BACKWARDS_WATER_KB,
|
||||||
|
SWIM_WITH_OBJ_PART1 = Anims.SWIM_WITH_OBJ_PART1,
|
||||||
|
SWIM_WITH_OBJ_PART2 = Anims.SWIM_WITH_OBJ_PART2,
|
||||||
|
FLUTTERKICK_WITH_OBJ = Anims.FLUTTERKICK_WITH_OBJ,
|
||||||
|
WATER_ACTION_END_WITH_OBJ = Anims.WATER_ACTION_END_WITH_OBJ, -- either swimming or flutterkicking
|
||||||
|
STOP_GRAB_OBJ_WATER = Anims.STOP_GRAB_OBJ_WATER,
|
||||||
|
WATER_IDLE_WITH_OBJ = Anims.WATER_IDLE_WITH_OBJ,
|
||||||
|
DROWNING_PART1 = Anims.DROWNING_PART1,
|
||||||
|
DROWNING_PART2 = Anims.DROWNING_PART2,
|
||||||
|
WATER_DYING = Anims.WATER_DYING,
|
||||||
|
WATER_FORWARD_KB = Anims.WATER_FORWARD_KB,
|
||||||
|
FALL_FROM_WATER = Anims.FALL_FROM_WATER,
|
||||||
|
SWIM_PART1 = Anims.SWIM_PART1,
|
||||||
|
SWIM_PART2 = Anims.SWIM_PART2,
|
||||||
|
FLUTTERKICK = Anims.FLUTTERKICK,
|
||||||
|
WATER_ACTION_END = Anims.WATER_ACTION_END, -- either swimming or flutterkicking
|
||||||
|
WATER_PICK_UP_OBJ = Anims.WATER_PICK_UP_OBJ,
|
||||||
|
WATER_GRAB_OBJ_PART2 = Anims.WATER_GRAB_OBJ_PART2,
|
||||||
|
WATER_GRAB_OBJ_PART1 = Anims.WATER_GRAB_OBJ_PART1,
|
||||||
|
WATER_THROW_OBJ = Anims.WATER_THROW_OBJ,
|
||||||
|
WATER_IDLE = Anims.WATER_IDLE,
|
||||||
|
WATER_STAR_DANCE = Anims.WATER_STAR_DANCE,
|
||||||
|
RETURN_FROM_WATER_STAR_DANCE = Anims.RETURN_FROM_WATER_STAR_DANCE,
|
||||||
|
-- GRAB_BOWSER = Anims.GRAB_BOWSER;
|
||||||
|
-- SWINGING_BOWSER = Anims.SWINGING_BOWSER;
|
||||||
|
-- RELEASE_BOWSER = Anims.RELEASE_BOWSER;
|
||||||
|
-- HOLDING_BOWSER = Anims.HOLDING_BOWSER;
|
||||||
|
HEAVY_THROW = Anims.HEAVY_THROW,
|
||||||
|
WALK_PANTING = Anims.WALK_PANTING,
|
||||||
|
WALK_WITH_HEAVY_OBJ = Anims.WALK_WITH_HEAVY_OBJ,
|
||||||
|
TURNING_PART1 = Anims.TURNING_PART1,
|
||||||
|
TURNING_PART2 = Anims.TURNING_PART2,
|
||||||
|
SLIDEFLIP_LAND = Anims.SLIDEFLIP_LAND,
|
||||||
|
SLIDEFLIP = Anims.SLIDEFLIP,
|
||||||
|
TRIPLE_JUMP_LAND = Anims.TRIPLE_JUMP_LAND,
|
||||||
|
TRIPLE_JUMP = Anims.TRIPLE_JUMP,
|
||||||
|
FIRST_PERSON = Anims.FIRST_PERSON,
|
||||||
|
IDLE_HEAD_LEFT = Anims.IDLE_HEAD_LEFT,
|
||||||
|
IDLE_HEAD_RIGHT = Anims.IDLE_HEAD_RIGHT,
|
||||||
|
IDLE_HEAD_CENTER = Anims.IDLE_HEAD_CENTER,
|
||||||
|
HANDSTAND_LEFT = Anims.HANDSTAND_LEFT,
|
||||||
|
HANDSTAND_RIGHT = Anims.HANDSTAND_RIGHT,
|
||||||
|
WAKE_FROM_SLEEP = Anims.WAKE_FROM_SLEEP,
|
||||||
|
WAKE_FROM_LYING = Anims.WAKE_FROM_LYING,
|
||||||
|
START_TIPTOE = Anims.START_TIPTOE,
|
||||||
|
SLIDEJUMP = Anims.SLIDEJUMP, -- pole jump and wall kick
|
||||||
|
START_WALLKICK = Anims.START_WALLKICK,
|
||||||
|
STAR_DANCE = Anims.STAR_DANCE,
|
||||||
|
RETURN_FROM_STAR_DANCE = Anims.RETURN_FROM_STAR_DANCE,
|
||||||
|
FORWARD_SPINNING_FLIP = Anims.FORWARD_SPINNING_FLIP,
|
||||||
|
TRIPLE_JUMP_FLY = Anims.TRIPLE_JUMP_FLY,
|
||||||
|
})
|
||||||
|
|
||||||
|
task.spawn(function()
|
||||||
|
local ContentProvider = game:GetService("ContentProvider")
|
||||||
|
local preload = {}
|
||||||
|
|
||||||
|
for name, anim in pairs(Data) do
|
||||||
|
table.insert(preload, anim)
|
||||||
|
end
|
||||||
|
|
||||||
|
ContentProvider:PreloadAsync(preload)
|
||||||
|
end)
|
||||||
|
|
||||||
|
return Data
|
2639
sm64/Assets/Animations.model.json
Normal file
2639
sm64/Assets/Animations.model.json
Normal file
File diff suppressed because it is too large
Load diff
502
sm64/Assets/Sounds.model.json
Normal file
502
sm64/Assets/Sounds.model.json
Normal file
|
@ -0,0 +1,502 @@
|
||||||
|
{
|
||||||
|
"className": "Folder",
|
||||||
|
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_BONK"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_FLYING_FAST"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_HEAVY_LANDING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_HIT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_METAL_BONK"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_METAL_HEAVY_LANDING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_METAL_LANDING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_METAL_STEP"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_PAT_BACK"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_SIDE_FLIP"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_SPIN"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_BODY_HIT_GROUND"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_LANDING_DEFAULT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_LANDING_GRASS"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_LANDING_ICE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_LANDING_METAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_LANDING_SAND"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_LANDING_SNOW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_LANDING_SPOOKY"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_LANDING_STONE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_LANDING_WATER"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_STEP_DEFAULT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_STEP_GRASS"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_STEP_ICE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_STEP_METAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_STEP_SAND"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_STEP_SNOW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_STEP_SPOOKY"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_STEP_STONE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TERRAIN_STEP_WATER"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_THROW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "ACTION_TWIRL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_ATTACKED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_DIE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_DOH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_GROUND_POUND_WAH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_HAHA"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_HOO"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_HOOHOO"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_IMA_TIRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_JUMP_HOO"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_JUMP_WAH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_MAMA_MIA"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_ON_FIRE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_OOOF"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_PANTING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_PUNCH_HOO"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_PUNCH_WAH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_PUNCH_YAH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_SNORING1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_SNORING2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_SNORING3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_THROW_YAH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_UH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_UH2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_WAAAOOOW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_WAH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_WAHA"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_WHOA"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_YAH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_YAHOO"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_YAWNING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MARIO_YIPPEE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MOVING_FLYING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MOVING_LAVA_BURN"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Sound",
|
||||||
|
"properties": {
|
||||||
|
"SoundId": ""
|
||||||
|
},
|
||||||
|
"name": "MOVING_TERRAIN_SLIDE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Configuration",
|
||||||
|
"name": "ACTION_TERRAIN_JUMP"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Configuration",
|
||||||
|
"name": "ACTION_TERRAIN_LANDING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Configuration",
|
||||||
|
"name": "ACTION_TERRAIN_STEP"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Configuration",
|
||||||
|
"name": "MARIO_JUMP"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Configuration",
|
||||||
|
"attributes": {
|
||||||
|
"MARIO_WAHA": 1,
|
||||||
|
"MARIO_YAHOO": 3,
|
||||||
|
"MARIO_YIPPEE": 1
|
||||||
|
},
|
||||||
|
"name": "MARIO_YAHOO_WAHA_YIPPEE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Configuration",
|
||||||
|
"attributes": {
|
||||||
|
"MARIO_YAH": 1,
|
||||||
|
"MARIO_HOO": 1,
|
||||||
|
"MARIO_WAH": 1
|
||||||
|
},
|
||||||
|
"name": "MARIO_YAH_WAH_HOO"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
26
sm64/Enums/Action/Flags.lua
Normal file
26
sm64/Enums/Action/Flags.lua
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
STATIONARY = bit32.lshift(1, 9),
|
||||||
|
MOVING = bit32.lshift(1, 10),
|
||||||
|
AIR = bit32.lshift(1, 11),
|
||||||
|
INTANGIBLE = bit32.lshift(1, 12),
|
||||||
|
SWIMMING = bit32.lshift(1, 13),
|
||||||
|
METAL_WATER = bit32.lshift(1, 14),
|
||||||
|
SHORT_HITBOX = bit32.lshift(1, 15),
|
||||||
|
RIDING_SHELL = bit32.lshift(1, 16),
|
||||||
|
INVULNERABLE = bit32.lshift(1, 17),
|
||||||
|
BUTT_OR_STOMACH_SLIDE = bit32.lshift(1, 18),
|
||||||
|
DIVING = bit32.lshift(1, 19),
|
||||||
|
ON_POLE = bit32.lshift(1, 20),
|
||||||
|
HANGING = bit32.lshift(1, 21),
|
||||||
|
IDLE = bit32.lshift(1, 22),
|
||||||
|
ATTACKING = bit32.lshift(1, 23),
|
||||||
|
ALLOW_VERTICAL_WIND_ACTION = bit32.lshift(1, 24),
|
||||||
|
CONTROL_JUMP_HEIGHT = bit32.lshift(1, 25),
|
||||||
|
ALLOW_FIRST_PERSON = bit32.lshift(1, 26),
|
||||||
|
PAUSE_EXIT = bit32.lshift(1, 27),
|
||||||
|
SWIMMING_OR_FLYING = bit32.lshift(1, 28),
|
||||||
|
WATER_OR_TEXT = bit32.lshift(1, 29),
|
||||||
|
THROWING = bit32.lshift(1, 31),
|
||||||
|
}
|
15
sm64/Enums/Action/Groups.lua
Normal file
15
sm64/Enums/Action/Groups.lua
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
-- Group Flags
|
||||||
|
STATIONARY = bit32.lshift(0, 6),
|
||||||
|
MOVING = bit32.lshift(1, 6),
|
||||||
|
AIRBORNE = bit32.lshift(2, 6),
|
||||||
|
SUBMERGED = bit32.lshift(3, 6),
|
||||||
|
CUTSCENE = bit32.lshift(4, 6),
|
||||||
|
AUTOMATIC = bit32.lshift(5, 6),
|
||||||
|
OBJECT = bit32.lshift(6, 6),
|
||||||
|
|
||||||
|
-- Mask for capturing these Flags
|
||||||
|
GROUP_MASK = 0b_000000111000000,
|
||||||
|
}
|
250
sm64/Enums/Action/init.lua
Normal file
250
sm64/Enums/Action/init.lua
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
UNINITIALIZED = 0x00000000, -- (0x000)
|
||||||
|
|
||||||
|
-- group 0x000: stationary actions
|
||||||
|
IDLE = 0x0C400201, -- (0x001 | FLAG_STATIONARY | FLAG_IDLE | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
START_SLEEPING = 0x0C400202, -- (0x002 | FLAG_STATIONARY | FLAG_IDLE | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
SLEEPING = 0x0C000203, -- (0x003 | FLAG_STATIONARY | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
WAKING_UP = 0x0C000204, -- (0x004 | FLAG_STATIONARY | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
PANTING = 0x0C400205, -- (0x005 | FLAG_STATIONARY | FLAG_IDLE | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
HOLD_PANTING_UNUSED = 0x08000206, -- (0x006 | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
HOLD_IDLE = 0x08000207, -- (0x007 | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
HOLD_HEAVY_IDLE = 0x08000208, -- (0x008 | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
STANDING_AGAINST_WALL = 0x0C400209, -- (0x009 | FLAG_STATIONARY | FLAG_IDLE | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
COUGHING = 0x0C40020A, -- (0x00A | FLAG_STATIONARY | FLAG_IDLE | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
SHIVERING = 0x0C40020B, -- (0x00B | FLAG_STATIONARY | FLAG_IDLE | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
IN_QUICKSAND = 0x0002020D, -- (0x00D | FLAG_STATIONARY | FLAG_INVULNERABLE)
|
||||||
|
UNKNOWN_0002020E = 0x0002020E, -- (0x00E | FLAG_STATIONARY | FLAG_INVULNERABLE)
|
||||||
|
CROUCHING = 0x0C008220, -- (0x020 | FLAG_STATIONARY | FLAG_SHORT_HITBOX | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
START_CROUCHING = 0x0C008221, -- (0x021 | FLAG_STATIONARY | FLAG_SHORT_HITBOX | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
STOP_CROUCHING = 0x0C008222, -- (0x022 | FLAG_STATIONARY | FLAG_SHORT_HITBOX | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
START_CRAWLING = 0x0C008223, -- (0x023 | FLAG_STATIONARY | FLAG_SHORT_HITBOX | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
STOP_CRAWLING = 0x0C008224, -- (0x024 | FLAG_STATIONARY | FLAG_SHORT_HITBOX | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
SLIDE_KICK_SLIDE_STOP = 0x08000225, -- (0x025 | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
SHOCKWAVE_BOUNCE = 0x00020226, -- (0x026 | FLAG_STATIONARY | FLAG_INVULNERABLE)
|
||||||
|
FIRST_PERSON = 0x0C000227, -- (0x027 | FLAG_STATIONARY | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
BACKFLIP_LAND_STOP = 0x0800022F, -- (0x02F | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
JUMP_LAND_STOP = 0x0C000230, -- (0x030 | FLAG_STATIONARY | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
DOUBLE_JUMP_LAND_STOP = 0x0C000231, -- (0x031 | FLAG_STATIONARY | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
FREEFALL_LAND_STOP = 0x0C000232, -- (0x032 | FLAG_STATIONARY | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
SIDE_FLIP_LAND_STOP = 0x0C000233, -- (0x033 | FLAG_STATIONARY | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
HOLD_JUMP_LAND_STOP = 0x08000234, -- (0x034 | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
HOLD_FREEFALL_LAND_STOP = 0x08000235, -- (0x035 | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
AIR_THROW_LAND = 0x80000A36, -- (0x036 | FLAG_STATIONARY | FLAG_AIR | FLAG_THROWING)
|
||||||
|
TWIRL_LAND = 0x18800238, -- (0x038 | FLAG_STATIONARY | FLAG_ATTACKING | FLAG_PAUSE_EXIT | FLAG_SWIMMING_OR_FLYING)
|
||||||
|
LAVA_BOOST_LAND = 0x08000239, -- (0x039 | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
TRIPLE_JUMP_LAND_STOP = 0x0800023A, -- (0x03A | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
LONG_JUMP_LAND_STOP = 0x0800023B, -- (0x03B | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
GROUND_POUND_LAND = 0x0080023C, -- (0x03C | FLAG_STATIONARY | FLAG_ATTACKING)
|
||||||
|
BRAKING_STOP = 0x0C00023D, -- (0x03D | FLAG_STATIONARY | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
BUTT_SLIDE_STOP = 0x0C00023E, -- (0x03E | FLAG_STATIONARY | FLAG_ALLOW_FIRST_PERSON | FLAG_PAUSE_EXIT)
|
||||||
|
HOLD_BUTT_SLIDE_STOP = 0x0800043F, -- (0x03F | FLAG_MOVING | FLAG_PAUSE_EXIT)
|
||||||
|
|
||||||
|
-- group 0x040: moving (ground) actions
|
||||||
|
WALKING = 0x04000440, -- (0x040 | FLAG_MOVING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
HOLD_WALKING = 0x00000442, -- (0x042 | FLAG_MOVING)
|
||||||
|
TURNING_AROUND = 0x00000443, -- (0x043 | FLAG_MOVING)
|
||||||
|
FINISH_TURNING_AROUND = 0x00000444, -- (0x044 | FLAG_MOVING)
|
||||||
|
BRAKING = 0x04000445, -- (0x045 | FLAG_MOVING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
RIDING_SHELL_GROUND = 0x20810446, -- (0x046 | FLAG_MOVING | FLAG_RIDING_SHELL | FLAG_ATTACKING | FLAG_WATER_OR_TEXT)
|
||||||
|
HOLD_HEAVY_WALKING = 0x00000447, -- (0x047 | FLAG_MOVING)
|
||||||
|
CRAWLING = 0x04008448, -- (0x048 | FLAG_MOVING | FLAG_SHORT_HITBOX | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
BURNING_GROUND = 0x00020449, -- (0x049 | FLAG_MOVING | FLAG_INVULNERABLE)
|
||||||
|
DECELERATING = 0x0400044A, -- (0x04A | FLAG_MOVING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
HOLD_DECELERATING = 0x0000044B, -- (0x04B | FLAG_MOVING)
|
||||||
|
BEGIN_SLIDING = 0x00000050, -- (0x050)
|
||||||
|
HOLD_BEGIN_SLIDING = 0x00000051, -- (0x051)
|
||||||
|
BUTT_SLIDE = 0x00840452, -- (0x052 | FLAG_MOVING | FLAG_BUTT_OR_STOMACH_SLIDE | FLAG_ATTACKING)
|
||||||
|
STOMACH_SLIDE = 0x008C0453, -- (0x053 | FLAG_MOVING | FLAG_BUTT_OR_STOMACH_SLIDE | FLAG_DIVING | FLAG_ATTACKING)
|
||||||
|
HOLD_BUTT_SLIDE = 0x00840454, -- (0x054 | FLAG_MOVING | FLAG_BUTT_OR_STOMACH_SLIDE | FLAG_ATTACKING)
|
||||||
|
HOLD_STOMACH_SLIDE = 0x008C0455, -- (0x055 | FLAG_MOVING | FLAG_BUTT_OR_STOMACH_SLIDE | FLAG_DIVING | FLAG_ATTACKING)
|
||||||
|
DIVE_SLIDE = 0x00880456, -- (0x056 | FLAG_MOVING | FLAG_DIVING | FLAG_ATTACKING)
|
||||||
|
MOVE_PUNCHING = 0x00800457, -- (0x057 | FLAG_MOVING | FLAG_ATTACKING)
|
||||||
|
CROUCH_SLIDE = 0x04808459, -- (0x059 | FLAG_MOVING | FLAG_SHORT_HITBOX | FLAG_ATTACKING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
SLIDE_KICK_SLIDE = 0x0080045A, -- (0x05A | FLAG_MOVING | FLAG_ATTACKING)
|
||||||
|
HARD_BACKWARD_GROUND_KB = 0x00020460, -- (0x060 | FLAG_MOVING | FLAG_INVULNERABLE)
|
||||||
|
HARD_FORWARD_GROUND_KB = 0x00020461, -- (0x061 | FLAG_MOVING | FLAG_INVULNERABLE)
|
||||||
|
BACKWARD_GROUND_KB = 0x00020462, -- (0x062 | FLAG_MOVING | FLAG_INVULNERABLE)
|
||||||
|
FORWARD_GROUND_KB = 0x00020463, -- (0x063 | FLAG_MOVING | FLAG_INVULNERABLE)
|
||||||
|
SOFT_BACKWARD_GROUND_KB = 0x00020464, -- (0x064 | FLAG_MOVING | FLAG_INVULNERABLE)
|
||||||
|
SOFT_FORWARD_GROUND_KB = 0x00020465, -- (0x065 | FLAG_MOVING | FLAG_INVULNERABLE)
|
||||||
|
GROUND_BONK = 0x00020466, -- (0x066 | FLAG_MOVING | FLAG_INVULNERABLE)
|
||||||
|
DEATH_EXIT_LAND = 0x00020467, -- (0x067 | FLAG_MOVING | FLAG_INVULNERABLE)
|
||||||
|
JUMP_LAND = 0x04000470, -- (0x070 | FLAG_MOVING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
FREEFALL_LAND = 0x04000471, -- (0x071 | FLAG_MOVING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
DOUBLE_JUMP_LAND = 0x04000472, -- (0x072 | FLAG_MOVING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
SIDE_FLIP_LAND = 0x04000473, -- (0x073 | FLAG_MOVING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
HOLD_JUMP_LAND = 0x00000474, -- (0x074 | FLAG_MOVING)
|
||||||
|
HOLD_FREEFALL_LAND = 0x00000475, -- (0x075 | FLAG_MOVING)
|
||||||
|
QUICKSAND_JUMP_LAND = 0x00000476, -- (0x076 | FLAG_MOVING)
|
||||||
|
HOLD_QUICKSAND_JUMP_LAND = 0x00000477, -- (0x077 | FLAG_MOVING)
|
||||||
|
TRIPLE_JUMP_LAND = 0x04000478, -- (0x078 | FLAG_MOVING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
LONG_JUMP_LAND = 0x00000479, -- (0x079 | FLAG_MOVING)
|
||||||
|
BACKFLIP_LAND = 0x0400047A, -- (0x07A | FLAG_MOVING | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
|
||||||
|
-- group 0x080: airborne actions
|
||||||
|
JUMP = 0x03000880, -- (0x080 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
DOUBLE_JUMP = 0x03000881, -- (0x081 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
TRIPLE_JUMP = 0x01000882, -- (0x082 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
BACKFLIP = 0x01000883, -- (0x083 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
STEEP_JUMP = 0x03000885, -- (0x085 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
WALL_KICK_AIR = 0x03000886, -- (0x086 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
SIDE_FLIP = 0x01000887, -- (0x087 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
LONG_JUMP = 0x03000888, -- (0x088 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
WATER_JUMP = 0x01000889, -- (0x089 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
DIVE = 0x0188088A, -- (0x08A | FLAG_AIR | FLAG_DIVING | FLAG_ATTACKING | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
FREEFALL = 0x0100088C, -- (0x08C | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
TOP_OF_POLE_JUMP = 0x0300088D, -- (0x08D | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
BUTT_SLIDE_AIR = 0x0300088E, -- (0x08E | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
FLYING_TRIPLE_JUMP = 0x03000894, -- (0x094 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
SHOT_FROM_CANNON = 0x00880898, -- (0x098 | FLAG_AIR | FLAG_DIVING | FLAG_ATTACKING)
|
||||||
|
FLYING = 0x10880899, -- (0x099 | FLAG_AIR | FLAG_DIVING | FLAG_ATTACKING | FLAG_SWIMMING_OR_FLYING)
|
||||||
|
RIDING_SHELL_JUMP = 0x0281089A, -- (0x09A | FLAG_AIR | FLAG_RIDING_SHELL | FLAG_ATTACKING | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
RIDING_SHELL_FALL = 0x0081089B, -- (0x09B | FLAG_AIR | FLAG_RIDING_SHELL | FLAG_ATTACKING)
|
||||||
|
VERTICAL_WIND = 0x1008089C, -- (0x09C | FLAG_AIR | FLAG_DIVING | FLAG_SWIMMING_OR_FLYING)
|
||||||
|
HOLD_JUMP = 0x030008A0, -- (0x0A0 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
HOLD_FREEFALL = 0x010008A1, -- (0x0A1 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
HOLD_BUTT_SLIDE_AIR = 0x010008A2, -- (0x0A2 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
HOLD_WATER_JUMP = 0x010008A3, -- (0x0A3 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
TWIRLING = 0x108008A4, -- (0x0A4 | FLAG_AIR | FLAG_ATTACKING | FLAG_SWIMMING_OR_FLYING)
|
||||||
|
FORWARD_ROLLOUT = 0x010008A6, -- (0x0A6 | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
AIR_HIT_WALL = 0x000008A7, -- (0x0A7 | FLAG_AIR)
|
||||||
|
RIDING_HOOT = 0x000004A8, -- (0x0A8 | FLAG_MOVING)
|
||||||
|
GROUND_POUND = 0x008008A9, -- (0x0A9 | FLAG_AIR | FLAG_ATTACKING)
|
||||||
|
SLIDE_KICK = 0x018008AA, -- (0x0AA | FLAG_AIR | FLAG_ATTACKING | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
AIR_THROW = 0x830008AB, -- (0x0AB | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT | FLAG_THROWING)
|
||||||
|
JUMP_KICK = 0x018008AC, -- (0x0AC | FLAG_AIR | FLAG_ATTACKING | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
BACKWARD_ROLLOUT = 0x010008AD, -- (0x0AD | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
CRAZY_BOX_BOUNCE = 0x000008AE, -- (0x0AE | FLAG_AIR)
|
||||||
|
SPECIAL_TRIPLE_JUMP = 0x030008AF, -- (0x0AF | FLAG_AIR | FLAG_ALLOW_VERTICAL_WIND_ACTION | FLAG_CONTROL_JUMP_HEIGHT)
|
||||||
|
BACKWARD_AIR_KB = 0x010208B0, -- (0x0B0 | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
FORWARD_AIR_KB = 0x010208B1, -- (0x0B1 | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
HARD_FORWARD_AIR_KB = 0x010208B2, -- (0x0B2 | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
HARD_BACKWARD_AIR_KB = 0x010208B3, -- (0x0B3 | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
BURNING_JUMP = 0x010208B4, -- (0x0B4 | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
BURNING_FALL = 0x010208B5, -- (0x0B5 | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
SOFT_BONK = 0x010208B6, -- (0x0B6 | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
LAVA_BOOST = 0x010208B7, -- (0x0B7 | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
GETTING_BLOWN = 0x010208B8, -- (0x0B8 | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
THROWN_FORWARD = 0x010208BD, -- (0x0BD | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
THROWN_BACKWARD = 0x010208BE, -- (0x0BE | FLAG_AIR | FLAG_INVULNERABLE | FLAG_ALLOW_VERTICAL_WIND_ACTION)
|
||||||
|
|
||||||
|
-- group 0x0C0: submerged actions
|
||||||
|
WATER_IDLE = 0x380022C0, -- (0x0C0 | FLAG_STATIONARY | FLAG_SWIMMING | FLAG_PAUSE_EXIT | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
HOLD_WATER_IDLE = 0x380022C1, -- (0x0C1 | FLAG_STATIONARY | FLAG_SWIMMING | FLAG_PAUSE_EXIT | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
WATER_ACTION_END = 0x300022C2, -- (0x0C2 | FLAG_STATIONARY | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
HOLD_WATER_ACTION_END = 0x300022C3, -- (0x0C3 | FLAG_STATIONARY | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
DROWNING = 0x300032C4, -- (0x0C4 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
BACKWARD_WATER_KB = 0x300222C5, -- (0x0C5 | FLAG_STATIONARY | FLAG_SWIMMING | FLAG_INVULNERABLE | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
FORWARD_WATER_KB = 0x300222C6, -- (0x0C6 | FLAG_STATIONARY | FLAG_SWIMMING | FLAG_INVULNERABLE | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
WATER_DEATH = 0x300032C7, -- (0x0C7 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
WATER_SHOCKED = 0x300222C8, -- (0x0C8 | FLAG_STATIONARY | FLAG_SWIMMING | FLAG_INVULNERABLE | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
BREASTSTROKE = 0x300024D0, -- (0x0D0 | FLAG_MOVING | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
SWIMMING_END = 0x300024D1, -- (0x0D1 | FLAG_MOVING | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
FLUTTER_KICK = 0x300024D2, -- (0x0D2 | FLAG_MOVING | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
HOLD_BREASTSTROKE = 0x300024D3, -- (0x0D3 | FLAG_MOVING | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
HOLD_SWIMMING_END = 0x300024D4, -- (0x0D4 | FLAG_MOVING | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
HOLD_FLUTTER_KICK = 0x300024D5, -- (0x0D5 | FLAG_MOVING | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
WATER_SHELL_SWIMMING = 0x300024D6, -- (0x0D6 | FLAG_MOVING | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
WATER_THROW = 0x300024E0, -- (0x0E0 | FLAG_MOVING | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
WATER_PUNCH = 0x300024E1, -- (0x0E1 | FLAG_MOVING | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
WATER_PLUNGE = 0x300022E2, -- (0x0E2 | FLAG_STATIONARY | FLAG_SWIMMING | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
CAUGHT_IN_WHIRLPOOL = 0x300222E3, -- (0x0E3 | FLAG_STATIONARY | FLAG_SWIMMING | FLAG_INVULNERABLE | FLAG_SWIMMING_OR_FLYING | FLAG_WATER_OR_TEXT)
|
||||||
|
METAL_WATER_STANDING = 0x080042F0, -- (0x0F0 | FLAG_STATIONARY | FLAG_METAL_WATER | FLAG_PAUSE_EXIT)
|
||||||
|
HOLD_METAL_WATER_STANDING = 0x080042F1, -- (0x0F1 | FLAG_STATIONARY | FLAG_METAL_WATER | FLAG_PAUSE_EXIT)
|
||||||
|
METAL_WATER_WALKING = 0x000044F2, -- (0x0F2 | FLAG_MOVING | FLAG_METAL_WATER)
|
||||||
|
HOLD_METAL_WATER_WALKING = 0x000044F3, -- (0x0F3 | FLAG_MOVING | FLAG_METAL_WATER)
|
||||||
|
METAL_WATER_FALLING = 0x000042F4, -- (0x0F4 | FLAG_STATIONARY | FLAG_METAL_WATER)
|
||||||
|
HOLD_METAL_WATER_FALLING = 0x000042F5, -- (0x0F5 | FLAG_STATIONARY | FLAG_METAL_WATER)
|
||||||
|
METAL_WATER_FALL_LAND = 0x000042F6, -- (0x0F6 | FLAG_STATIONARY | FLAG_METAL_WATER)
|
||||||
|
HOLD_METAL_WATER_FALL_LAND = 0x000042F7, -- (0x0F7 | FLAG_STATIONARY | FLAG_METAL_WATER)
|
||||||
|
METAL_WATER_JUMP = 0x000044F8, -- (0x0F8 | FLAG_MOVING | FLAG_METAL_WATER)
|
||||||
|
HOLD_METAL_WATER_JUMP = 0x000044F9, -- (0x0F9 | FLAG_MOVING | FLAG_METAL_WATER)
|
||||||
|
METAL_WATER_JUMP_LAND = 0x000044FA, -- (0x0FA | FLAG_MOVING | FLAG_METAL_WATER)
|
||||||
|
HOLD_METAL_WATER_JUMP_LAND = 0x000044FB, -- (0x0FB | FLAG_MOVING | FLAG_METAL_WATER)
|
||||||
|
|
||||||
|
-- group 0x100: cutscene actions
|
||||||
|
DISAPPEARED = 0x00001300, -- (0x100 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
INTRO_CUTSCENE = 0x04001301, -- (0x101 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_ALLOW_FIRST_PERSON)
|
||||||
|
STAR_DANCE_EXIT = 0x00001302, -- (0x102 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
STAR_DANCE_WATER = 0x00001303, -- (0x103 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
FALL_AFTER_STAR_GRAB = 0x00001904, -- (0x104 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
READING_AUTOMATIC_DIALOG = 0x20001305, -- (0x105 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_WATER_OR_TEXT)
|
||||||
|
READING_NPC_DIALOG = 0x20001306, -- (0x106 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_WATER_OR_TEXT)
|
||||||
|
STAR_DANCE_NO_EXIT = 0x00001307, -- (0x107 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
READING_SIGN = 0x00001308, -- (0x108 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
JUMBO_STAR_CUTSCENE = 0x00001909, -- (0x109 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
WAITING_FOR_DIALOG = 0x0000130A, -- (0x10A | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
DEBUG_FREE_MOVE = 0x0000130F, -- (0x10F | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
STANDING_DEATH = 0x00021311, -- (0x111 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_INVULNERABLE)
|
||||||
|
QUICKSAND_DEATH = 0x00021312, -- (0x112 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_INVULNERABLE)
|
||||||
|
ELECTROCUTION = 0x00021313, -- (0x113 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_INVULNERABLE)
|
||||||
|
SUFFOCATION = 0x00021314, -- (0x114 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_INVULNERABLE)
|
||||||
|
DEATH_ON_STOMACH = 0x00021315, -- (0x115 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_INVULNERABLE)
|
||||||
|
DEATH_ON_BACK = 0x00021316, -- (0x116 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_INVULNERABLE)
|
||||||
|
EATEN_BY_BUBBA = 0x00021317, -- (0x117 | FLAG_STATIONARY | FLAG_INTANGIBLE | FLAG_INVULNERABLE)
|
||||||
|
END_PEACH_CUTSCENE = 0x00001918, -- (0x118 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
CREDITS_CUTSCENE = 0x00001319, -- (0x119 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
END_WAVING_CUTSCENE = 0x0000131A, -- (0x11A | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
PULLING_DOOR = 0x00001320, -- (0x120 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
PUSHING_DOOR = 0x00001321, -- (0x121 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
WARP_DOOR_SPAWN = 0x00001322, -- (0x122 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
EMERGE_FROM_PIPE = 0x00001923, -- (0x123 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
SPAWN_SPIN_AIRBORNE = 0x00001924, -- (0x124 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
SPAWN_SPIN_LANDING = 0x00001325, -- (0x125 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
EXIT_AIRBORNE = 0x00001926, -- (0x126 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
EXIT_LAND_SAVE_DIALOG = 0x00001327, -- (0x127 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
DEATH_EXIT = 0x00001928, -- (0x128 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
UNUSED_DEATH_EXIT = 0x00001929, -- (0x129 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
FALLING_DEATH_EXIT = 0x0000192A, -- (0x12A | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
SPECIAL_EXIT_AIRBORNE = 0x0000192B, -- (0x12B | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
SPECIAL_DEATH_EXIT = 0x0000192C, -- (0x12C | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
FALLING_EXIT_AIRBORNE = 0x0000192D, -- (0x12D | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
UNLOCKING_KEY_DOOR = 0x0000132E, -- (0x12E | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
UNLOCKING_STAR_DOOR = 0x0000132F, -- (0x12F | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
ENTERING_STAR_DOOR = 0x00001331, -- (0x131 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
SPAWN_NO_SPIN_AIRBORNE = 0x00001932, -- (0x132 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
SPAWN_NO_SPIN_LANDING = 0x00001333, -- (0x133 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
BBH_ENTER_JUMP = 0x00001934, -- (0x134 | FLAG_AIR | FLAG_INTANGIBLE)
|
||||||
|
BBH_ENTER_SPIN = 0x00001535, -- (0x135 | FLAG_MOVING | FLAG_INTANGIBLE)
|
||||||
|
TELEPORT_FADE_OUT = 0x00001336, -- (0x136 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
TELEPORT_FADE_IN = 0x00001337, -- (0x137 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
SHOCKED = 0x00020338, -- (0x138 | FLAG_STATIONARY | FLAG_INVULNERABLE)
|
||||||
|
SQUISHED = 0x00020339, -- (0x139 | FLAG_STATIONARY | FLAG_INVULNERABLE)
|
||||||
|
HEAD_STUCK_IN_GROUND = 0x0002033A, -- (0x13A | FLAG_STATIONARY | FLAG_INVULNERABLE)
|
||||||
|
BUTT_STUCK_IN_GROUND = 0x0002033B, -- (0x13B | FLAG_STATIONARY | FLAG_INVULNERABLE)
|
||||||
|
FEET_STUCK_IN_GROUND = 0x0002033C, -- (0x13C | FLAG_STATIONARY | FLAG_INVULNERABLE)
|
||||||
|
PUTTING_ON_CAP = 0x0000133D, -- (0x13D | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
|
||||||
|
-- group 0x140: "automatic" actions
|
||||||
|
HOLDING_POLE = 0x08100340, -- (0x140 | FLAG_STATIONARY | FLAG_ON_POLE | FLAG_PAUSE_EXIT)
|
||||||
|
GRAB_POLE_SLOW = 0x00100341, -- (0x141 | FLAG_STATIONARY | FLAG_ON_POLE)
|
||||||
|
GRAB_POLE_FAST = 0x00100342, -- (0x142 | FLAG_STATIONARY | FLAG_ON_POLE)
|
||||||
|
CLIMBING_POLE = 0x00100343, -- (0x143 | FLAG_STATIONARY | FLAG_ON_POLE)
|
||||||
|
TOP_OF_POLE_TRANSITION = 0x00100344, -- (0x144 | FLAG_STATIONARY | FLAG_ON_POLE)
|
||||||
|
TOP_OF_POLE = 0x00100345, -- (0x145 | FLAG_STATIONARY | FLAG_ON_POLE)
|
||||||
|
START_HANGING = 0x08200348, -- (0x148 | FLAG_STATIONARY | FLAG_HANGING | FLAG_PAUSE_EXIT)
|
||||||
|
HANGING = 0x00200349, -- (0x149 | FLAG_STATIONARY | FLAG_HANGING)
|
||||||
|
HANG_MOVING = 0x0020054A, -- (0x14A | FLAG_MOVING | FLAG_HANGING)
|
||||||
|
LEDGE_GRAB = 0x0800034B, -- (0x14B | FLAG_STATIONARY | FLAG_PAUSE_EXIT)
|
||||||
|
LEDGE_CLIMB_SLOW = 0x0000054C, -- (0x14C | FLAG_MOVING)
|
||||||
|
LEDGE_CLIMB_DOWN = 0x0000054D, -- (0x14D | FLAG_MOVING)
|
||||||
|
LEDGE_CLIMB_FAST = 0x0000054E, -- (0x14E | FLAG_MOVING)
|
||||||
|
GRABBED = 0x00020370, -- (0x170 | FLAG_STATIONARY | FLAG_INVULNERABLE)
|
||||||
|
IN_CANNON = 0x00001371, -- (0x171 | FLAG_STATIONARY | FLAG_INTANGIBLE)
|
||||||
|
TORNADO_TWIRLING = 0x10020372, -- (0x172 | FLAG_STATIONARY | FLAG_INVULNERABLE | FLAG_SWIMMING_OR_FLYING)
|
||||||
|
|
||||||
|
-- group 0x180: object actions
|
||||||
|
PUNCHING = 0x00800380, -- (0x180 | FLAG_STATIONARY | FLAG_ATTACKING)
|
||||||
|
PICKING_UP = 0x00000383, -- (0x183 | FLAG_STATIONARY)
|
||||||
|
DIVE_PICKING_UP = 0x00000385, -- (0x185 | FLAG_STATIONARY)
|
||||||
|
STOMACH_SLIDE_STOP = 0x00000386, -- (0x186 | FLAG_STATIONARY)
|
||||||
|
PLACING_DOWN = 0x00000387, -- (0x187 | FLAG_STATIONARY)
|
||||||
|
THROWING = 0x80000588, -- (0x188 | FLAG_MOVING | FLAG_THROWING)
|
||||||
|
HEAVY_THROW = 0x80000589, -- (0x189 | FLAG_MOVING | FLAG_THROWING)
|
||||||
|
PICKING_UP_BOWSER = 0x00000390, -- (0x190 | FLAG_STATIONARY)
|
||||||
|
HOLDING_BOWSER = 0x00000391, -- (0x191 | FLAG_STATIONARY)
|
||||||
|
RELEASING_BOWSER = 0x00000392, -- (0x192 | FLAG_STATIONARY)
|
||||||
|
}
|
18
sm64/Enums/Buttons.lua
Normal file
18
sm64/Enums/Buttons.lua
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
A_BUTTON = 0x8000,
|
||||||
|
B_BUTTON = 0x4000,
|
||||||
|
L_TRIG = 0x0020,
|
||||||
|
R_TRIG = 0x0010,
|
||||||
|
Z_TRIG = 0x2000,
|
||||||
|
START_BUTTON = 0x1000,
|
||||||
|
U_JPAD = 0x0800,
|
||||||
|
L_JPAD = 0x0200,
|
||||||
|
R_JPAD = 0x0100,
|
||||||
|
D_JPAD = 0x0400,
|
||||||
|
U_CBUTTONS = 0x0008,
|
||||||
|
L_CBUTTONS = 0x0002,
|
||||||
|
R_CBUTTONS = 0x0001,
|
||||||
|
D_CBUTTONS = 0x0004,
|
||||||
|
}
|
20
sm64/Enums/FloorType.lua
Normal file
20
sm64/Enums/FloorType.lua
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
NONZERO_ANALOG = 0x0001,
|
||||||
|
A_PRESSED = 0x0002,
|
||||||
|
OFF_FLOOR = 0x0004,
|
||||||
|
ABOVE_SLIDE = 0x0008,
|
||||||
|
FIRST_PERSON = 0x0010,
|
||||||
|
UNKNOWN_5 = 0x0020,
|
||||||
|
SQUISHED = 0x0040,
|
||||||
|
A_DOWN = 0x0080,
|
||||||
|
IN_POISON_GAS = 0x0100,
|
||||||
|
IN_WATER = 0x0200,
|
||||||
|
STOMPED = 0x0400,
|
||||||
|
INTERACT_OBJ_GRABBABLE = 0x0800,
|
||||||
|
UNKNOWN_12 = 0x1000,
|
||||||
|
B_PRESSED = 0x2000,
|
||||||
|
Z_DOWN = 0x4000,
|
||||||
|
Z_PRESSED = 0x8000,
|
||||||
|
}
|
20
sm64/Enums/InputFlags.lua
Normal file
20
sm64/Enums/InputFlags.lua
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
NONZERO_ANALOG = 0x0001,
|
||||||
|
A_PRESSED = 0x0002,
|
||||||
|
OFF_FLOOR = 0x0004,
|
||||||
|
ABOVE_SLIDE = 0x0008,
|
||||||
|
FIRST_PERSON = 0x0010,
|
||||||
|
UNKNOWN_5 = 0x0020,
|
||||||
|
SQUISHED = 0x0040,
|
||||||
|
A_DOWN = 0x0080,
|
||||||
|
IN_POISON_GAS = 0x0100,
|
||||||
|
IN_WATER = 0x0200,
|
||||||
|
STOMPED = 0x0400,
|
||||||
|
INTERACT_OBJ_GRABBABLE = 0x0800,
|
||||||
|
UNKNOWN_12 = 0x1000,
|
||||||
|
B_PRESSED = 0x2000,
|
||||||
|
Z_DOWN = 0x4000,
|
||||||
|
Z_PRESSED = 0x8000,
|
||||||
|
}
|
9
sm64/Enums/Mario/Cap.lua
Normal file
9
sm64/Enums/Mario/Cap.lua
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
DEFAULT_CAP_ON = 0,
|
||||||
|
DEFAULT_CAP_OFF = 1,
|
||||||
|
|
||||||
|
WING_CAP_ON = 2,
|
||||||
|
WING_CAP_OFF = 3,
|
||||||
|
}
|
11
sm64/Enums/Mario/Eyes.lua
Normal file
11
sm64/Enums/Mario/Eyes.lua
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
BLINK = 0,
|
||||||
|
OPEN = 1,
|
||||||
|
|
||||||
|
HALF_CLOSED = 2,
|
||||||
|
CLOSED = 3,
|
||||||
|
|
||||||
|
DEAD = 4,
|
||||||
|
}
|
24
sm64/Enums/Mario/Flags.lua
Normal file
24
sm64/Enums/Mario/Flags.lua
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local MarioFlags = {
|
||||||
|
NORMAL_CAP = 0x00000001,
|
||||||
|
VANISH_CAP = 0x00000002,
|
||||||
|
METAL_CAP = 0x00000004,
|
||||||
|
WING_CAP = 0x00000008,
|
||||||
|
CAP_ON_HEAD = 0x00000010,
|
||||||
|
CAP_IN_HAND = 0x00000020,
|
||||||
|
METAL_SHOCK = 0x00000040,
|
||||||
|
TELEPORTING = 0x00000080,
|
||||||
|
MOVING_UP_IN_AIR = 0x00000100,
|
||||||
|
ACTION_SOUND_PLAYED = 0x00010000,
|
||||||
|
MARIO_SOUND_PLAYED = 0x00020000,
|
||||||
|
FALLING_FAR = 0x00040000,
|
||||||
|
PUNCHING = 0x00100000,
|
||||||
|
KICKING = 0x00200000,
|
||||||
|
TRIPPING = 0x00400000,
|
||||||
|
}
|
||||||
|
|
||||||
|
MarioFlags.SPECIAL_CAPS = MarioFlags.VANISH_CAP + MarioFlags.METAL_CAP + MarioFlags.WING_CAP
|
||||||
|
MarioFlags.CAPS = MarioFlags.NORMAL_CAP + MarioFlags.SPECIAL_CAPS
|
||||||
|
|
||||||
|
return MarioFlags
|
10
sm64/Enums/Mario/Hands.lua
Normal file
10
sm64/Enums/Mario/Hands.lua
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
FISTS = 0,
|
||||||
|
OPEN = 1,
|
||||||
|
PEACE_SIGN = 2,
|
||||||
|
HOLDING_CAP = 3,
|
||||||
|
HOLDING_WING_CAP = 4,
|
||||||
|
RIGHT_OPEN = 5,
|
||||||
|
}
|
19
sm64/Enums/Mario/Input.lua
Normal file
19
sm64/Enums/Mario/Input.lua
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
NONZERO_ANALOG = 0x0001,
|
||||||
|
A_PRESSED = 0x0002,
|
||||||
|
OFF_FLOOR = 0x0004,
|
||||||
|
ABOVE_SLIDE = 0x0008,
|
||||||
|
FIRST_PERSON = 0x0010,
|
||||||
|
UNKNOWN_5 = 0x0020,
|
||||||
|
SQUISHED = 0x0040,
|
||||||
|
A_DOWN = 0x0080,
|
||||||
|
IN_POISON_GAS = 0x0100,
|
||||||
|
IN_WATER = 0x0200,
|
||||||
|
STOMPED = 0x0400,
|
||||||
|
INTERACT_OBJ_GRABBABLE = 0x0800,
|
||||||
|
B_PRESSED = 0x2000,
|
||||||
|
Z_DOWN = 0x4000,
|
||||||
|
Z_PRESSED = 0x8000,
|
||||||
|
}
|
7
sm64/Enums/ModelFlags.lua
Normal file
7
sm64/Enums/ModelFlags.lua
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
METAL = 0x1,
|
||||||
|
INVISIBLE = 0x2,
|
||||||
|
NOISE_ALPHA = 0x4,
|
||||||
|
}
|
22
sm64/Enums/ParticleFlags.lua
Normal file
22
sm64/Enums/ParticleFlags.lua
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
DUST = bit32.lshift(1, 0),
|
||||||
|
VERTICAL_STAR = bit32.lshift(1, 1),
|
||||||
|
SPARKLES = bit32.lshift(1, 3),
|
||||||
|
HORIZONTAL_STAR = bit32.lshift(1, 4),
|
||||||
|
BUBBLE = bit32.lshift(1, 5),
|
||||||
|
WATER_SPLASH = bit32.lshift(1, 6),
|
||||||
|
IDLE_WATER_WAVE = bit32.lshift(1, 7),
|
||||||
|
SHALLOW_WATER_WAVE = bit32.lshift(1, 8),
|
||||||
|
PLUNGE_BUBBLE = bit32.lshift(1, 9),
|
||||||
|
WAVE_TRAIL = bit32.lshift(1, 10),
|
||||||
|
FIRE = bit32.lshift(1, 11),
|
||||||
|
SHALLOW_WATER_SPLASH = bit32.lshift(1, 12),
|
||||||
|
LEAF = bit32.lshift(1, 13),
|
||||||
|
SNOW = bit32.lshift(1, 14),
|
||||||
|
DIRT = bit32.lshift(1, 15),
|
||||||
|
MIST_CIRCLE = bit32.lshift(1, 16),
|
||||||
|
BREATH = bit32.lshift(1, 17),
|
||||||
|
TRIANGLE = bit32.lshift(1, 18),
|
||||||
|
}
|
13
sm64/Enums/Steps/Air.lua
Normal file
13
sm64/Enums/Steps/Air.lua
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
NONE = 0,
|
||||||
|
LANDED = 1,
|
||||||
|
HIT_WALL = 2,
|
||||||
|
GRABBED_LEDGE = 3,
|
||||||
|
GRABBED_CEILING = 4,
|
||||||
|
HIT_LAVA_WALL = 6,
|
||||||
|
|
||||||
|
CHECK_LEDGE_GRAB = 1,
|
||||||
|
CHECK_HANG = 2,
|
||||||
|
}
|
9
sm64/Enums/Steps/Ground.lua
Normal file
9
sm64/Enums/Steps/Ground.lua
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
LEFT_GROUND = 0,
|
||||||
|
NONE = 1,
|
||||||
|
HIT_WALL = 2,
|
||||||
|
HIT_WALL_STOP_QSTEPS = 3,
|
||||||
|
HIT_WALL_CONTINUE_QSTEPS = 4,
|
||||||
|
}
|
9
sm64/Enums/Steps/Water.lua
Normal file
9
sm64/Enums/Steps/Water.lua
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
NONE = 0,
|
||||||
|
HIT_FLOOR = 1,
|
||||||
|
HIT_CEILING = 2,
|
||||||
|
CANCELLED = 3,
|
||||||
|
HIT_WALL = 4,
|
||||||
|
}
|
8
sm64/Enums/SurfaceClass.lua
Normal file
8
sm64/Enums/SurfaceClass.lua
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
return {
|
||||||
|
DEFAULT = 0x0000,
|
||||||
|
VERY_SLIPPERY = 0x0013,
|
||||||
|
SLIPPERY = 0x0014,
|
||||||
|
NOT_SLIPPERY = 0x0015,
|
||||||
|
}
|
50
sm64/Enums/TerrainType.lua
Normal file
50
sm64/Enums/TerrainType.lua
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local TerrainType = {
|
||||||
|
DEFAULT = 0,
|
||||||
|
GRASS = 1,
|
||||||
|
WATER = 2,
|
||||||
|
STONE = 3,
|
||||||
|
SPOOKY = 4,
|
||||||
|
SNOW = 5,
|
||||||
|
ICE = 6,
|
||||||
|
SAND = 7,
|
||||||
|
METAL = 8,
|
||||||
|
}
|
||||||
|
|
||||||
|
TerrainType.FROM_MATERIAL = {
|
||||||
|
[Enum.Material.Mud] = TerrainType.GRASS,
|
||||||
|
[Enum.Material.Grass] = TerrainType.GRASS,
|
||||||
|
[Enum.Material.Ground] = TerrainType.GRASS,
|
||||||
|
[Enum.Material.LeafyGrass] = TerrainType.GRASS,
|
||||||
|
|
||||||
|
[Enum.Material.Ice] = TerrainType.ICE,
|
||||||
|
[Enum.Material.Marble] = TerrainType.ICE,
|
||||||
|
[Enum.Material.Glacier] = TerrainType.ICE,
|
||||||
|
|
||||||
|
[Enum.Material.Wood] = TerrainType.SPOOKY,
|
||||||
|
[Enum.Material.WoodPlanks] = TerrainType.SPOOKY,
|
||||||
|
|
||||||
|
[Enum.Material.Foil] = TerrainType.METAL,
|
||||||
|
[Enum.Material.Metal] = TerrainType.METAL,
|
||||||
|
[Enum.Material.DiamondPlate] = TerrainType.METAL,
|
||||||
|
[Enum.Material.CorrodedMetal] = TerrainType.METAL,
|
||||||
|
|
||||||
|
[Enum.Material.Rock] = TerrainType.STONE,
|
||||||
|
[Enum.Material.Salt] = TerrainType.STONE,
|
||||||
|
[Enum.Material.Brick] = TerrainType.STONE,
|
||||||
|
[Enum.Material.Slate] = TerrainType.STONE,
|
||||||
|
[Enum.Material.Basalt] = TerrainType.STONE,
|
||||||
|
[Enum.Material.Pebble] = TerrainType.STONE,
|
||||||
|
[Enum.Material.Granite] = TerrainType.STONE,
|
||||||
|
[Enum.Material.Sandstone] = TerrainType.STONE,
|
||||||
|
[Enum.Material.Cobblestone] = TerrainType.STONE,
|
||||||
|
[Enum.Material.CrackedLava] = TerrainType.STONE,
|
||||||
|
|
||||||
|
[Enum.Material.Snow] = TerrainType.SNOW,
|
||||||
|
[Enum.Material.Sand] = TerrainType.SAND,
|
||||||
|
[Enum.Material.Water] = TerrainType.WATER,
|
||||||
|
[Enum.Material.Fabric] = TerrainType.SNOW,
|
||||||
|
}
|
||||||
|
|
||||||
|
return TerrainType
|
42
sm64/Enums/init.lua
Normal file
42
sm64/Enums/init.lua
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local Enums = {
|
||||||
|
Action = require(script.Action),
|
||||||
|
Buttons = require(script.Buttons),
|
||||||
|
ActionFlags = require(script.Action.Flags),
|
||||||
|
ActionGroups = require(script.Action.Groups),
|
||||||
|
|
||||||
|
MarioCap = require(script.Mario.Cap),
|
||||||
|
MarioEyes = require(script.Mario.Eyes),
|
||||||
|
MarioFlags = require(script.Mario.Flags),
|
||||||
|
MarioHands = require(script.Mario.Hands),
|
||||||
|
MarioInput = require(script.Mario.Input),
|
||||||
|
|
||||||
|
AirStep = require(script.Steps.Air),
|
||||||
|
WaterStep = require(script.Steps.Water),
|
||||||
|
GroundStep = require(script.Steps.Ground),
|
||||||
|
|
||||||
|
InputFlags = require(script.InputFlags),
|
||||||
|
ModelFlags = require(script.ModelFlags),
|
||||||
|
SurfaceClass = require(script.SurfaceClass),
|
||||||
|
TerrainType = require(script.TerrainType),
|
||||||
|
ParticleFlags = require(script.ParticleFlags),
|
||||||
|
}
|
||||||
|
|
||||||
|
local nameIndex: { [any]: { [number]: string } } = {}
|
||||||
|
|
||||||
|
function Enums.GetName(map, value): string
|
||||||
|
if not nameIndex[map] then
|
||||||
|
local index = {}
|
||||||
|
|
||||||
|
for name, value in pairs(map) do
|
||||||
|
index[value] = name
|
||||||
|
end
|
||||||
|
|
||||||
|
nameIndex[map] = index
|
||||||
|
end
|
||||||
|
|
||||||
|
return nameIndex[map][value]
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.freeze(Enums)
|
1292
sm64/Mario/Airborne.client.lua
Normal file
1292
sm64/Mario/Airborne.client.lua
Normal file
File diff suppressed because it is too large
Load diff
169
sm64/Mario/Automatic.client.lua
Normal file
169
sm64/Mario/Automatic.client.lua
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
--!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)
|
1496
sm64/Mario/Moving.client.lua
Normal file
1496
sm64/Mario/Moving.client.lua
Normal file
File diff suppressed because it is too large
Load diff
677
sm64/Mario/Stationary.client.lua
Normal file
677
sm64/Mario/Stationary.client.lua
Normal file
|
@ -0,0 +1,677 @@
|
||||||
|
--!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 DEF_ACTION: (number, (Mario) -> boolean) -> () = System.RegisterAction
|
||||||
|
|
||||||
|
local function checkCommonIdleCancels(m: Mario)
|
||||||
|
local floor = m.Floor
|
||||||
|
|
||||||
|
if floor and floor.Normal.Y < 0.29237169 then
|
||||||
|
return m:PushOffSteepFloor(Action.FREEFALL, 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.A_PRESSED) then
|
||||||
|
return m:SetJumpingAction(Action.JUMP, 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:SetAction(Action.BEGIN_SLIDING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.NONZERO_ANALOG) then
|
||||||
|
m.FaceAngle = Util.SetYint16(m.FaceAngle, m.IntendedYaw)
|
||||||
|
return m:SetAction(Action.WALKING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.B_PRESSED) then
|
||||||
|
return m:SetAction(Action.PUNCHING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.Z_DOWN) then
|
||||||
|
return m:SetAction(Action.START_CROUCHING)
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function playAnimSound(m: Mario, actionState: number, animFrame: number, sound: Sound)
|
||||||
|
if m.ActionState == actionState and m.AnimFrame == animFrame then
|
||||||
|
m:PlaySound(sound)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function stoppingStep(m: Mario, anim: Animation, action: number)
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m:SetAnimation(anim)
|
||||||
|
|
||||||
|
if m:IsAnimPastEnd() then
|
||||||
|
m:SetAction(action)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function landingStep(m: Mario, anim: Animation, action: number)
|
||||||
|
stoppingStep(m, anim, action)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function checkCommonLandingCancels(m: Mario, action: number)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.A_PRESSED) then
|
||||||
|
if action == 0 then
|
||||||
|
m:SetJumpFromLanding()
|
||||||
|
else
|
||||||
|
m:SetJumpingAction(action, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.NONZERO_ANALOG, InputFlags.A_PRESSED, InputFlags.OFF_FLOOR, InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:CheckCommonActionExits()
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.B_PRESSED) then
|
||||||
|
return m:SetAction(Action.PUNCHING)
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function animatedStationaryGroundStep(m: Mario, anim: Animation, endAction: number)
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m:SetAnimation(anim)
|
||||||
|
|
||||||
|
if m:IsAnimAtEnd() then
|
||||||
|
m:SetAction(endAction)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Actions
|
||||||
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
DEF_ACTION(Action.IDLE, function(m: Mario)
|
||||||
|
if not bit32.btest(m.ActionArg, 1) and m.Health < 0x300 then
|
||||||
|
return m:SetAction(Action.PANTING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if checkCommonIdleCancels(m) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.ActionState == 3 then
|
||||||
|
return m:SetAction(Action.START_SLEEPING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if bit32.btest(m.ActionArg, 1) then
|
||||||
|
m:SetAnimation(Animations.STAND_AGAINST_WALL)
|
||||||
|
else
|
||||||
|
if m.ActionState == 0 then
|
||||||
|
m:SetAnimation(Animations.IDLE_HEAD_LEFT)
|
||||||
|
elseif m.ActionState == 1 then
|
||||||
|
m:SetAnimation(Animations.IDLE_HEAD_RIGHT)
|
||||||
|
elseif m.ActionState == 2 then
|
||||||
|
m:SetAnimation(Animations.IDLE_HEAD_CENTER)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m:IsAnimAtEnd() then
|
||||||
|
m.ActionState += 1
|
||||||
|
|
||||||
|
if m.ActionState == 3 then
|
||||||
|
local deltaYOfFloorBehindMario = m.Position.Y - m:FindFloorHeightRelativePolar(-0x8000, 60)
|
||||||
|
|
||||||
|
if 24 < math.abs(deltaYOfFloorBehindMario) then
|
||||||
|
m.ActionState = 0
|
||||||
|
else
|
||||||
|
m.ActionTimer += 1
|
||||||
|
|
||||||
|
if m.ActionTimer < 10 then
|
||||||
|
m.ActionState = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.START_SLEEPING, function(m: Mario)
|
||||||
|
local animFrame
|
||||||
|
|
||||||
|
if checkCommonIdleCancels(m) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.ActionState == 4 then
|
||||||
|
m:SetAction(Action.SLEEPING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.ActionState == 0 then
|
||||||
|
animFrame = m:SetAnimation(Animations.START_SLEEP_IDLE)
|
||||||
|
elseif m.ActionState == 1 then
|
||||||
|
animFrame = m:SetAnimation(Animations.START_SLEEP_SCRATCH)
|
||||||
|
elseif m.ActionState == 2 then
|
||||||
|
animFrame = m:SetAnimation(Animations.START_SLEEP_YAWN)
|
||||||
|
m.BodyState.EyeState = MarioEyes.HALF_CLOSED
|
||||||
|
elseif m.ActionState == 3 then
|
||||||
|
animFrame = m:SetAnimation(Animations.START_SLEEP_SITTING)
|
||||||
|
m.BodyState.EyeState = MarioEyes.HALF_CLOSED
|
||||||
|
end
|
||||||
|
|
||||||
|
playAnimSound(m, 1, 41, Sounds.ACTION_PAT_BACK)
|
||||||
|
playAnimSound(m, 1, 49, Sounds.ACTION_PAT_BACK)
|
||||||
|
|
||||||
|
if m:IsAnimAtEnd() then
|
||||||
|
m.ActionState += 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.ActionState == 2 and animFrame == -1 then
|
||||||
|
m:PlaySound(Sounds.MARIO_YAWNING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.ActionState == 1 and animFrame == -1 then
|
||||||
|
m:PlaySound(Sounds.MARIO_IMA_TIRED)
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.SLEEPING, function(m: Mario)
|
||||||
|
local animFrame
|
||||||
|
|
||||||
|
if
|
||||||
|
m.Input:Has(
|
||||||
|
InputFlags.NONZERO_ANALOG,
|
||||||
|
InputFlags.A_PRESSED,
|
||||||
|
InputFlags.OFF_FLOOR,
|
||||||
|
InputFlags.ABOVE_SLIDE,
|
||||||
|
InputFlags.FIRST_PERSON,
|
||||||
|
InputFlags.STOMPED,
|
||||||
|
InputFlags.B_PRESSED,
|
||||||
|
InputFlags.Z_PRESSED
|
||||||
|
)
|
||||||
|
then
|
||||||
|
return m:SetAction(Action.WAKING_UP, m.ActionState)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Position.Y - m:FindFloorHeightRelativePolar(-0x8000, 60) > 24 then
|
||||||
|
return m:SetAction(Action.WAKING_UP, m.ActionState)
|
||||||
|
end
|
||||||
|
|
||||||
|
m.BodyState.EyeState = MarioEyes.CLOSED
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
|
||||||
|
if m.ActionState == 0 then
|
||||||
|
animFrame = m:SetAnimation(Animations.SLEEP_IDLE)
|
||||||
|
|
||||||
|
if animFrame == 2 then
|
||||||
|
m:PlaySound(Sounds.MARIO_SNORING1)
|
||||||
|
end
|
||||||
|
|
||||||
|
if animFrame == 20 then
|
||||||
|
m:PlaySound(Sounds.MARIO_SNORING2)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m:IsAnimAtEnd() then
|
||||||
|
m.ActionTimer += 1
|
||||||
|
|
||||||
|
if m.ActionTimer > 45 then
|
||||||
|
m.ActionState += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif m.ActionState == 1 then
|
||||||
|
if m:SetAnimation(Animations.SLEEP_START_LYING) == 18 then
|
||||||
|
m:PlayHeavyLandingSound(Sounds.ACTION_TERRAIN_BODY_HIT_GROUND)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m:IsAnimAtEnd() then
|
||||||
|
m.ActionState += 1
|
||||||
|
end
|
||||||
|
elseif m.ActionState == 2 then
|
||||||
|
m:SetAnimation(Animations.SLEEP_LYING)
|
||||||
|
m:PlaySoundIfNoFlag(Sounds.MARIO_SNORING3, MarioFlags.ACTION_SOUND_PLAYED)
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.WAKING_UP, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:SetAction(Action.BEGIN_SLIDING)
|
||||||
|
end
|
||||||
|
|
||||||
|
m.ActionTimer += 1
|
||||||
|
|
||||||
|
if m.ActionTimer > 20 then
|
||||||
|
return m:SetAction(Action.IDLE)
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m:SetAnimation(if m.ActionArg == 0 then Animations.WAKE_FROM_SLEEP else Animations.WAKE_FROM_LYING)
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.STANDING_AGAINST_WALL, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.NONZERO_ANALOG, InputFlags.A_PRESSED, InputFlags.OFF_FLOOR, InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:CheckCommonActionExits()
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.B_PRESSED) then
|
||||||
|
return m:SetAction(Action.PUNCHING)
|
||||||
|
end
|
||||||
|
|
||||||
|
m:SetAnimation(Animations.A_POSE)
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.CROUCHING, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.A_PRESSED) then
|
||||||
|
return m:SetAction(Action.BACKFLIP)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:SetAction(Action.BEGIN_SLIDING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not m.Input:Has(InputFlags.Z_DOWN) then
|
||||||
|
return m:SetAction(Action.STOP_CROUCHING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.NONZERO_ANALOG) then
|
||||||
|
return m:SetAction(Action.START_CRAWLING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.B_PRESSED) then
|
||||||
|
return m:SetAction(Action.PUNCHING, 9)
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m:SetAnimation(Animations.CROUCHING)
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.PANTING, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Health >= 0x500 then
|
||||||
|
return m:SetAction(Action.IDLE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if checkCommonIdleCancels(m) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if m:SetAnimation(Animations.PANTING) == 1 then
|
||||||
|
m:PlaySound(Sounds.MARIO_PANTING)
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m.BodyState.EyeState = MarioEyes.HALF_CLOSED
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.BRAKING_STOP, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.B_PRESSED) then
|
||||||
|
return m:SetAction(Action.PUNCHING)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.NONZERO_ANALOG, InputFlags.A_PRESSED, InputFlags.OFF_FLOOR, InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:CheckCommonActionExits()
|
||||||
|
end
|
||||||
|
|
||||||
|
stoppingStep(m, Animations.STOP_SKID, Action.IDLE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.BUTT_SLIDE_STOP, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.NONZERO_ANALOG, InputFlags.A_PRESSED, InputFlags.OFF_FLOOR, InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:CheckCommonActionExits()
|
||||||
|
end
|
||||||
|
|
||||||
|
stoppingStep(m, Animations.STOP_SLIDE, Action.IDLE)
|
||||||
|
|
||||||
|
if m.AnimFrame == 6 then
|
||||||
|
m:PlayLandingSound()
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.SLIDE_KICK_SLIDE_STOP, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
stoppingStep(m, Animations.CROUCH_FROM_SLIDE_KICK, Action.CROUCHING)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.START_CROUCHING, function(m: Mario)
|
||||||
|
if m:CheckCommonActionExits() then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m:SetAnimation(Animations.START_CROUCHING)
|
||||||
|
|
||||||
|
if m:IsAnimPastEnd() then
|
||||||
|
m:SetAction(Action.CROUCHING)
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.STOP_CROUCHING, function(m: Mario)
|
||||||
|
if m:CheckCommonActionExits() then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m:SetAnimation(Animations.START_CROUCHING)
|
||||||
|
|
||||||
|
if m:IsAnimPastEnd() then
|
||||||
|
m:SetAction(Action.IDLE)
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.START_CRAWLING, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:SetAction(Action.BEGIN_SLIDING)
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m:SetAnimation(Animations.START_CRAWLING)
|
||||||
|
|
||||||
|
if m:IsAnimPastEnd() then
|
||||||
|
m:SetAction(Action.CRAWLING)
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.STOP_CRAWLING, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:SetAction(Action.BEGIN_SLIDING)
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m:SetAnimation(Animations.STOP_CRAWLING)
|
||||||
|
|
||||||
|
if m:IsAnimPastEnd() then
|
||||||
|
m:SetAction(Action.CROUCHING)
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.SHOCKWAVE_BOUNCE, function(m: Mario)
|
||||||
|
m.ActionTimer += 1
|
||||||
|
|
||||||
|
if m.ActionTimer == 48 then
|
||||||
|
m:SetAction(Action.IDLE)
|
||||||
|
end
|
||||||
|
|
||||||
|
local sp1E = bit32.lshift(m.ActionTimer % 16, 12)
|
||||||
|
local sp18 = ((6 - m.ActionTimer / 8) * 8) + 4
|
||||||
|
|
||||||
|
m:SetForwardVel(0)
|
||||||
|
m.Velocity = Vector3.zero
|
||||||
|
|
||||||
|
if Util.Sins(sp1E) >= 0 then
|
||||||
|
m.Position = Util.SetY(m.Position, Util.Sins(sp1E) * sp18 + m.FloorHeight)
|
||||||
|
else
|
||||||
|
m.Position = Util.SetY(m.Position, m.FloorHeight - Util.Sins(sp1E) * sp18)
|
||||||
|
end
|
||||||
|
|
||||||
|
m:SetAnimation(Animations.A_POSE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.JUMP_LAND_STOP, function(m: Mario)
|
||||||
|
if checkCommonLandingCancels(m, 0) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
landingStep(m, Animations.LAND_FROM_SINGLE_JUMP, Action.IDLE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.DOUBLE_JUMP_LAND_STOP, function(m: Mario)
|
||||||
|
if checkCommonLandingCancels(m, 0) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
landingStep(m, Animations.LAND_FROM_DOUBLE_JUMP, Action.IDLE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.SIDE_FLIP_LAND_STOP, function(m: Mario)
|
||||||
|
if checkCommonLandingCancels(m, 0) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
landingStep(m, Animations.SLIDEFLIP_LAND, Action.IDLE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.FREEFALL_LAND_STOP, function(m: Mario)
|
||||||
|
if checkCommonLandingCancels(m, 0) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
landingStep(m, Animations.GENERAL_LAND, Action.IDLE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.TRIPLE_JUMP_LAND_STOP, function(m: Mario)
|
||||||
|
if checkCommonLandingCancels(m, Action.JUMP) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
landingStep(m, Animations.GENERAL_LAND, Action.IDLE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.BACKFLIP_LAND_STOP, function(m: Mario)
|
||||||
|
if not m.Input:Has(InputFlags.Z_DOWN) and m.AnimFrame >= 6 then
|
||||||
|
m.Input:Remove(InputFlags.A_PRESSED)
|
||||||
|
end
|
||||||
|
|
||||||
|
if checkCommonLandingCancels(m, Action.BACKFLIP) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
landingStep(m, Animations.TRIPLE_JUMP_LAND, Action.IDLE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.LAVA_BOOST_LAND, function(m: Mario)
|
||||||
|
m.Input:Remove(InputFlags.FIRST_PERSON, InputFlags.B_PRESSED)
|
||||||
|
|
||||||
|
if checkCommonLandingCancels(m, 0) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
landingStep(m, Animations.STAND_UP_FROM_LAVA_BOOST, Action.IDLE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.LONG_JUMP_LAND_STOP, function(m: Mario)
|
||||||
|
m.Input:Remove(InputFlags.B_PRESSED)
|
||||||
|
|
||||||
|
if checkCommonLandingCancels(m, Action.JUMP) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
landingStep(
|
||||||
|
m,
|
||||||
|
if m.LongJumpIsSlow then Animations.CROUCH_FROM_FAST_LONGJUMP else Animations.CROUCH_FROM_SLOW_LONGJUMP,
|
||||||
|
Action.CROUCHING
|
||||||
|
)
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.TWIRL_LAND, function(m: Mario)
|
||||||
|
m.ActionState = 1
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
m:StationaryGroundStep()
|
||||||
|
m:SetAnimation(Animations.TWIRL_LAND)
|
||||||
|
|
||||||
|
if m.AngleVel.Y > 0 then
|
||||||
|
m.AngleVel -= Vector3int16.new(0, 0x400, 0)
|
||||||
|
|
||||||
|
if m.AngleVel.Y < 0 then
|
||||||
|
m.AngleVel *= Vector3int16.new(1, 0, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
m.TwirlYaw += m.AngleVel.Y
|
||||||
|
end
|
||||||
|
|
||||||
|
m.GfxAngle += Vector3int16.new(0, m.TwirlYaw, 0)
|
||||||
|
|
||||||
|
if m:IsAnimAtEnd() and m.AngleVel.Y == 0 then
|
||||||
|
m.FaceAngle += Vector3int16.new(0, m.TwirlYaw, 0)
|
||||||
|
m:SetAction(Action.IDLE)
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.GROUND_POUND_LAND, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:SetAction(Action.BUTT_SLIDE)
|
||||||
|
end
|
||||||
|
|
||||||
|
landingStep(m, Animations.GROUND_POUND_LANDING, Action.BUTT_SLIDE_STOP)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
DEF_ACTION(Action.STOMACH_SLIDE_STOP, function(m: Mario)
|
||||||
|
if m.Input:Has(InputFlags.STOMPED) then
|
||||||
|
return m:SetAction(Action.SHOCKWAVE_BOUNCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.OFF_FLOOR) then
|
||||||
|
return m:SetAction(Action.FREEFALL)
|
||||||
|
end
|
||||||
|
|
||||||
|
if m.Input:Has(InputFlags.ABOVE_SLIDE) then
|
||||||
|
return m:SetAction(Action.BEGIN_SLIDING)
|
||||||
|
end
|
||||||
|
|
||||||
|
animatedStationaryGroundStep(m, Animations.SLOW_LAND_FROM_DIVE, Action.IDLE)
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
1599
sm64/Mario/init.lua
Normal file
1599
sm64/Mario/init.lua
Normal file
File diff suppressed because it is too large
Load diff
96
sm64/Sounds.lua
Normal file
96
sm64/Sounds.lua
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local System = script.Parent
|
||||||
|
local Assets = System.Assets
|
||||||
|
local Sounds = Assets.Sounds
|
||||||
|
|
||||||
|
local Data = {
|
||||||
|
ACTION_BONK = Sounds.ACTION_BONK,
|
||||||
|
ACTION_FLYING_FAST = Sounds.ACTION_FLYING_FAST,
|
||||||
|
ACTION_HIT = Sounds.ACTION_HIT,
|
||||||
|
ACTION_METAL_BONK = Sounds.ACTION_METAL_BONK,
|
||||||
|
ACTION_METAL_HEAVY_LANDING = Sounds.ACTION_METAL_HEAVY_LANDING,
|
||||||
|
ACTION_METAL_LANDING = Sounds.ACTION_METAL_LANDING,
|
||||||
|
ACTION_METAL_STEP = Sounds.ACTION_METAL_STEP,
|
||||||
|
ACTION_PAT_BACK = Sounds.ACTION_PAT_BACK,
|
||||||
|
ACTION_SIDE_FLIP = Sounds.ACTION_SIDE_FLIP,
|
||||||
|
ACTION_SPIN = Sounds.ACTION_SPIN,
|
||||||
|
ACTION_HEAVY_LANDING = Sounds.ACTION_HEAVY_LANDING,
|
||||||
|
ACTION_TERRAIN_BODY_HIT_GROUND = Sounds.ACTION_TERRAIN_BODY_HIT_GROUND,
|
||||||
|
ACTION_TERRAIN_JUMP = Sounds.ACTION_TERRAIN_JUMP,
|
||||||
|
ACTION_TERRAIN_LANDING = Sounds.ACTION_TERRAIN_LANDING,
|
||||||
|
ACTION_TERRAIN_STEP = Sounds.ACTION_TERRAIN_STEP,
|
||||||
|
ACTION_THROW = Sounds.ACTION_THROW,
|
||||||
|
ACTION_TWIRL = Sounds.ACTION_TWIRL,
|
||||||
|
|
||||||
|
MARIO_ATTACKED = Sounds.MARIO_ATTACKED,
|
||||||
|
MARIO_DOH = Sounds.MARIO_DOH,
|
||||||
|
MARIO_GROUND_POUND_WAH = Sounds.MARIO_GROUND_POUND_WAH,
|
||||||
|
MARIO_HAHA = Sounds.MARIO_HAHA,
|
||||||
|
MARIO_HOO = Sounds.MARIO_HOO,
|
||||||
|
MARIO_HOOHOO = Sounds.MARIO_HOOHOO,
|
||||||
|
MARIO_IMA_TIRED = Sounds.MARIO_IMA_TIRED,
|
||||||
|
MARIO_MAMA_MIA = Sounds.MARIO_MAMA_MIA,
|
||||||
|
MARIO_ON_FIRE = Sounds.MARIO_ON_FIRE,
|
||||||
|
MARIO_OOOF = Sounds.MARIO_OOOF,
|
||||||
|
MARIO_PANTING = Sounds.MARIO_PANTING,
|
||||||
|
MARIO_PUNCH_YAH = Sounds.MARIO_PUNCH_YAH,
|
||||||
|
MARIO_PUNCH_WAH = Sounds.MARIO_PUNCH_WAH,
|
||||||
|
MARIO_PUNCH_HOO = Sounds.MARIO_PUNCH_HOO,
|
||||||
|
MARIO_SNORING1 = Sounds.MARIO_SNORING1,
|
||||||
|
MARIO_SNORING2 = Sounds.MARIO_SNORING2,
|
||||||
|
MARIO_SNORING3 = Sounds.MARIO_SNORING3,
|
||||||
|
MARIO_UH = Sounds.MARIO_UH,
|
||||||
|
MARIO_UH2 = Sounds.MARIO_UH2,
|
||||||
|
MARIO_WAAAOOOW = Sounds.MARIO_WAAAOOOW,
|
||||||
|
MARIO_WAH = Sounds.MARIO_WAH,
|
||||||
|
MARIO_WAHA = Sounds.MARIO_WAHA,
|
||||||
|
MARIO_WHOA = Sounds.MARIO_WHOA,
|
||||||
|
MARIO_YAH = Sounds.MARIO_YAH,
|
||||||
|
MARIO_YAHOO = Sounds.MARIO_YAHOO,
|
||||||
|
MARIO_YAWNING = Sounds.MARIO_YAWNING,
|
||||||
|
MARIO_YIPPEE = Sounds.MARIO_YIPPEE,
|
||||||
|
|
||||||
|
MOVING_FLYING = Sounds.MOVING_FLYING,
|
||||||
|
MOVING_LAVA_BURN = Sounds.MOVING_LAVA_BURN,
|
||||||
|
MOVING_TERRAIN_SLIDE = Sounds.MOVING_TERRAIN_SLIDE,
|
||||||
|
|
||||||
|
MARIO_JUMP = Sounds.MARIO_JUMP,
|
||||||
|
MARIO_YAH_WAH_HOO = Sounds.MARIO_YAH_WAH_HOO,
|
||||||
|
MARIO_YAHOO_WAHA_YIPPEE = Sounds.MARIO_YAHOO_WAHA_YIPPEE,
|
||||||
|
|
||||||
|
ACTION_TERRAIN_STEP_DEFAULT = Sounds.ACTION_TERRAIN_STEP_DEFAULT,
|
||||||
|
ACTION_TERRAIN_STEP_GRASS = Sounds.ACTION_TERRAIN_STEP_GRASS,
|
||||||
|
ACTION_TERRAIN_STEP_ICE = Sounds.ACTION_TERRAIN_STEP_ICE,
|
||||||
|
ACTION_TERRAIN_STEP_METAL = Sounds.ACTION_TERRAIN_STEP_METAL,
|
||||||
|
ACTION_TERRAIN_STEP_SAND = Sounds.ACTION_TERRAIN_STEP_SAND,
|
||||||
|
ACTION_TERRAIN_STEP_SNOW = Sounds.ACTION_TERRAIN_STEP_SNOW,
|
||||||
|
ACTION_TERRAIN_STEP_SPOOKY = Sounds.ACTION_TERRAIN_STEP_SPOOKY,
|
||||||
|
ACTION_TERRAIN_STEP_STONE = Sounds.ACTION_TERRAIN_STEP_STONE,
|
||||||
|
|
||||||
|
ACTION_TERRAIN_LANDING_DEFAULT = Sounds.ACTION_TERRAIN_LANDING_DEFAULT,
|
||||||
|
ACTION_TERRAIN_LANDING_GRASS = Sounds.ACTION_TERRAIN_LANDING_GRASS,
|
||||||
|
ACTION_TERRAIN_LANDING_ICE = Sounds.ACTION_TERRAIN_LANDING_ICE,
|
||||||
|
ACTION_TERRAIN_LANDING_METAL = Sounds.ACTION_TERRAIN_LANDING_METAL,
|
||||||
|
ACTION_TERRAIN_LANDING_SAND = Sounds.ACTION_TERRAIN_LANDING_SAND,
|
||||||
|
ACTION_TERRAIN_LANDING_SNOW = Sounds.ACTION_TERRAIN_LANDING_SNOW,
|
||||||
|
ACTION_TERRAIN_LANDING_SPOOKY = Sounds.ACTION_TERRAIN_LANDING_SPOOKY,
|
||||||
|
ACTION_TERRAIN_LANDING_STONE = Sounds.ACTION_TERRAIN_LANDING_STONE,
|
||||||
|
|
||||||
|
ACTION_TERRAIN_JUMP_DEFAULT = Sounds.ACTION_TERRAIN_LANDING_DEFAULT,
|
||||||
|
ACTION_TERRAIN_JUMP_GRASS = Sounds.ACTION_TERRAIN_LANDING_GRASS,
|
||||||
|
ACTION_TERRAIN_JUMP_ICE = Sounds.ACTION_TERRAIN_LANDING_ICE,
|
||||||
|
ACTION_TERRAIN_JUMP_METAL = Sounds.ACTION_TERRAIN_LANDING_METAL,
|
||||||
|
ACTION_TERRAIN_JUMP_SAND = Sounds.ACTION_TERRAIN_LANDING_SAND,
|
||||||
|
ACTION_TERRAIN_JUMP_SNOW = Sounds.ACTION_TERRAIN_LANDING_SNOW,
|
||||||
|
ACTION_TERRAIN_JUMP_SPOOKY = Sounds.ACTION_TERRAIN_LANDING_SPOOKY,
|
||||||
|
ACTION_TERRAIN_JUMP_STONE = Sounds.ACTION_TERRAIN_LANDING_STONE,
|
||||||
|
}
|
||||||
|
|
||||||
|
setmetatable(Data, {
|
||||||
|
__index = function(t, k)
|
||||||
|
warn("UNKNOWN SOUND:", k)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
return table.freeze(Data)
|
53
sm64/Types/Flags.lua
Normal file
53
sm64/Types/Flags.lua
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local Flags = {}
|
||||||
|
Flags.__index = Flags
|
||||||
|
|
||||||
|
export type Flags = { Value: number }
|
||||||
|
export type Class = typeof(setmetatable({} :: Flags, Flags))
|
||||||
|
|
||||||
|
function Flags.new(...: number): Class
|
||||||
|
local flags = { Value = bit32.bor(...) }
|
||||||
|
return setmetatable(flags, Flags)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Flags.__call(self: Class): number
|
||||||
|
return self.Value
|
||||||
|
end
|
||||||
|
|
||||||
|
function Flags.Get(self: Class): number
|
||||||
|
return self.Value
|
||||||
|
end
|
||||||
|
|
||||||
|
function Flags.Set(self: Class, ...: number)
|
||||||
|
self.Value = bit32.bor(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Flags.Copy(self: Class, flags: Class)
|
||||||
|
self.Value = flags.Value
|
||||||
|
end
|
||||||
|
|
||||||
|
function Flags.Add(self: Class, ...: number)
|
||||||
|
self.Value = bit32.bor(self.Value, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Flags.Has(self: Class, ...: number): boolean
|
||||||
|
local mask = bit32.bor(...)
|
||||||
|
return bit32.btest(self.Value, mask)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Flags.Remove(self: Class, ...: number)
|
||||||
|
local mask = bit32.bor(...)
|
||||||
|
local invert = bit32.bnot(mask)
|
||||||
|
self.Value = bit32.band(self.Value, invert)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Flags.Band(self: Class, ...: number)
|
||||||
|
self.Value = bit32.band(self.Value, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Flags.Clear(self: Class)
|
||||||
|
self.Value = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
return Flags
|
112
sm64/Types/init.lua
Normal file
112
sm64/Types/init.lua
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local Flags = require(script.Flags)
|
||||||
|
export type Flags = Flags.Class
|
||||||
|
|
||||||
|
export type Controller = {
|
||||||
|
RawStickX: number,
|
||||||
|
RawStickY: number,
|
||||||
|
|
||||||
|
StickX: number,
|
||||||
|
StickY: number,
|
||||||
|
StickMag: number,
|
||||||
|
|
||||||
|
ButtonDown: Flags,
|
||||||
|
ButtonPressed: Flags,
|
||||||
|
}
|
||||||
|
|
||||||
|
export type BodyState = {
|
||||||
|
Action: number,
|
||||||
|
CapState: Flags,
|
||||||
|
EyeState: number,
|
||||||
|
HandState: Flags,
|
||||||
|
WingFlutter: boolean,
|
||||||
|
ModelState: Flags,
|
||||||
|
GrabPos: number,
|
||||||
|
PunchType: number,
|
||||||
|
PunchTimer: number,
|
||||||
|
TorsoAngle: Vector3int16,
|
||||||
|
HeadAngle: Vector3int16,
|
||||||
|
HeldObjLastPos: Vector3,
|
||||||
|
}
|
||||||
|
|
||||||
|
export type MarioState = {
|
||||||
|
Input: Flags,
|
||||||
|
Flags: Flags,
|
||||||
|
|
||||||
|
Action: Flags,
|
||||||
|
PrevAction: Flags,
|
||||||
|
ParticleFlags: Flags,
|
||||||
|
HitboxHeight: number,
|
||||||
|
TerrainType: number,
|
||||||
|
HeldObj: Instance?,
|
||||||
|
|
||||||
|
ActionState: number,
|
||||||
|
ActionTimer: number,
|
||||||
|
ActionArg: number,
|
||||||
|
|
||||||
|
IntendedMag: number,
|
||||||
|
IntendedYaw: number,
|
||||||
|
InvincTimer: number,
|
||||||
|
|
||||||
|
FramesSinceA: number,
|
||||||
|
FramesSinceB: number,
|
||||||
|
|
||||||
|
WallKickTimer: number,
|
||||||
|
DoubleJumpTimer: number,
|
||||||
|
|
||||||
|
FaceAngle: Vector3int16,
|
||||||
|
GfxAngle: Vector3int16,
|
||||||
|
AngleVel: Vector3int16,
|
||||||
|
ThrowMatrix: CFrame?,
|
||||||
|
|
||||||
|
SlideYaw: number,
|
||||||
|
TwirlYaw: number,
|
||||||
|
|
||||||
|
Position: Vector3,
|
||||||
|
Velocity: Vector3,
|
||||||
|
|
||||||
|
ForwardVel: number,
|
||||||
|
SlideVelX: number,
|
||||||
|
SlideVelZ: number,
|
||||||
|
|
||||||
|
Wall: RaycastResult?,
|
||||||
|
Ceil: RaycastResult?,
|
||||||
|
Floor: RaycastResult?,
|
||||||
|
|
||||||
|
CeilHeight: number,
|
||||||
|
FloorHeight: number,
|
||||||
|
FloorAngle: number,
|
||||||
|
WaterLevel: number,
|
||||||
|
|
||||||
|
BodyState: BodyState,
|
||||||
|
Controller: Controller,
|
||||||
|
|
||||||
|
Health: number,
|
||||||
|
HurtCounter: number,
|
||||||
|
HealCounter: number,
|
||||||
|
SquishTimer: number,
|
||||||
|
|
||||||
|
CapTimer: number,
|
||||||
|
BurnTimer: number,
|
||||||
|
PeakHeight: number,
|
||||||
|
SteepJumpYaw: number,
|
||||||
|
WalkingPitch: number,
|
||||||
|
QuicksandDepth: number,
|
||||||
|
LongJumpIsSlow: boolean,
|
||||||
|
|
||||||
|
AnimCurrent: Animation?,
|
||||||
|
AnimFrameCount: number,
|
||||||
|
|
||||||
|
AnimAccel: number,
|
||||||
|
AnimAccelAssist: number,
|
||||||
|
|
||||||
|
AnimFrame: number,
|
||||||
|
AnimDirty: boolean,
|
||||||
|
AnimReset: boolean,
|
||||||
|
AnimSetFrame: number,
|
||||||
|
AnimSkipInterp: boolean?,
|
||||||
|
}
|
||||||
|
|
||||||
|
local result = { Flags = Flags }
|
||||||
|
return table.freeze(result)
|
267
sm64/Util/init.lua
Normal file
267
sm64/Util/init.lua
Normal file
|
@ -0,0 +1,267 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local Util = {
|
||||||
|
GlobalTimer = 0,
|
||||||
|
Scale = 1 / 16,
|
||||||
|
}
|
||||||
|
|
||||||
|
local rayParams = RaycastParams.new()
|
||||||
|
rayParams.CollisionGroup = "Player"
|
||||||
|
|
||||||
|
local SHORT_TO_RAD = (2 * math.pi) / 0x10000
|
||||||
|
local VECTOR3_XZ = Vector3.one - Vector3.yAxis
|
||||||
|
|
||||||
|
local CARDINAL = {
|
||||||
|
-Vector3.xAxis,
|
||||||
|
-Vector3.zAxis,
|
||||||
|
Vector3.xAxis,
|
||||||
|
Vector3.zAxis,
|
||||||
|
}
|
||||||
|
|
||||||
|
function Util.SetX(vec: Vector3, x: number): Vector3
|
||||||
|
return Vector3.new(x, vec.Y, vec.Z)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.SetXint16(vec: Vector3int16, x: number): Vector3int16
|
||||||
|
return Vector3int16.new(x, vec.Y, vec.Z)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.SetY(vec: Vector3, y: number): Vector3
|
||||||
|
return Vector3.new(vec.X, y, vec.Z)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.SetYint16(vec: Vector3int16, y: number): Vector3int16
|
||||||
|
return Vector3int16.new(vec.X, y, vec.Z)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.SetZ(vec: Vector3, z: number): Vector3
|
||||||
|
return Vector3.new(vec.X, vec.Y, z)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.SetZint16(vec: Vector3int16, z: number): Vector3int16
|
||||||
|
return Vector3int16.new(vec.X, vec.Y, z)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.ToRoblox(v: Vector3)
|
||||||
|
return v * Util.Scale
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.ToSM64(v: Vector3)
|
||||||
|
return v / Util.Scale
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.ToEulerAngles(v: Vector3int16): Vector3
|
||||||
|
return Vector3.new(v.X, v.Y, v.Z) * SHORT_TO_RAD
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.ToRotation(v: Vector3int16): CFrame
|
||||||
|
local angle = Util.ToEulerAngles(v)
|
||||||
|
|
||||||
|
local matrix = CFrame.fromAxisAngle(Vector3.yAxis, angle.Y)
|
||||||
|
* CFrame.fromAxisAngle(Vector3.xAxis, -angle.X)
|
||||||
|
* CFrame.fromAxisAngle(Vector3.zAxis, -angle.Z)
|
||||||
|
|
||||||
|
return matrix
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.Raycast(pos: Vector3, dir: Vector3, rayParams: RaycastParams?, worldRoot: WorldRoot?): RaycastResult?
|
||||||
|
local root = worldRoot or workspace
|
||||||
|
local result: RaycastResult? = root:Raycast(pos, dir)
|
||||||
|
|
||||||
|
if script:GetAttribute("Debug") then
|
||||||
|
local color = Color3.new(result and 0 or 1, result and 1 or 0, 0)
|
||||||
|
|
||||||
|
local line = Instance.new("LineHandleAdornment")
|
||||||
|
line.CFrame = CFrame.new(pos, pos + dir)
|
||||||
|
line.Length = dir.Magnitude
|
||||||
|
line.Thickness = 3
|
||||||
|
line.Color3 = color
|
||||||
|
line.Adornee = workspace.Terrain
|
||||||
|
line.Parent = workspace.Terrain
|
||||||
|
|
||||||
|
task.delay(2, line.Destroy, line)
|
||||||
|
end
|
||||||
|
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.RaycastSM64(pos: Vector3, dir: Vector3, rayParams: RaycastParams?, worldRoot: WorldRoot?): RaycastResult?
|
||||||
|
local result: RaycastResult? = Util.Raycast(pos * Util.Scale, dir * Util.Scale, rayParams, worldRoot)
|
||||||
|
|
||||||
|
if result then
|
||||||
|
-- Cast back to SM64 unit scale.
|
||||||
|
result = {
|
||||||
|
Normal = result.Normal,
|
||||||
|
Material = result.Material,
|
||||||
|
Instance = result.Instance,
|
||||||
|
Distance = result.Distance / Util.Scale,
|
||||||
|
Position = result.Position / Util.Scale,
|
||||||
|
} :: any
|
||||||
|
end
|
||||||
|
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.FindFloor(pos: Vector3): (number, RaycastResult?)
|
||||||
|
local trunc = Vector3int16.new(pos.X, pos.Y, pos.Z)
|
||||||
|
local height = -11000
|
||||||
|
|
||||||
|
if math.abs(trunc.X) >= 0x2000 then
|
||||||
|
return height, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if math.abs(trunc.Z) >= 0x2000 then
|
||||||
|
return height, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local newPos = Vector3.new(trunc.X, trunc.Y, trunc.Z)
|
||||||
|
local result = Util.RaycastSM64(newPos + (Vector3.yAxis * 100), -Vector3.yAxis * 10000)
|
||||||
|
|
||||||
|
if result then
|
||||||
|
local height = Util.SignedShort(result.Position.Y)
|
||||||
|
result.Position = Vector3.new(pos.X, height, pos.Z)
|
||||||
|
|
||||||
|
return height, result
|
||||||
|
else
|
||||||
|
return height, nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.FindCeil(pos: Vector3, height: number?): (number, RaycastResult?)
|
||||||
|
local pos = Vector3.new(pos.X, (height or pos.Y) + 80, pos.Z)
|
||||||
|
local result = Util.RaycastSM64(pos, Vector3.yAxis * 10000)
|
||||||
|
|
||||||
|
if result then
|
||||||
|
return result.Position.Y, result
|
||||||
|
else
|
||||||
|
return 10000, nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.FindWallCollisions(pos: Vector3, offset: number, radius: number): (Vector3, RaycastResult?)
|
||||||
|
local origin = pos + Vector3.new(0, offset, 0)
|
||||||
|
local walls: { RaycastResult } = {}
|
||||||
|
local lastWall: RaycastResult?
|
||||||
|
local disp = Vector3.zero
|
||||||
|
|
||||||
|
for i, dir in CARDINAL do
|
||||||
|
local contact = Util.RaycastSM64(origin, dir * radius)
|
||||||
|
|
||||||
|
if contact then
|
||||||
|
local normal = contact.Normal
|
||||||
|
|
||||||
|
if math.abs(normal.Y) < 0.01 then
|
||||||
|
local surface = contact.Position
|
||||||
|
local offset = (surface - pos) * VECTOR3_XZ
|
||||||
|
local dist = offset.Magnitude
|
||||||
|
|
||||||
|
if dist < radius then
|
||||||
|
disp += (contact.Normal * VECTOR3_XZ) * (radius - dist)
|
||||||
|
lastWall = contact
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return pos + disp, lastWall
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.SignedShort(x: number)
|
||||||
|
return -0x8000 + math.floor((x + 0x8000) % 0x10000)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.SignedInt(x: number)
|
||||||
|
return -0x80000000 + math.floor(x + 0x80000000) % 0x100000000
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.ApproachFloat(current: number, target: number, inc: number, dec: number?): number
|
||||||
|
if dec == nil then
|
||||||
|
dec = inc
|
||||||
|
end
|
||||||
|
|
||||||
|
assert(dec)
|
||||||
|
|
||||||
|
if current < target then
|
||||||
|
current = math.min(target, current + inc)
|
||||||
|
else
|
||||||
|
current = math.max(target, current - dec)
|
||||||
|
end
|
||||||
|
|
||||||
|
return current
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.ApproachInt(current: number, target: number, inc: number, dec: number?): number
|
||||||
|
if dec == nil then
|
||||||
|
dec = inc
|
||||||
|
end
|
||||||
|
|
||||||
|
assert(dec)
|
||||||
|
|
||||||
|
if current < target then
|
||||||
|
current = Util.SignedInt(current + inc)
|
||||||
|
current = math.min(target, current)
|
||||||
|
else
|
||||||
|
current = Util.SignedInt(current - dec)
|
||||||
|
current = math.max(target, current)
|
||||||
|
end
|
||||||
|
|
||||||
|
return Util.SignedInt(current)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.Sins(short: number): number
|
||||||
|
short = Util.SignedShort(short)
|
||||||
|
return math.sin(short * SHORT_TO_RAD)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.Coss(short: number): number
|
||||||
|
short = Util.SignedShort(short)
|
||||||
|
return math.cos(short * SHORT_TO_RAD)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function atan2_lookup(y: number, x: number)
|
||||||
|
return math.atan2(y, x) / SHORT_TO_RAD
|
||||||
|
end
|
||||||
|
|
||||||
|
function Util.Atan2s(y: number, x: number): number
|
||||||
|
local ret: number
|
||||||
|
|
||||||
|
if x >= 0 then
|
||||||
|
if y >= 0 then
|
||||||
|
if y >= x then
|
||||||
|
ret = atan2_lookup(x, y)
|
||||||
|
else
|
||||||
|
ret = 0x4000 - atan2_lookup(y, x)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
y = -y
|
||||||
|
|
||||||
|
if y < x then
|
||||||
|
ret = 0x4000 + atan2_lookup(y, x)
|
||||||
|
else
|
||||||
|
ret = 0x8000 - atan2_lookup(x, y)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
x = -x
|
||||||
|
|
||||||
|
if y < 0 then
|
||||||
|
y = -y
|
||||||
|
|
||||||
|
if y >= x then
|
||||||
|
ret = 0x8000 + atan2_lookup(x, y)
|
||||||
|
else
|
||||||
|
ret = 0xC000 - atan2_lookup(y, x)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if y < x then
|
||||||
|
ret = 0xC000 + atan2_lookup(y, x)
|
||||||
|
else
|
||||||
|
ret = -atan2_lookup(x, y)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return Util.SignedShort(ret)
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.freeze(Util)
|
5
sm64/Util/init.meta.json
Normal file
5
sm64/Util/init.meta.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"Debug": false
|
||||||
|
}
|
||||||
|
}
|
473
sm64/init.client.lua
Normal file
473
sm64/init.client.lua
Normal file
|
@ -0,0 +1,473 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local Players = game:GetService("Players") :: Players
|
||||||
|
local RunService = game:GetService("RunService") :: RunService
|
||||||
|
local StarterGui = game:GetService("StarterGui") :: StarterGui
|
||||||
|
local TweenService = game:GetService("TweenService") :: TweenService
|
||||||
|
local UserInputService = game:GetService("UserInputService") :: UserInputService
|
||||||
|
local ReplicatedStorage = game:GetService("ReplicatedStorage") :: ReplicatedStorage
|
||||||
|
local ContextActionService = game:GetService("ContextActionService") :: ContextActionService
|
||||||
|
|
||||||
|
local Sounds = require(script.Sounds)
|
||||||
|
local Enums = require(script.Enums)
|
||||||
|
local Mario = require(script.Mario)
|
||||||
|
local Types = require(script.Types)
|
||||||
|
local Util = require(script.Util)
|
||||||
|
|
||||||
|
local Action = Enums.Action
|
||||||
|
local Buttons = Enums.Buttons
|
||||||
|
local InputFlags = Enums.InputFlags
|
||||||
|
local ParticleFlags = Enums.ParticleFlags
|
||||||
|
|
||||||
|
type InputType = Enum.UserInputType | Enum.KeyCode
|
||||||
|
type Controller = Types.Controller
|
||||||
|
type Mario = Mario.Class
|
||||||
|
|
||||||
|
local player: Player = assert(Players.LocalPlayer)
|
||||||
|
local STEP_RATE = 30
|
||||||
|
|
||||||
|
local PARTICLE_CLASSES = {
|
||||||
|
Fire = true,
|
||||||
|
Smoke = true,
|
||||||
|
Sparkles = true,
|
||||||
|
ParticleEmitter = true,
|
||||||
|
}
|
||||||
|
|
||||||
|
local FLIP = CFrame.Angles(0, math.pi, 0)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Input Driver
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
local MATH_TAU = math.pi * 2
|
||||||
|
local BUTTON_FEED: { Enum.UserInputState } = {}
|
||||||
|
local BUTTON_A = "BTN_" .. Buttons.A_BUTTON
|
||||||
|
|
||||||
|
local function toStrictNumber(str: string): number
|
||||||
|
local result = tonumber(str)
|
||||||
|
return assert(result, "Invalid number!")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function processAction(id: string, state: Enum.UserInputState)
|
||||||
|
if id == "MarioDebug" then
|
||||||
|
if state == Enum.UserInputState.Begin then
|
||||||
|
local isDebug = not script.Util:GetAttribute("Debug")
|
||||||
|
local character = player.Character
|
||||||
|
|
||||||
|
local rootPart = if character then character.PrimaryPart else nil
|
||||||
|
|
||||||
|
if rootPart then
|
||||||
|
local action = rootPart:FindFirstChild("Action")
|
||||||
|
|
||||||
|
if action and action:IsA("BillboardGui") then
|
||||||
|
action.Enabled = isDebug
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
script.Util:SetAttribute("Debug", isDebug)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local button = toStrictNumber(id:sub(5))
|
||||||
|
BUTTON_FEED[button] = state
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function bindInput(button: number, label: string, ...: InputType)
|
||||||
|
local id = "BTN_" .. button
|
||||||
|
ContextActionService:BindAction(id, processAction, true, ...)
|
||||||
|
|
||||||
|
if UserInputService.TouchEnabled then
|
||||||
|
ContextActionService:SetTitle(id, label)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function updateCollisions()
|
||||||
|
for i, player in Players:GetPlayers() do
|
||||||
|
assert(player:IsA("Player"))
|
||||||
|
|
||||||
|
local rootPart = if player.Character then player.Character.PrimaryPart else nil
|
||||||
|
|
||||||
|
if rootPart then
|
||||||
|
local parts = rootPart:GetConnectedParts(true)
|
||||||
|
|
||||||
|
for i, part in parts do
|
||||||
|
if part:IsA("BasePart") then
|
||||||
|
part.CanCollide = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function updateController(controller: Controller, humanoid: Humanoid)
|
||||||
|
local moveDir = humanoid.MoveDirection
|
||||||
|
local pos = Vector2.new(moveDir.X, -moveDir.Z)
|
||||||
|
local len = math.min(1, pos.Magnitude)
|
||||||
|
|
||||||
|
controller.StickMag = len * 64
|
||||||
|
controller.StickX = pos.X * 64
|
||||||
|
controller.StickY = pos.Y * 64
|
||||||
|
|
||||||
|
humanoid:ChangeState(Enum.HumanoidStateType.Physics)
|
||||||
|
controller.ButtonPressed:Clear()
|
||||||
|
|
||||||
|
if humanoid.Jump then
|
||||||
|
BUTTON_FEED[Buttons.A_BUTTON] = Enum.UserInputState.Begin
|
||||||
|
humanoid.Jump = false
|
||||||
|
elseif controller.ButtonDown:Has(Buttons.A_BUTTON) then
|
||||||
|
BUTTON_FEED[Buttons.A_BUTTON] = Enum.UserInputState.End
|
||||||
|
end
|
||||||
|
|
||||||
|
for button, state in pairs(BUTTON_FEED) do
|
||||||
|
if state == Enum.UserInputState.Begin then
|
||||||
|
controller.ButtonDown:Add(button)
|
||||||
|
controller.ButtonPressed:Add(button)
|
||||||
|
elseif state == Enum.UserInputState.End then
|
||||||
|
controller.ButtonDown:Remove(button)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.clear(BUTTON_FEED)
|
||||||
|
end
|
||||||
|
|
||||||
|
ContextActionService:BindAction("MarioDebug", processAction, false, Enum.KeyCode.P)
|
||||||
|
bindInput(Buttons.B_BUTTON, "B", Enum.UserInputType.MouseButton1, Enum.KeyCode.ButtonX)
|
||||||
|
bindInput(Buttons.Z_TRIG, "Z", Enum.KeyCode.LeftShift, Enum.KeyCode.RightShift, Enum.KeyCode.ButtonL2)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Network Dispatch
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
local Commands = {}
|
||||||
|
|
||||||
|
local lazyNetwork = ReplicatedStorage:WaitForChild("LazyNetwork")
|
||||||
|
assert(lazyNetwork:IsA("RemoteEvent"), "bad lazyNetwork!")
|
||||||
|
|
||||||
|
function Commands.PlaySound(player: Player, name: string)
|
||||||
|
local sound: Sound? = Sounds[name]
|
||||||
|
local character = player.Character
|
||||||
|
|
||||||
|
local rootPart = if character then character.PrimaryPart else nil
|
||||||
|
|
||||||
|
if rootPart and sound then
|
||||||
|
local oldSound: Instance? = rootPart:FindFirstChild(name)
|
||||||
|
|
||||||
|
if oldSound and oldSound:IsA("Sound") and name:find("MARIO") then
|
||||||
|
oldSound.TimePosition = 0
|
||||||
|
else
|
||||||
|
local newSound: Sound = sound:Clone()
|
||||||
|
newSound.Parent = rootPart
|
||||||
|
newSound:Play()
|
||||||
|
|
||||||
|
newSound.Ended:Connect(function()
|
||||||
|
newSound:Destroy()
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Commands.SetParticle(player: Player, name: string, set: boolean)
|
||||||
|
local character = player.Character
|
||||||
|
|
||||||
|
local rootPart = if character then character.PrimaryPart else nil
|
||||||
|
|
||||||
|
if rootPart then
|
||||||
|
local particles = rootPart:FindFirstChild("Particles")
|
||||||
|
|
||||||
|
local inst = if particles then particles:FindFirstChild(name) else nil
|
||||||
|
|
||||||
|
if inst and PARTICLE_CLASSES[inst.ClassName] then
|
||||||
|
local particle = inst :: ParticleEmitter
|
||||||
|
local emit = particle:GetAttribute("Emit")
|
||||||
|
|
||||||
|
if typeof(emit) == "number" then
|
||||||
|
particle:Emit(emit)
|
||||||
|
elseif set ~= nil then
|
||||||
|
particle.Enabled = set
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Commands.SetAngle(player: Player, angle: Vector3int16)
|
||||||
|
local character = player.Character
|
||||||
|
|
||||||
|
local waist = if character then character:FindFirstChild("Waist", true) else nil
|
||||||
|
|
||||||
|
if waist and waist:IsA("Motor6D") then
|
||||||
|
local props = { C1 = Util.ToRotation(-angle) + waist.C1.Position }
|
||||||
|
local tween = TweenService:Create(waist, TweenInfo.new(0.1), props)
|
||||||
|
tween:Play()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function processCommand(player: Player, cmd: string, ...: any)
|
||||||
|
local command = Commands[cmd]
|
||||||
|
|
||||||
|
if command then
|
||||||
|
task.spawn(command, player, ...)
|
||||||
|
else
|
||||||
|
warn("Unknown Command:", cmd, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function networkDispatch(cmd: string, ...: any)
|
||||||
|
lazyNetwork:FireServer(cmd, ...)
|
||||||
|
processCommand(player, cmd, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function onNetworkReceive(target: Player, cmd: string, ...: any)
|
||||||
|
if target ~= player then
|
||||||
|
processCommand(target, cmd, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
lazyNetwork.OnClientEvent:Connect(onNetworkReceive)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Mario Driver
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
local lastUpdate = os.clock()
|
||||||
|
local lastAngle: Vector3int16?
|
||||||
|
|
||||||
|
local mario: Mario = Mario.new()
|
||||||
|
local controller = mario.Controller
|
||||||
|
|
||||||
|
local enumMap = {}
|
||||||
|
local goalCF: CFrame
|
||||||
|
local activeTrack: AnimationTrack?
|
||||||
|
local peakSpeed = 0
|
||||||
|
|
||||||
|
local reset = Instance.new("BindableEvent")
|
||||||
|
reset.Archivable = false
|
||||||
|
reset.Parent = script
|
||||||
|
reset.Name = "Reset"
|
||||||
|
|
||||||
|
while not player.Character do
|
||||||
|
player.CharacterAdded:Wait()
|
||||||
|
end
|
||||||
|
|
||||||
|
local character = assert(player.Character)
|
||||||
|
local pivot = character:GetPivot().Position
|
||||||
|
mario.Position = Util.ToSM64(pivot)
|
||||||
|
|
||||||
|
local function onReset()
|
||||||
|
local roblox = Vector3.yAxis * 100
|
||||||
|
local sm64 = Util.ToSM64(roblox)
|
||||||
|
local char = player.Character
|
||||||
|
|
||||||
|
if char then
|
||||||
|
local reset = char:FindFirstChild("Reset")
|
||||||
|
local cf = CFrame.new(roblox)
|
||||||
|
|
||||||
|
if reset and reset:IsA("RemoteEvent") then
|
||||||
|
reset:FireServer()
|
||||||
|
end
|
||||||
|
|
||||||
|
char:PivotTo(cf)
|
||||||
|
end
|
||||||
|
|
||||||
|
mario.SlideVelX = 0
|
||||||
|
mario.SlideVelZ = 0
|
||||||
|
mario.ForwardVel = 0
|
||||||
|
mario.IntendedYaw = 0
|
||||||
|
|
||||||
|
mario.Position = sm64
|
||||||
|
mario.Velocity = Vector3.zero
|
||||||
|
mario.FaceAngle = Vector3int16.new()
|
||||||
|
|
||||||
|
mario:SetAction(Action.SPAWN_SPIN_AIRBORNE)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update()
|
||||||
|
local character = player.Character
|
||||||
|
|
||||||
|
if not character then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local now = os.clock()
|
||||||
|
local gfxRot = CFrame.identity
|
||||||
|
|
||||||
|
local humanoid = if character then character:FindFirstChildOfClass("Humanoid") else nil
|
||||||
|
|
||||||
|
local simSpeed = tonumber(script:GetAttribute("TimeScale") or nil) or 1
|
||||||
|
local frames = math.floor((now - lastUpdate) * (STEP_RATE * simSpeed))
|
||||||
|
|
||||||
|
if frames > 0 and humanoid then
|
||||||
|
lastUpdate = now
|
||||||
|
updateCollisions()
|
||||||
|
|
||||||
|
for i = 1, math.min(4, frames) do
|
||||||
|
updateController(mario.Controller, humanoid)
|
||||||
|
mario:ExecuteAction()
|
||||||
|
end
|
||||||
|
|
||||||
|
local pos = Util.ToRoblox(mario.Position)
|
||||||
|
local rot = Util.ToRotation(mario.FaceAngle)
|
||||||
|
|
||||||
|
gfxRot = Util.ToRotation(mario.GfxAngle)
|
||||||
|
goalCF = CFrame.new(pos) * FLIP * gfxRot
|
||||||
|
end
|
||||||
|
|
||||||
|
local interp = math.min(1, simSpeed / 2)
|
||||||
|
|
||||||
|
if character and goalCF then
|
||||||
|
local cf = character:GetPivot()
|
||||||
|
local rootPart = character.PrimaryPart
|
||||||
|
local animator = character:FindFirstChildWhichIsA("Animator", true)
|
||||||
|
|
||||||
|
if animator and (mario.AnimDirty or mario.AnimReset) and mario.AnimFrame >= 0 then
|
||||||
|
local anim = mario.AnimCurrent
|
||||||
|
local animSpeed = 0.1 / simSpeed
|
||||||
|
|
||||||
|
if activeTrack and (activeTrack.Animation ~= anim or mario.AnimReset) then
|
||||||
|
activeTrack:Stop(animSpeed)
|
||||||
|
activeTrack = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if not activeTrack and anim then
|
||||||
|
local track = animator:LoadAnimation(anim)
|
||||||
|
track:Play(animSpeed, 1, 0)
|
||||||
|
activeTrack = track
|
||||||
|
end
|
||||||
|
|
||||||
|
if activeTrack then
|
||||||
|
local speed = mario.AnimAccel / 0x10000
|
||||||
|
|
||||||
|
if speed > 0 then
|
||||||
|
activeTrack:AdjustSpeed(speed * simSpeed)
|
||||||
|
else
|
||||||
|
activeTrack:AdjustSpeed(simSpeed)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
mario.AnimDirty = false
|
||||||
|
mario.AnimReset = false
|
||||||
|
end
|
||||||
|
|
||||||
|
if activeTrack and mario.AnimSetFrame > -1 then
|
||||||
|
activeTrack.TimePosition = mario.AnimSetFrame / STEP_RATE
|
||||||
|
mario.AnimSetFrame = -1
|
||||||
|
end
|
||||||
|
|
||||||
|
if rootPart then
|
||||||
|
local action = rootPart:FindFirstChild("Action")
|
||||||
|
local particles = rootPart:FindFirstChild("Particles")
|
||||||
|
local alignPos = rootPart:FindFirstChildOfClass("AlignPosition")
|
||||||
|
local alignCF = rootPart:FindFirstChildOfClass("AlignOrientation")
|
||||||
|
local throw = mario.ThrowMatrix
|
||||||
|
|
||||||
|
if throw then
|
||||||
|
local pos = Util.ToRoblox(throw.Position)
|
||||||
|
goalCF = throw.Rotation * FLIP + pos
|
||||||
|
end
|
||||||
|
|
||||||
|
if alignCF then
|
||||||
|
cf = cf:Lerp(goalCF, interp)
|
||||||
|
alignCF.CFrame = cf.Rotation
|
||||||
|
end
|
||||||
|
|
||||||
|
local debugLabel = if action then action:FindFirstChildOfClass("TextLabel") else nil
|
||||||
|
|
||||||
|
if debugLabel then
|
||||||
|
local actionId = mario.Action()
|
||||||
|
|
||||||
|
local anim = if activeTrack then activeTrack.Animation else nil
|
||||||
|
|
||||||
|
local animName = if anim then anim.Name else nil
|
||||||
|
|
||||||
|
local debugText = "Action: "
|
||||||
|
.. Enums.GetName(Action, actionId)
|
||||||
|
.. "\n"
|
||||||
|
.. "Animation: "
|
||||||
|
.. tostring(animName)
|
||||||
|
.. "\n"
|
||||||
|
.. "ForwardVel: "
|
||||||
|
.. string.format("%.2f", mario.ForwardVel)
|
||||||
|
|
||||||
|
debugLabel.Text = debugText
|
||||||
|
end
|
||||||
|
|
||||||
|
if alignPos then
|
||||||
|
alignPos.Position = cf.Position
|
||||||
|
end
|
||||||
|
|
||||||
|
local bodyState = mario.BodyState
|
||||||
|
local action = mario.Action()
|
||||||
|
|
||||||
|
if action ~= Action.BUTT_SLIDE and action ~= Action.WALKING then
|
||||||
|
bodyState.TorsoAngle *= 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local ang = bodyState.TorsoAngle
|
||||||
|
|
||||||
|
if ang ~= lastAngle then
|
||||||
|
networkDispatch("SetAngle", ang)
|
||||||
|
lastAngle = ang
|
||||||
|
end
|
||||||
|
|
||||||
|
if particles then
|
||||||
|
for name, flag in pairs(ParticleFlags) do
|
||||||
|
local inst = particles:FindFirstChild(name)
|
||||||
|
|
||||||
|
if inst and PARTICLE_CLASSES[inst.ClassName] then
|
||||||
|
local name = inst.Name
|
||||||
|
local particle = inst :: ParticleEmitter
|
||||||
|
|
||||||
|
local emit = particle:GetAttribute("Emit")
|
||||||
|
local hasFlag = mario.ParticleFlags:Has(flag)
|
||||||
|
|
||||||
|
if emit then
|
||||||
|
if hasFlag then
|
||||||
|
networkDispatch("SetParticle", name)
|
||||||
|
end
|
||||||
|
elseif particle.Enabled ~= hasFlag then
|
||||||
|
networkDispatch("SetParticle", name, hasFlag)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for name: string, sound: Sound in pairs(Sounds) do
|
||||||
|
local looped = false
|
||||||
|
|
||||||
|
if sound:IsA("Sound") then
|
||||||
|
if sound.TimeLength == 0 then
|
||||||
|
continue
|
||||||
|
end
|
||||||
|
|
||||||
|
looped = sound.Looped
|
||||||
|
end
|
||||||
|
|
||||||
|
if sound:GetAttribute("Play") then
|
||||||
|
networkDispatch("PlaySound", sound.Name)
|
||||||
|
|
||||||
|
if not looped then
|
||||||
|
sound:SetAttribute("Play", false)
|
||||||
|
end
|
||||||
|
elseif looped then
|
||||||
|
sound:Stop()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
character:PivotTo(cf)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
reset.Event:Connect(onReset)
|
||||||
|
RunService.Heartbeat:Connect(update)
|
||||||
|
|
||||||
|
while task.wait(1) do
|
||||||
|
local success = pcall(function()
|
||||||
|
return StarterGui:SetCore("ResetButtonCallback", reset)
|
||||||
|
end)
|
||||||
|
|
||||||
|
if success then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------
|
33
tools/ImportAnimations.lua
Normal file
33
tools/ImportAnimations.lua
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
local AvatarImportService = game:GetService("AvatarImportService")
|
||||||
|
local resume = Instance.new("BindableEvent")
|
||||||
|
|
||||||
|
for i, anim in pairs(game.ReplicatedFirst.SM64.Assets.Animations:GetChildren()) do
|
||||||
|
local path = "C:/Users/clone/Desktop/MarioAnims/" .. anim.Name .. ".fbx"
|
||||||
|
print("Importing", anim)
|
||||||
|
|
||||||
|
task.defer(function()
|
||||||
|
local success, err = pcall(function()
|
||||||
|
AvatarImportService:ImportFBXAnimationFromFilePathUserMayChooseModel(path, workspace.Mario, function()
|
||||||
|
local bin = game.ServerStorage.AnimSaves
|
||||||
|
local old = bin:FindFirstChild(anim.Name)
|
||||||
|
|
||||||
|
if old then
|
||||||
|
old:Destroy()
|
||||||
|
end
|
||||||
|
|
||||||
|
local kfs = AvatarImportService:ImportLoadedFBXAnimation(false)
|
||||||
|
kfs.Name = anim.Name
|
||||||
|
kfs.Parent = bin
|
||||||
|
|
||||||
|
resume:Fire()
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
if not success then
|
||||||
|
warn("ERROR IMPORTING", anim, err)
|
||||||
|
resume:Fire()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
resume.Event:Wait()
|
||||||
|
end
|
175
tools/RetargetAnimations.lua
Normal file
175
tools/RetargetAnimations.lua
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local ServerStorage = game:GetService("ServerStorage")
|
||||||
|
local StarterCharacter = workspace.StarterCharacter
|
||||||
|
|
||||||
|
local MarioAnim = workspace.MarioAnim
|
||||||
|
local MarioBase = workspace.MarioBase
|
||||||
|
local Player = workspace.Player
|
||||||
|
|
||||||
|
local HIERARCHY: { [string]: { [string]: string }? } = {
|
||||||
|
HumanoidRootPart = { LowerTorso = "Root" },
|
||||||
|
|
||||||
|
LowerTorso = {
|
||||||
|
UpperTorso = "Waist",
|
||||||
|
LeftUpperLeg = "LeftHip",
|
||||||
|
RightUpperLeg = "RightHip",
|
||||||
|
},
|
||||||
|
|
||||||
|
UpperTorso = {
|
||||||
|
Head = "Neck",
|
||||||
|
LeftUpperArm = "LeftShoulder",
|
||||||
|
RightUpperArm = "RightShoulder",
|
||||||
|
},
|
||||||
|
|
||||||
|
LeftUpperArm = { LeftLowerArm = "LeftElbow" },
|
||||||
|
LeftLowerArm = { LeftHand = "LeftWrist" },
|
||||||
|
|
||||||
|
RightUpperArm = { RightLowerArm = "RightElbow" },
|
||||||
|
RightLowerArm = { RightHand = "RightWrist" },
|
||||||
|
|
||||||
|
LeftUpperLeg = { LeftLowerLeg = "LeftKnee" },
|
||||||
|
LeftLowerLeg = { LeftFoot = "LeftAnkle" },
|
||||||
|
|
||||||
|
RightUpperLeg = { RightLowerLeg = "RightKnee" },
|
||||||
|
RightLowerLeg = { RightFoot = "RightAnkle" },
|
||||||
|
}
|
||||||
|
|
||||||
|
local BASE_KEYFRAME = ServerStorage.BASE_KEYFRAME
|
||||||
|
|
||||||
|
local statusHint = Instance.new("Hint")
|
||||||
|
local statusText = "%s [%d/%d]"
|
||||||
|
statusHint.Parent = workspace
|
||||||
|
statusHint.Name = "Status"
|
||||||
|
|
||||||
|
local function updateAnim()
|
||||||
|
StarterCharacter.Humanoid.Animator:StepAnimations(0)
|
||||||
|
Player.Humanoid.Animator:StepAnimations(0)
|
||||||
|
task.wait()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function clearAnims()
|
||||||
|
for i, desc: Instance in pairs(workspace:GetDescendants()) do
|
||||||
|
if desc:IsA("Bone") then
|
||||||
|
desc.Transform = CFrame.identity
|
||||||
|
elseif desc:IsA("Motor6D") then
|
||||||
|
desc.Transform = CFrame.identity
|
||||||
|
elseif desc:IsA("Animator") then
|
||||||
|
task.defer(desc.StepAnimations, desc, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
task.wait()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function applyMotors(at: Instance)
|
||||||
|
local name0 = if at:IsA("Keyframe") then "HumanoidRootPart" else at.Name
|
||||||
|
local part0 = StarterCharacter:FindFirstChild(name0)
|
||||||
|
local data = HIERARCHY[name0]
|
||||||
|
|
||||||
|
if data and part0 and part0:IsA("BasePart") then
|
||||||
|
for name1, motorName in data do
|
||||||
|
local part1 = StarterCharacter:FindFirstChild(name1)
|
||||||
|
|
||||||
|
if part1 and part1:IsA("BasePart") then
|
||||||
|
local att: Attachment = part1:FindFirstChild(motorName .. "RigAttachment")
|
||||||
|
local bone: Bone = MarioBase:FindFirstChild(motorName, true)
|
||||||
|
|
||||||
|
local motor: Motor6D = part1:FindFirstChild(motorName)
|
||||||
|
motor.Transform = att.WorldCFrame:ToObjectSpace(bone.TransformedWorldCFrame)
|
||||||
|
|
||||||
|
local playerMotor = workspace.Player:FindFirstChild(motorName, true)
|
||||||
|
local pose = at:FindFirstChild(name1)
|
||||||
|
|
||||||
|
if playerMotor and playerMotor:IsA("Motor6D") then
|
||||||
|
if motorName:find("Left") or motorName:find("Right") then
|
||||||
|
playerMotor.Transform = motor.Transform.Rotation
|
||||||
|
else
|
||||||
|
playerMotor.Transform = motor.Transform
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
updateAnim()
|
||||||
|
|
||||||
|
if pose and pose:IsA("Pose") then
|
||||||
|
if motorName:find("Left") or motorName:find("Right") then
|
||||||
|
pose.CFrame = motor.Transform.Rotation
|
||||||
|
else
|
||||||
|
pose.CFrame = motor.Transform
|
||||||
|
end
|
||||||
|
|
||||||
|
applyMotors(pose)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function remapKeyframe(keyframe: Keyframe): Keyframe
|
||||||
|
clearAnims()
|
||||||
|
|
||||||
|
for i, desc: Instance in pairs(keyframe:GetDescendants()) do
|
||||||
|
if desc:IsA("Pose") then
|
||||||
|
local bone: Instance? = MarioAnim:FindFirstChild(desc.Name, true)
|
||||||
|
|
||||||
|
if bone and bone:IsA("Bone") then
|
||||||
|
bone.Transform = desc.CFrame
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for i, desc in MarioBase:GetDescendants() do
|
||||||
|
if desc:IsA("Bone") then
|
||||||
|
local anim = MarioAnim:FindFirstChild(desc.Name, true)
|
||||||
|
|
||||||
|
if anim then
|
||||||
|
local offset = desc.TransformedWorldCFrame:ToObjectSpace(anim.TransformedWorldCFrame)
|
||||||
|
desc.Transform = offset
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local newKeyframe = BASE_KEYFRAME:Clone()
|
||||||
|
newKeyframe.Name = keyframe.Name
|
||||||
|
newKeyframe.Time = keyframe.Time
|
||||||
|
applyMotors(newKeyframe)
|
||||||
|
|
||||||
|
return newKeyframe
|
||||||
|
end
|
||||||
|
|
||||||
|
local function remapKeyframeSequence(kfs: KeyframeSequence): KeyframeSequence
|
||||||
|
local keyframes = kfs:GetKeyframes()
|
||||||
|
clearAnims()
|
||||||
|
|
||||||
|
local newKfs = kfs:Clone()
|
||||||
|
newKfs:ClearAllChildren()
|
||||||
|
|
||||||
|
for i, keyframe in keyframes do
|
||||||
|
if keyframe:IsA("Keyframe") then
|
||||||
|
local text = statusText:format(kfs.Name, i, #keyframes)
|
||||||
|
statusHint.Text = text
|
||||||
|
|
||||||
|
local newKeyframe = remapKeyframe(keyframe)
|
||||||
|
newKeyframe.Parent = newKfs
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return newKfs
|
||||||
|
end
|
||||||
|
|
||||||
|
local animSaves = ServerStorage.AnimSaves:GetChildren()
|
||||||
|
local animSavesR15 = ServerStorage.AnimSaves_R15
|
||||||
|
|
||||||
|
table.sort(animSaves, function(a, b)
|
||||||
|
return a.Name < b.Name
|
||||||
|
end)
|
||||||
|
|
||||||
|
for i, animSave in animSaves do
|
||||||
|
if animSave:IsA("KeyframeSequence") then
|
||||||
|
local kfs = remapKeyframeSequence(animSave)
|
||||||
|
kfs.Parent = animSavesR15
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
clearAnims()
|
||||||
|
statusHint:Destroy()
|
316
tools/UploadAnimations.lua
Normal file
316
tools/UploadAnimations.lua
Normal file
|
@ -0,0 +1,316 @@
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- SHA256
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
local band = bit32.band
|
||||||
|
local bnot = bit32.bnot
|
||||||
|
local bxor = bit32.bxor
|
||||||
|
|
||||||
|
local rrotate = bit32.rrotate
|
||||||
|
local rshift = bit32.rshift
|
||||||
|
|
||||||
|
local primes = {
|
||||||
|
0x428a2f98,
|
||||||
|
0x71374491,
|
||||||
|
0xb5c0fbcf,
|
||||||
|
0xe9b5dba5,
|
||||||
|
0x3956c25b,
|
||||||
|
0x59f111f1,
|
||||||
|
0x923f82a4,
|
||||||
|
0xab1c5ed5,
|
||||||
|
0xd807aa98,
|
||||||
|
0x12835b01,
|
||||||
|
0x243185be,
|
||||||
|
0x550c7dc3,
|
||||||
|
0x72be5d74,
|
||||||
|
0x80deb1fe,
|
||||||
|
0x9bdc06a7,
|
||||||
|
0xc19bf174,
|
||||||
|
0xe49b69c1,
|
||||||
|
0xefbe4786,
|
||||||
|
0x0fc19dc6,
|
||||||
|
0x240ca1cc,
|
||||||
|
0x2de92c6f,
|
||||||
|
0x4a7484aa,
|
||||||
|
0x5cb0a9dc,
|
||||||
|
0x76f988da,
|
||||||
|
0x983e5152,
|
||||||
|
0xa831c66d,
|
||||||
|
0xb00327c8,
|
||||||
|
0xbf597fc7,
|
||||||
|
0xc6e00bf3,
|
||||||
|
0xd5a79147,
|
||||||
|
0x06ca6351,
|
||||||
|
0x14292967,
|
||||||
|
0x27b70a85,
|
||||||
|
0x2e1b2138,
|
||||||
|
0x4d2c6dfc,
|
||||||
|
0x53380d13,
|
||||||
|
0x650a7354,
|
||||||
|
0x766a0abb,
|
||||||
|
0x81c2c92e,
|
||||||
|
0x92722c85,
|
||||||
|
0xa2bfe8a1,
|
||||||
|
0xa81a664b,
|
||||||
|
0xc24b8b70,
|
||||||
|
0xc76c51a3,
|
||||||
|
0xd192e819,
|
||||||
|
0xd6990624,
|
||||||
|
0xf40e3585,
|
||||||
|
0x106aa070,
|
||||||
|
0x19a4c116,
|
||||||
|
0x1e376c08,
|
||||||
|
0x2748774c,
|
||||||
|
0x34b0bcb5,
|
||||||
|
0x391c0cb3,
|
||||||
|
0x4ed8aa4a,
|
||||||
|
0x5b9cca4f,
|
||||||
|
0x682e6ff3,
|
||||||
|
0x748f82ee,
|
||||||
|
0x78a5636f,
|
||||||
|
0x84c87814,
|
||||||
|
0x8cc70208,
|
||||||
|
0x90befffa,
|
||||||
|
0xa4506ceb,
|
||||||
|
0xbef9a3f7,
|
||||||
|
0xc67178f2,
|
||||||
|
}
|
||||||
|
|
||||||
|
local function toHex(str: string): string
|
||||||
|
local result = str:gsub(".", function(char)
|
||||||
|
return string.format("%02x", char:byte())
|
||||||
|
end)
|
||||||
|
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
local function toBytes(value: number, length: number)
|
||||||
|
local str = ""
|
||||||
|
|
||||||
|
for i = 1, length do
|
||||||
|
local rem = value % 256
|
||||||
|
str = string.char(rem) .. str
|
||||||
|
value = (value - rem) / 256
|
||||||
|
end
|
||||||
|
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
|
||||||
|
local function digestBlock(msg: string, i: number, hash: { number }, digest: { number })
|
||||||
|
for j = 1, 16 do
|
||||||
|
local offset = i + (j - 1) * 4
|
||||||
|
local a, b, c, d = string.byte(msg, offset, offset + 3)
|
||||||
|
digest[j] = ((a * 256 + b) * 256 + c) * 256 + d
|
||||||
|
end
|
||||||
|
|
||||||
|
for j = 17, 64 do
|
||||||
|
local v = digest[j - 15]
|
||||||
|
local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))
|
||||||
|
|
||||||
|
v = digest[j - 2]
|
||||||
|
digest[j] = digest[j - 16] + s0 + digest[j - 7] + bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))
|
||||||
|
end
|
||||||
|
|
||||||
|
local a, b, c, d, e, f, g, h = table.unpack(hash)
|
||||||
|
|
||||||
|
for i = 1, 64 do
|
||||||
|
local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))
|
||||||
|
local maj = bxor(band(a, b), band(a, c), band(b, c))
|
||||||
|
|
||||||
|
local t2 = s0 + maj
|
||||||
|
local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))
|
||||||
|
|
||||||
|
local ch = bxor(band(e, f), band(bnot(e), g))
|
||||||
|
local t1 = h + s1 + ch + primes[i] + digest[i]
|
||||||
|
|
||||||
|
h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2
|
||||||
|
end
|
||||||
|
|
||||||
|
hash[1] = band(hash[1] + a)
|
||||||
|
hash[2] = band(hash[2] + b)
|
||||||
|
hash[3] = band(hash[3] + c)
|
||||||
|
hash[4] = band(hash[4] + d)
|
||||||
|
hash[5] = band(hash[5] + e)
|
||||||
|
hash[6] = band(hash[6] + f)
|
||||||
|
hash[7] = band(hash[7] + g)
|
||||||
|
hash[8] = band(hash[8] + h)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function sha256(msg: string): string
|
||||||
|
local extra = 64 - ((#msg + 9) % 64)
|
||||||
|
local len = toBytes(8 * #msg, 8)
|
||||||
|
|
||||||
|
msg ..= "\128" .. string.rep("\0", extra) .. len
|
||||||
|
assert(#msg % 64 == 0)
|
||||||
|
|
||||||
|
local hash = {
|
||||||
|
0x6a09e667,
|
||||||
|
0xbb67ae85,
|
||||||
|
0x3c6ef372,
|
||||||
|
0xa54ff53a,
|
||||||
|
0x510e527f,
|
||||||
|
0x9b05688c,
|
||||||
|
0x1f83d9ab,
|
||||||
|
0x5be0cd19,
|
||||||
|
}
|
||||||
|
|
||||||
|
local digest = {}
|
||||||
|
|
||||||
|
for i = 1, #msg, 64 do
|
||||||
|
digestBlock(msg, i, hash, digest)
|
||||||
|
end
|
||||||
|
|
||||||
|
local result = ""
|
||||||
|
|
||||||
|
for i = 1, 8 do
|
||||||
|
local value = hash[i]
|
||||||
|
result = result .. toBytes(value, 4)
|
||||||
|
end
|
||||||
|
|
||||||
|
return toHex(result)
|
||||||
|
end
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Upload Animations
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
local StudioAssetService = game:GetService("StudioAssetService")
|
||||||
|
local ContentProvider = game:GetService("ContentProvider")
|
||||||
|
local HttpService = game:GetService("HttpService")
|
||||||
|
|
||||||
|
local FLIP = CFrame.Angles(0, math.pi, 0)
|
||||||
|
type Params = { [string]: any }
|
||||||
|
|
||||||
|
local function makeQueryString(data: Params)
|
||||||
|
-- NOTE - This function can be used to create a query string of parameters
|
||||||
|
-- at the end of url query, or create a application/form-url-encoded post body string
|
||||||
|
local params = {}
|
||||||
|
|
||||||
|
-- NOTE - Arrays are handled, but generally data is expected to be flat.
|
||||||
|
for key, value in data do
|
||||||
|
if value ~= nil then -- for optional params
|
||||||
|
if type(value) == "table" then
|
||||||
|
for i = 1, #value do
|
||||||
|
local str = HttpService:UrlEncode(value[i])
|
||||||
|
table.insert(params, key .. "=" .. str)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local str = HttpService:UrlEncode(value)
|
||||||
|
table.insert(params, key .. "=" .. str)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(params, "&")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function uploadAnimation(anim: Animation)
|
||||||
|
local loop: boolean = not not (anim:GetAttribute("Loop"))
|
||||||
|
local flip: boolean = not not (anim:GetAttribute("Flip"))
|
||||||
|
|
||||||
|
local kfs: KeyframeSequence = game.ServerStorage.AnimSaves:FindFirstChild(anim.Name)
|
||||||
|
local startFrame: number = tonumber(anim:GetAttribute("StartFrame") or nil) or -1
|
||||||
|
|
||||||
|
if kfs and kfs:IsA("KeyframeSequence") then
|
||||||
|
kfs = kfs:Clone()
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local id = tonumber(anim.AnimationId:match("%d+$"))
|
||||||
|
local params: Params = {}
|
||||||
|
local uploadUrl: string
|
||||||
|
|
||||||
|
if id then
|
||||||
|
uploadUrl = "ide/publish/uploadexistinganimation?"
|
||||||
|
params.assetID = id
|
||||||
|
else
|
||||||
|
uploadUrl = "ide/publish/uploadnewanimation?"
|
||||||
|
params.allowComments = "True"
|
||||||
|
params.assetTypeName = "Animation"
|
||||||
|
params.ispublic = "False"
|
||||||
|
params.isGamesAsset = "False"
|
||||||
|
params.description = ""
|
||||||
|
params.name = anim.Name
|
||||||
|
params.groupId = ""
|
||||||
|
params.AllID = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
local baseUrl = ContentProvider.BaseUrl
|
||||||
|
uploadUrl = baseUrl .. uploadUrl .. makeQueryString(params)
|
||||||
|
|
||||||
|
if not loop then
|
||||||
|
local endAt = kfs:FindFirstChild("End")
|
||||||
|
|
||||||
|
if endAt and endAt:IsA("Keyframe") then
|
||||||
|
local stall = endAt:Clone()
|
||||||
|
stall.Name = "Freeze"
|
||||||
|
stall.Parent = kfs
|
||||||
|
stall.Time = 9999
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if startFrame then
|
||||||
|
local timeDiff = startFrame / 30
|
||||||
|
|
||||||
|
for i, kf in kfs:GetChildren() do
|
||||||
|
if kf:IsA("Keyframe") then
|
||||||
|
kf.Time -= timeDiff
|
||||||
|
|
||||||
|
if kf.Time < 0 then
|
||||||
|
kf:Destroy()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if flip then
|
||||||
|
for i, kf in kfs:GetChildren() do
|
||||||
|
if kf:IsA("Keyframe") then
|
||||||
|
local lowerTorso = kf:FindFirstChild("LowerTorso", true)
|
||||||
|
|
||||||
|
if lowerTorso and lowerTorso:IsA("Pose") then
|
||||||
|
local cf = lowerTorso.CFrame
|
||||||
|
lowerTorso.CFrame = FLIP * cf
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local tmp = Instance.new("Folder")
|
||||||
|
tmp.Parent = workspace
|
||||||
|
tmp.Name = "Upload"
|
||||||
|
kfs.Parent = tmp
|
||||||
|
|
||||||
|
local body = StudioAssetService:SerializeInstances(tmp:GetChildren())
|
||||||
|
local newHash = sha256(body)
|
||||||
|
tmp:Destroy()
|
||||||
|
|
||||||
|
if anim:GetAttribute("UploadHash") ~= newHash then
|
||||||
|
warn("Uploading Animation", anim.Name .. "...")
|
||||||
|
|
||||||
|
local success, response = pcall(function()
|
||||||
|
print("POST", uploadUrl)
|
||||||
|
return game:HttpPostAsync(uploadUrl, body, "application/octet-stream")
|
||||||
|
end)
|
||||||
|
|
||||||
|
if success then
|
||||||
|
anim.AnimationId = "rbxassetid://" .. response
|
||||||
|
anim:SetAttribute("UploadHash", newHash)
|
||||||
|
|
||||||
|
print("\tSuccess!")
|
||||||
|
else
|
||||||
|
print("\tError uploading", anim.Name .. ": ", response)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
warn(anim.Name, "is up to date!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for i, anim in game.ReplicatedFirst.SM64.Assets.Animations:GetChildren() do
|
||||||
|
if anim:IsA("Animation") then
|
||||||
|
uploadAnimation(anim)
|
||||||
|
end
|
||||||
|
end
|
225
tools/extract_anims.py
Normal file
225
tools/extract_anims.py
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
anim_dict = {
|
||||||
|
"4EC690": "SLOW_LEDGE_GRAB",
|
||||||
|
"4ED1D0": "FALL_OVER_BACKWARDS",
|
||||||
|
"4ED1E8": "BACKWARD_AIR_KB",
|
||||||
|
"4EECAC": "DYING_ON_BACK",
|
||||||
|
"4EFED4": "BACKFLIP",
|
||||||
|
"4F08C0": "CLIMB_UP_POLE",
|
||||||
|
"4F2078": "GRAB_POLE_SHORT",
|
||||||
|
"4F2508": "GRAB_POLE_SWING_PART1",
|
||||||
|
"4F2520": "GRAB_POLE_SWING_PART2",
|
||||||
|
"4F38F0": "HANDSTAND_IDLE",
|
||||||
|
"4F43F4": "HANDSTAND_JUMP",
|
||||||
|
"4F440C": "START_HANDSTAND",
|
||||||
|
"4F2BF0": "RETURN_FROM_HANDSTAND",
|
||||||
|
"4F4A64": "IDLE_ON_POLE",
|
||||||
|
"4F4E7C": "A_POSE",
|
||||||
|
"4F4FE0": "SKID_ON_GROUND",
|
||||||
|
"4F4FF8": "STOP_SKID",
|
||||||
|
"4F56EC": "CROUCH_FROM_FAST_LONGJUMP",
|
||||||
|
"4F5C98": "CROUCH_FROM_SLOW_LONGJUMP",
|
||||||
|
"4F62D4": "FAST_LONGJUMP",
|
||||||
|
"4F6A78": "SLOW_LONGJUMP",
|
||||||
|
"4F6FDC": "AIRBORNE_ON_STOMACH",
|
||||||
|
"4F7494": "WALK_WITH_LIGHT_OBJ",
|
||||||
|
"4F870C": "RUN_WITH_LIGHT_OBJ",
|
||||||
|
"4F93A0": "SLOW_WALK_WITH_LIGHT_OBJ",
|
||||||
|
"4FA618": "SHIVERING_WARMING_HAND",
|
||||||
|
"4FBC18": "SHIVERING_RETURN_TO_IDLE",
|
||||||
|
"4FC1A8": "SHIVERING",
|
||||||
|
"4FCDE8": "CLIMB_DOWN_LEDGE",
|
||||||
|
"4FD208": "CREDITS_WAVING",
|
||||||
|
"4FD880": "CREDITS_LOOK_UP",
|
||||||
|
"4FDF90": "CREDITS_RETURN_FROM_LOOK_UP",
|
||||||
|
"4FE3F4": "CREDITS_RAISE_HAND",
|
||||||
|
"5000DC": "CREDITS_LOWER_HAND",
|
||||||
|
"500C24": "CREDITS_TAKE_OFF_CAP",
|
||||||
|
"501410": "CREDITS_START_WALK_LOOK_UP",
|
||||||
|
"50353C": "CREDITS_LOOK_BACK_THEN_RUN",
|
||||||
|
"505AF0": "FINAL_BOWSER_RAISE_HAND_SPIN",
|
||||||
|
"507B58": "FINAL_BOWSER_WING_CAP_TAKE_OFF",
|
||||||
|
"509924": "CREDITS_PEACE_SIGN",
|
||||||
|
"50BD4C": "STAND_UP_FROM_LAVA_BOOST",
|
||||||
|
"50C254": "FIRE_LAVA_BURN",
|
||||||
|
"50C5B0": "WING_CAP_FLY",
|
||||||
|
"50CBA8": "HANG_ON_OWL",
|
||||||
|
"50D2EC": "LAND_ON_STOMACH",
|
||||||
|
"50D304": "FORWARD_AIR_KB",
|
||||||
|
"50EA0C": "DYING_ON_STOMACH",
|
||||||
|
"50F6F4": "SUFFOCATING",
|
||||||
|
"511504": "COUGHING",
|
||||||
|
"512B4C": "THROW_CATCH_KEY",
|
||||||
|
"515604": "DYING_FALL_OVER",
|
||||||
|
"5175EC": "IDLE_ON_LEDGE",
|
||||||
|
"518218": "FAST_LEDGE_GRAB",
|
||||||
|
"518840": "HANG_ON_CEILING",
|
||||||
|
"5197CC": "PUT_CAP_ON",
|
||||||
|
"51A754": "TAKE_CAP_OFF_THEN_ON",
|
||||||
|
"51C314": "QUICKLY_PUT_CAP_ON",
|
||||||
|
"51C774": "HEAD_STUCK_IN_GROUND",
|
||||||
|
"51F90C": "GROUND_POUND_LANDING",
|
||||||
|
"51FB98": "TRIPLE_JUMP_GROUND_POUND",
|
||||||
|
"520160": "START_GROUND_POUND",
|
||||||
|
"520178": "GROUND_POUND",
|
||||||
|
"520594": "BOTTOM_STUCK_IN_GROUND",
|
||||||
|
"52338C": "IDLE_WITH_LIGHT_OBJ",
|
||||||
|
"5240B8": "JUMP_LAND_WITH_LIGHT_OBJ",
|
||||||
|
"524614": "JUMP_WITH_LIGHT_OBJ",
|
||||||
|
"524940": "FALL_LAND_WITH_LIGHT_OBJ",
|
||||||
|
"524E10": "FALL_WITH_LIGHT_OBJ",
|
||||||
|
"524F78": "FALL_FROM_SLIDING_WITH_LIGHT_OBJ",
|
||||||
|
"525318": "SLIDING_ON_BOTTOM_WITH_LIGHT_OBJ",
|
||||||
|
"525330": "STAND_UP_FROM_SLIDING_WITH_LIGHT_OBJ",
|
||||||
|
"5258EC": "RIDING_SHELL",
|
||||||
|
"525D48": "WALKING",
|
||||||
|
"527248": "FORWARD_FLIP",
|
||||||
|
"527870": "JUMP_RIDING_SHELL",
|
||||||
|
"527BEC": "LAND_FROM_DOUBLE_JUMP",
|
||||||
|
"52826C": "DOUBLE_JUMP_FALL",
|
||||||
|
"528620": "SINGLE_JUMP",
|
||||||
|
"528638": "LAND_FROM_SINGLE_JUMP",
|
||||||
|
"5290E4": "AIR_KICK",
|
||||||
|
"529824": "DOUBLE_JUMP_RISE",
|
||||||
|
"529ADC": "START_FORWARD_SPINNING",
|
||||||
|
"529FDC": "THROW_LIGHT_OBJECT",
|
||||||
|
"52A460": "FALL_FROM_SLIDE_KICK",
|
||||||
|
"52AD28": "BEND_KNESS_RIDING_SHELL",
|
||||||
|
"52B360": "LEGS_STUCK_IN_GROUND",
|
||||||
|
"52E078": "GENERAL_FALL",
|
||||||
|
"52E090": "GENERAL_LAND",
|
||||||
|
"52E7BC": "BEING_GRABBED",
|
||||||
|
"52ED0C": "GRAB_HEAVY_OBJECT",
|
||||||
|
"52FA0C": "SLOW_LAND_FROM_DIVE",
|
||||||
|
"5307F0": "FLY_FROM_CANNON",
|
||||||
|
"530BD4": "MOVE_ON_WIRE_NET_RIGHT",
|
||||||
|
"5311D4": "MOVE_ON_WIRE_NET_LEFT",
|
||||||
|
"531760": "MISSING_CAP",
|
||||||
|
"5347C4": "PULL_DOOR_WALK_IN",
|
||||||
|
"535C9C": "PUSH_DOOR_WALK_IN",
|
||||||
|
"536D64": "UNLOCK_DOOR",
|
||||||
|
"539FEC": "START_REACH_POCKET",
|
||||||
|
"53A3E8": "REACH_POCKET",
|
||||||
|
"53AB58": "STOP_REACH_POCKET",
|
||||||
|
"53B14C": "GROUND_THROW",
|
||||||
|
"53B904": "GROUND_KICK",
|
||||||
|
"53C1B4": "FIRST_PUNCH",
|
||||||
|
"53C44C": "SECOND_PUNCH",
|
||||||
|
"53C6B4": "FIRST_PUNCH_FAST",
|
||||||
|
"53CAC4": "SECOND_PUNCH_FAST",
|
||||||
|
"53CFFC": "PICK_UP_LIGHT_OBJ",
|
||||||
|
"53D4BC": "PUSHING",
|
||||||
|
"53DAD4": "START_RIDING_SHELL",
|
||||||
|
"53E0F0": "PLACE_LIGHT_OBJ",
|
||||||
|
"53E674": "FORWARD_SPINNING",
|
||||||
|
"53E68C": "BACKWARD_SPINNING",
|
||||||
|
"53E804": "BREAKDANCE",
|
||||||
|
"53F138": "RUNNING",
|
||||||
|
"53F150": "RUNNING_UNUSED",
|
||||||
|
"54035C": "SOFT_BACK_KB",
|
||||||
|
"540BA4": "SOFT_FRONT_KB",
|
||||||
|
"54141C": "DYING_IN_QUICKSAND",
|
||||||
|
"542758": "IDLE_IN_QUICKSAND",
|
||||||
|
"54320C": "MOVE_IN_QUICKSAND",
|
||||||
|
"545BF8": "ELECTROCUTION",
|
||||||
|
"546B40": "SHOCKED",
|
||||||
|
"546DE8": "BACKWARD_KB",
|
||||||
|
"547834": "FORWARD_KB",
|
||||||
|
"548244": "IDLE_HEAVY_OBJ",
|
||||||
|
"543B40": "STAND_AGAINST_WALL",
|
||||||
|
"549A84": "SIDESTEP_LEFT",
|
||||||
|
"54A9C0": "SIDESTEP_RIGHT",
|
||||||
|
"54BB6C": "START_SLEEP_IDLE",
|
||||||
|
"54CD54": "START_SLEEP_SCRATCH",
|
||||||
|
"54E4F4": "START_SLEEP_YAWN",
|
||||||
|
"54F888": "START_SLEEP_SITTING",
|
||||||
|
"550C30": "SLEEP_IDLE",
|
||||||
|
"550E88": "SLEEP_START_LYING",
|
||||||
|
"551AF4": "SLEEP_LYING",
|
||||||
|
"552224": "DIVE",
|
||||||
|
"55223C": "SLIDE_DIVE",
|
||||||
|
"55283C": "GROUND_BONK",
|
||||||
|
"5534F4": "STOP_SLIDE_LIGHT_OBJ",
|
||||||
|
"5541A4": "SLIDE_KICK",
|
||||||
|
"554540": "CROUCH_FROM_SLIDE_KICK",
|
||||||
|
"554A94": "SLIDE_MOTIONLESS",
|
||||||
|
"554AAC": "STOP_SLIDE",
|
||||||
|
"555214": "FALL_FROM_SLIDE",
|
||||||
|
"55571C": "SLIDE",
|
||||||
|
"55593C": "TIPTOE",
|
||||||
|
"557030": "TWIRL_LAND",
|
||||||
|
"5573A0": "TWIRL",
|
||||||
|
"557504": "START_TWIRL",
|
||||||
|
"557730": "STOP_CROUCHING",
|
||||||
|
"557AEC": "START_CROUCHING",
|
||||||
|
"557DA0": "CROUCHING",
|
||||||
|
"55897C": "CRAWLING",
|
||||||
|
"55A5F8": "STOP_CRAWLING",
|
||||||
|
"55A990": "START_CRAWLING",
|
||||||
|
"55AD1C": "SUMMON_STAR",
|
||||||
|
"55C144": "RETURN_STAR_APPROACH_DOOR",
|
||||||
|
"55C9F0": "BACKWARDS_WATER_KB",
|
||||||
|
"55DAAC": "SWIM_WITH_OBJ_PART1",
|
||||||
|
"55DEC8": "SWIM_WITH_OBJ_PART2",
|
||||||
|
"55E164": "FLUTTERKICK_WITH_OBJ",
|
||||||
|
"55E610": "WATER_ACTION_END_WITH_OBJ",
|
||||||
|
"55ECCC": "STOP_GRAB_OBJ_WATER",
|
||||||
|
"55F800": "WATER_IDLE_WITH_OBJ",
|
||||||
|
"55FF88": "DROWNING_PART1",
|
||||||
|
"5614B8": "DROWNING_PART2",
|
||||||
|
"5627F4": "WATER_DYING",
|
||||||
|
"5634FC": "WATER_FORWARD_KB",
|
||||||
|
"564558": "FALL_FROM_WATER",
|
||||||
|
"564D2C": "SWIM_PART1",
|
||||||
|
"56520C": "SWIM_PART2",
|
||||||
|
"565610": "FLUTTERKICK",
|
||||||
|
"565DD0": "WATER_ACTION_END",
|
||||||
|
"566628": "WATER_PICK_UP_OBJ",
|
||||||
|
"566AF8": "WATER_GRAB_OBJ_PART2",
|
||||||
|
"56747C": "WATER_GRAB_OBJ_PART1",
|
||||||
|
"567748": "WATER_THROW_OBJ",
|
||||||
|
"5681D0": "WATER_IDLE",
|
||||||
|
"568A04": "WATER_STAR_DANCE",
|
||||||
|
"56A478": "RETURN_FROM_WATER_STAR_DANCE",
|
||||||
|
"56ACC4": "GRAB_BOWSER",
|
||||||
|
"56ACDC": "SWINGING_BOWSER",
|
||||||
|
"56B358": "RELEASE_BOWSER",
|
||||||
|
"56C010": "HOLDING_BOWSER",
|
||||||
|
"56C42C": "HEAVY_THROW",
|
||||||
|
"56CD54": "WALK_PANTING",
|
||||||
|
"56D244": "WALK_WITH_HEAVY_OBJ",
|
||||||
|
"56E37C": "TURNING_PART1",
|
||||||
|
"56E394": "TURNING_PART2",
|
||||||
|
"56EAA0": "SLIDEFLIP_LAND",
|
||||||
|
"56EEAC": "SLIDEFLIP",
|
||||||
|
"56F750": "TRIPLE_JUMP_LAND",
|
||||||
|
"5701F8": "TRIPLE_JUMP",
|
||||||
|
"570CB0": "FIRST_PERSON",
|
||||||
|
"5722F4": "IDLE_HEAD_LEFT",
|
||||||
|
"572BA0": "IDLE_HEAD_RIGHT",
|
||||||
|
"57344C": "IDLE_HEAD_CENTER",
|
||||||
|
"573CF8": "HANDSTAND_LEFT",
|
||||||
|
"574490": "HANDSTAND_RIGHT",
|
||||||
|
"5750C0": "WAKE_FROM_SLEEP",
|
||||||
|
"575844": "WAKE_FROM_LYING",
|
||||||
|
"5760EC": "START_TIPTOE",
|
||||||
|
"5769D0": "SLIDEJUMP",
|
||||||
|
"5769E8": "START_WALLKICK",
|
||||||
|
"577064": "STAR_DANCE",
|
||||||
|
"5785B8": "RETURN_FROM_STAR_DANCE",
|
||||||
|
"578C80": "FORWARD_SPINNING_FLIP",
|
||||||
|
"579828": "TRIPLE_JUMP_FLY",
|
||||||
|
}
|
||||||
|
|
||||||
|
for offset, name in anim_dict.items():
|
||||||
|
print("WRITING ANIMATION: " + name + " FROM OFFSET: " + offset)
|
||||||
|
|
||||||
|
subprocess.run([
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 2.91/blender.exe",
|
||||||
|
"C:/Users/clone/Desktop/mario_skel.blend", "-b",
|
||||||
|
"-P", "C:/Users/clone/Desktop/mass_export.py",
|
||||||
|
"--", offset, name
|
||||||
|
])
|
||||||
|
|
||||||
|
print("DONE!")
|
33
tools/mass_export.py
Normal file
33
tools/mass_export.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import bpy
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
from fast64.fast64_internal.sm64 import *
|
||||||
|
argv = sys.argv
|
||||||
|
|
||||||
|
try:
|
||||||
|
index = argv.index("--") + 1
|
||||||
|
except ValueError:
|
||||||
|
index = len(argv)
|
||||||
|
|
||||||
|
argv = argv[index:]
|
||||||
|
|
||||||
|
offset = argv[0]
|
||||||
|
name = argv[1]
|
||||||
|
|
||||||
|
romfileSrc = open("C:/Users/clone/Downloads/Super Mario 64 (USA)/sm64.z64", 'rb')
|
||||||
|
mario_geo = bpy.data.objects['mario_geo']
|
||||||
|
|
||||||
|
levelParsed = sm64_level_parser.parseLevelAtPointer(romfileSrc, sm64_level_parser.level_pointers[bpy.context.scene.levelAnimImport])
|
||||||
|
segmentData = levelParsed.segmentData
|
||||||
|
|
||||||
|
animStart = int(offset, 16)
|
||||||
|
sm64_anim.importAnimationToBlender(romfileSrc, animStart, mario_geo, segmentData, True)
|
||||||
|
|
||||||
|
bpy.ops.export_scene.fbx(filepath="C:/Users/clone/Desktop/MarioAnims/" + name + ".fbx", add_leaf_bones=False, global_scale=3)
|
||||||
|
mario_geo.animation_data_clear()
|
||||||
|
|
||||||
|
print("Exported: " + name)
|
||||||
|
romfileSrc.close()
|
||||||
|
|
||||||
|
bpy.ops.wm.quit_blender()
|
Loading…
Reference in a new issue