sm64ex-coop/mods/shell-rush/race-ring.lua

95 lines
2.4 KiB
Lua

define_custom_obj_fields({
oWaypointIndex = 'u32',
})
function bhv_race_ring_init(obj)
obj.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
obj_scale(obj, 4)
obj_set_billboard(obj)
obj.oOpacity = 200
end
function bhv_race_ring_inactive(obj)
obj_scale(obj, 1)
obj.oOpacity = 64
local waypoint = get_waypoint(obj.oWaypointIndex)
obj_set_vec3f(obj, waypoint)
local cur = gPlayerSyncTable[0].waypoint
local nex = get_waypoint_index(cur + 1)
if cur == obj.oWaypointIndex then
obj.oAction = 1
cur_obj_unhide()
elseif nex == obj.oWaypointIndex then
cur_obj_unhide()
else
cur_obj_hide()
end
end
function bhv_race_ring_active(obj)
local player = gMarioStates[0].marioObj
local distanceToPlayer = dist_between_objects(obj, player)
cur_obj_unhide()
obj_scale(obj, 4)
obj.oOpacity = 200
local waypoint = get_waypoint(obj.oWaypointIndex)
obj_set_vec3f(obj, waypoint)
if distanceToPlayer < 573 then
obj.oAction = 2
local s = gPlayerSyncTable[0]
if s.waypoint == obj.oWaypointIndex then
if s.waypoint == 1 then
race_increment_lap()
end
s.waypoint = get_waypoint_index(obj.oWaypointIndex + 1)
end
cur_obj_play_sound_2(SOUND_GENERAL_COIN)
end
end
function bhv_race_ring_shrinking(obj)
local scalar = 1 - (obj.oTimer / (30 * 3))
scalar = scalar * scalar
scalar = scalar * scalar
scalar = scalar * scalar
cur_obj_unhide()
obj_scale(obj, 4 * scalar)
obj.oOpacity = 200 * scalar
local waypoint = get_waypoint(obj.oWaypointIndex)
local nextWaypoint = get_waypoint(obj.oWaypointIndex + 1)
local wpos = vec3f_tween(nextWaypoint, waypoint, scalar)
obj_set_vec3f(obj, wpos)
spawn_non_sync_object(id_bhvTriangleParticleSpawner, E_MODEL_NONE,
obj.oPosX + 300 * (math.random() - 0.5) * scalar,
obj.oPosY + 300 * (math.random() - 0.5) * scalar,
obj.oPosZ + 300 * (math.random() - 0.5) * scalar,
nil)
if scalar <= 0.05 then
obj.oAction = 0
end
end
function bhv_race_ring_loop(obj)
if obj.oAction == 0 then
bhv_race_ring_inactive(obj)
elseif obj.oAction == 1 then
bhv_race_ring_active(obj)
elseif obj.oAction == 2 then
bhv_race_ring_shrinking(obj)
end
end
id_bhvRaceRing = hook_behavior(nil, OBJ_LIST_LEVEL, true, bhv_race_ring_init, bhv_race_ring_loop)