sm64ex-coop/mods/star-road/helpers.lua

194 lines
5.6 KiB
Lua

_G.switch = function(param, case_table)
local case = case_table[param]
if case then return case() end
local def = case_table['default']
return def and def() or nil
end
--------------
function get_star_count()
local courseMax = 25
local courseMin = 1
return save_file_get_total_star_count(get_current_save_file_num() - 1, courseMin - 1, courseMax - 1)
end
function despawn_if_stars_below_count(obj, count)
if get_star_count() < count then
obj_mark_for_deletion(obj)
end
end
function get_mario_from_global_index(index)
local marioState = nil
for i = 0, (MAX_PLAYERS - 1) do
marioState = gMarioStates[i]
if gNetworkPlayers[i].globalIndex == index then
return marioState
end
end
return gMarioStates[0]
end
function check_mario_attacking(obj, mario)
local marioObject = mario.marioObj
if not (obj_check_if_collided_with_object(obj, marioObject) == 0) then
if abs_angle_diff(obj.oMoveAngleYaw, marioObject.oMoveAngleYaw) > 0x6000 then
if mario.action == ACT_SLIDE_KICK then
return 1
end
if mario.action == ACT_PUNCHING then
return 1
end
if mario.action == ACT_MOVE_PUNCHING then
return 1
end
if mario.action == ACT_SLIDE_KICK_SLIDE then
return 1
end
if mario.action == ACT_JUMP_KICK then
return 2
end
if mario.action == ACT_WALL_KICK_AIR then
return 2
end
end
end
return 0
end
function check_local_mario_attacking(obj)
return check_mario_attacking(obj, gMarioStates[0])
end
--------------
-- Replacement for lll_octagonal_mesh_find_y_offset()
function find_y_offset_for_sinking_platform(obj, sinkOffset, a3)
if not (cur_obj_is_any_player_on_platform() == 0) then
if obj.oSinkWhenSteppedOnUnk104 < 0x4000 then
obj.oSinkWhenSteppedOnUnk104 = obj.oSinkWhenSteppedOnUnk104 + sinkOffset
else
obj.oSinkWhenSteppedOnUnk104 = 0x4000
end
else
if obj.oSinkWhenSteppedOnUnk104 > 0 then
obj.oSinkWhenSteppedOnUnk104 = obj.oSinkWhenSteppedOnUnk104 - sinkOffset
else
obj.oSinkWhenSteppedOnUnk104 = 0
end
end
local yOffset = sins(obj.oSinkWhenSteppedOnUnk104) * a3
return yOffset
end
-- Replacement for bhv_lll_sinking_rock_block_loop()
function sinking_perform_sink_check(obj)
local yOffset = find_y_offset_for_sinking_platform(obj, 124, -110)
obj.oGraphYOffset = 0
obj.oPosY = obj.oHomeY + yOffset
end
-- Replacement for native create_sound_spawner()
function create_sound_spawner(obj, soundId)
local soundObj = spawn_non_sync_object(id_bhvSoundSpawner, 0, 0, 0, 0, nil);
if soundObj == nil then
return
end
obj_copy_pos_and_angle(soundObj, obj)
soundObj.oSoundEffectUnkF4 = soundId
end
-- Replacement for spawn_object_abs_with_rot()
function spawn_object_abs_with_rot(parent, uselessArg, modelId, bhvId, x, y, z, rx, ry, rz)
local childObj = spawn_non_sync_object(bhvId, modelId, 0, 0, 0, nil);
if childObj == nil then
return nil
end
childObj.parentObj = parent
childObj.header.gfx.areaIndex = parent.header.gfx.areaIndex
childObj.header.gfx.activeAreaIndex = parent.header.gfx.areaIndex
childObj.globalPlayerIndex = 0
obj_set_pos(childObj, x, y, z);
obj_set_angle(childObj, rx, ry, rz);
return childObj
end
function spawn_sync_object_abs_with_rot(parent, uselessArg, modelId, bhvId, x, y, z, rx, ry, rz)
local childObj = spawn_sync_object(bhvId, modelId, 0, 0, 0, nil);
if childObj == nil then
return nil
end
childObj.parentObj = parent
childObj.header.gfx.areaIndex = parent.header.gfx.areaIndex
childObj.header.gfx.activeAreaIndex = parent.header.gfx.areaIndex
childObj.globalPlayerIndex = 0
obj_set_pos(childObj, x, y, z);
obj_set_angle(childObj, rx, ry, rz);
return childObj
end
--------------
-- Replacement for SET_HOME()
function object_set_home(obj)
obj.oHomeX = obj.oPosX;
obj.oHomeY = obj.oPosY;
obj.oHomeZ = obj.oPosZ;
end
-- Replacement for SET_OBJ_PHYSICS()
function object_set_physics(obj, hitboxRadius, gravity, bounciness, dragStrength, friction, buoyancy)
obj.oWallHitboxRadius = hitboxRadius;
obj.oGravity = gravity / 100;
obj.oBounciness = bounciness / 100;
obj.oDragStrength = dragStrength / 100;
obj.oFriction = friction / 100;
obj.oBuoyancy = buoyancy / 100;
end
-- Replacement for DROP_TO_FLOOR()
function object_drop_to_floor(obj)
local x = obj.oPosX;
local y = obj.oPosY;
local z = obj.oPosZ;
local floorHeight = find_floor_height(x, y + 200, z);
obj.oPosY = floorHeight;
obj.oMoveFlags = (obj.oMoveFlags | OBJ_MOVE_ON_GROUND);
end
-- Replacement for SPAWN_CHILD_WITH_PARAM()
function spawn_child_with_param(obj, bhvParam, modelId, bhvId)
local childObj = spawn_non_sync_object(bhvId, modelId, 0, 0, 0, nil);
if childObj == nil then
--print("Failed to spawn child object with parameters.")
return nil
end
obj_copy_pos_and_angle(childObj, obj)
childObj.oBehParams2ndByte = bhvParam;
return childObj
end
function spawn_sync_child_with_param(obj, bhvParam, modelId, bhvId)
local childObj = spawn_sync_object(bhvId, modelId, 0, 0, 0, nil);
if childObj == nil then
--print("Failed to spawn synced child object with parameters.")
return nil
end
obj_copy_pos_and_angle(childObj, obj)
childObj.oBehParams2ndByte = bhvParam;
return childObj
end