mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-29 23:43:01 +00:00
124 lines
3.5 KiB
Lua
124 lines
3.5 KiB
Lua
define_custom_obj_fields({
|
|
oArenaSpringSprung = 'u32',
|
|
})
|
|
|
|
function bhv_arena_spring_child_init(obj)
|
|
obj.oHomeX = obj.oPosX
|
|
obj.oHomeY = obj.oPosY
|
|
obj.oHomeZ = obj.oPosZ
|
|
end
|
|
|
|
function bhv_arena_spring_child_loop(obj)
|
|
local p = obj.parentObj
|
|
if p == nil then
|
|
return
|
|
end
|
|
|
|
local pitch = obj.oFaceAnglePitch + 16384
|
|
local yaw = obj.oFaceAngleYaw + 32768
|
|
|
|
local vel = {
|
|
x = coss(pitch) * sins(yaw),
|
|
y = sins(pitch),
|
|
z = coss(pitch) * coss(yaw),
|
|
}
|
|
|
|
vec3f_normalize(vel)
|
|
vec3f_mul(vel, 110 * p.header.gfx.scale.y)
|
|
|
|
obj.oPosX = obj.oHomeX + vel.x
|
|
obj.oPosY = obj.oHomeY + vel.y
|
|
obj.oPosZ = obj.oHomeZ + vel.z
|
|
end
|
|
|
|
id_bhvArenaSpringChild = hook_behavior(nil, OBJ_LIST_DEFAULT, true, nil, bhv_arena_spring_child_loop, 'id_bhvArenaSpringChild')
|
|
|
|
------------------------------------
|
|
|
|
function bhv_arena_spring_init(obj)
|
|
obj.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
|
|
obj.oOpacity = 255
|
|
obj_set_model_extended(obj, E_MODEL_SPRING_BOTTOM)
|
|
spawn_non_sync_object(id_bhvArenaSpringChild, E_MODEL_SPRING_TOP, obj.oPosX, obj.oPosY, obj.oPosZ, function(c)
|
|
c.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
|
|
c.parentObj = obj
|
|
c.oOpacity = 255
|
|
c.oFaceAnglePitch = obj.oFaceAnglePitch
|
|
c.oFaceAngleYaw = obj.oFaceAngleYaw
|
|
c.oFaceAngleRoll = obj.oFaceAngleRoll
|
|
end)
|
|
network_init_object(obj, false, {
|
|
'oArenaSpringSprung'
|
|
})
|
|
end
|
|
|
|
function bhv_arena_spring_launch(obj)
|
|
local m = gMarioStates[0]
|
|
local behParams = obj.oBehParams
|
|
local strength = behParams & 0xFF
|
|
local pitchAdjust = ((behParams >> 8) & 0xFF) * 0.01
|
|
if pitchAdjust == 0 then pitchAdjust = 1 end
|
|
|
|
local opitch = obj.oFaceAnglePitch
|
|
local pitch = opitch * pitchAdjust + 16384
|
|
local yaw = obj.oFaceAngleYaw + 32768
|
|
|
|
local vel = {
|
|
x = coss(pitch) * sins(yaw),
|
|
y = sins(pitch),
|
|
z = coss(pitch) * coss(yaw),
|
|
}
|
|
|
|
vec3f_normalize(vel)
|
|
vec3f_mul(vel, 300)
|
|
|
|
spawn_non_sync_object(id_bhvTriangleParticleSpawner, E_MODEL_NONE,
|
|
obj.oPosX + vel.x,
|
|
obj.oPosY + vel.y,
|
|
obj.oPosZ + vel.z,
|
|
nil)
|
|
|
|
vec3f_normalize(vel)
|
|
vec3f_mul(vel, strength)
|
|
|
|
if math.abs(opitch) >= 2500 then
|
|
set_mario_action(m, ACT_SHOT_FROM_CANNON, 0)
|
|
m.vel.y = vel.y
|
|
m.faceAngle.y = yaw
|
|
m.forwardVel = math.sqrt((vel.x * vel.x) + vel.z * vel.z)
|
|
else
|
|
set_mario_action(m, ACT_TRIPLE_JUMP, 0)
|
|
m.vel.y = vel.y
|
|
m.forwardVel = 0
|
|
end
|
|
obj.oArenaSpringSprung = 15
|
|
network_send_object(obj, false)
|
|
end
|
|
|
|
function bhv_arena_spring_loop(obj)
|
|
local player = gMarioStates[0].marioObj
|
|
local dist = math.sqrt((obj.oPosX - player.oPosX) ^ 2 + (obj.oPosY - player.oPosY) ^ 2 + (obj.oPosZ - player.oPosZ) ^ 2)
|
|
if dist < 160 and mario_health_float(gMarioStates[0]) > 0 then
|
|
bhv_arena_spring_launch(obj)
|
|
end
|
|
if obj.oArenaSpringSprung > 0 then
|
|
obj.oArenaSpringSprung = obj.oArenaSpringSprung - 1
|
|
end
|
|
local sprung = obj.oArenaSpringSprung
|
|
local sx = 15 - sprung
|
|
scale = 0
|
|
|
|
if sx == 1 then
|
|
cur_obj_play_sound_2(SOUND_GENERAL_POUND_ROCK)
|
|
end
|
|
|
|
if sx < 3 then
|
|
scale = (sx/5) + 2/5
|
|
else
|
|
scale = 1 - ((sx - 3) / 12)
|
|
scale = scale * scale
|
|
end
|
|
obj.header.gfx.scale.y = scale * scale + 0.1
|
|
end
|
|
|
|
id_bhvArenaSpring = hook_behavior(nil, OBJ_LIST_DEFAULT, true, bhv_arena_spring_init, bhv_arena_spring_loop, 'id_bhvArenaSpring')
|