mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-01-22 15:43:18 -05:00
111 lines
No EOL
3.2 KiB
Lua
111 lines
No EOL
3.2 KiB
Lua
--- @param caseTable table
|
|
function switch(param, caseTable)
|
|
local case = caseTable[param]
|
|
if case then return case() end
|
|
local def = caseTable['default']
|
|
return def and def() or nil
|
|
end
|
|
|
|
--------------
|
|
|
|
function get_star_count()
|
|
return save_file_get_total_star_count(get_current_save_file_num() - 1, COURSE_MIN - 1, COURSE_MAX - 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 spawn_object_abs_with_rot()
|
|
function spawn_object_abs_with_rot(parent, _, 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 |