95 lines
2.4 KiB
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)
|