mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	Star Road code overhaul
This commit is contained in:
		
							parent
							
								
									183018cf3c
								
							
						
					
					
						commit
						44e32f8bf2
					
				
					 8 changed files with 363 additions and 428 deletions
				
			
		| 
						 | 
				
			
			@ -1,71 +1,79 @@
 | 
			
		|||
-- We use this instead of o->oHiddenStarLastInteractedObject.
 | 
			
		||||
oHiddenStarLastInteractedPlayer = nil
 | 
			
		||||
E_MODEL_VCUTM_LIGHT = smlua_model_util_get_id("vcutm_light_geo")
 | 
			
		||||
COL_WF_SMALL_BOMP = smlua_collision_util_get("wf_seg7_collision_small_bomp")
 | 
			
		||||
 | 
			
		||||
function bhv_custom_hidden_star_trigger_init(obj)
 | 
			
		||||
    network_init_object(obj, true, { 'activeFlags', 'oInteractStatus' })
 | 
			
		||||
-- we use this instead of o->oHiddenStarLastInteractedObject
 | 
			
		||||
local oHiddenStarLastInteractedPlayer = nil
 | 
			
		||||
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_custom_hidden_star_trigger_init(o)
 | 
			
		||||
    network_init_object(o, true, { "activeFlags", "oInteractStatus" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_custom_hidden_star_trigger_loop(obj)
 | 
			
		||||
    if not ((obj.oInteractStatus & INT_STATUS_INTERACTED) == 0) or obj_check_if_collided_with_object(obj, gMarioStates[0].marioObj) == 1 then
 | 
			
		||||
        local hiddenStar = obj_get_nearest_object_with_behavior_id(obj, bhvSMSRHiddenStar)
 | 
			
		||||
        if not (hiddenStar == nil) then
 | 
			
		||||
            local count = (obj_count_objects_with_behavior_id(bhvSMSRHiddenStarTrigger) - 1)
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_custom_hidden_star_trigger_loop(o)
 | 
			
		||||
    if (o.oInteractStatus & INT_STATUS_INTERACTED) ~= 0 or obj_check_if_collided_with_object(o, gMarioStates[0].marioObj) ~= 0 then
 | 
			
		||||
        local hiddenStar = obj_get_nearest_object_with_behavior_id(o, bhvSMSRHiddenStar)
 | 
			
		||||
        if hiddenStar ~= nil then
 | 
			
		||||
            local count = obj_count_objects_with_behavior_id(bhvSMSRHiddenStarTrigger) - 1
 | 
			
		||||
            hiddenStar.oHiddenStarTriggerCounter = 5 - count
 | 
			
		||||
 | 
			
		||||
            if not (hiddenStar.oHiddenStarTriggerCounter == 5) then
 | 
			
		||||
            if hiddenStar.oHiddenStarTriggerCounter ~= 5 then
 | 
			
		||||
                spawn_orange_number(hiddenStar.oHiddenStarTriggerCounter, 0, 0, 0)
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            -- Set the last person who interacted with a secret to the 
 | 
			
		||||
            -- parent so only they get the star cutscene.
 | 
			
		||||
            player = nearest_mario_state_to_object(obj)
 | 
			
		||||
            if not (player == nil) then
 | 
			
		||||
            -- set the last person who interacted with a secret to the parent so only they get the star cutscene
 | 
			
		||||
            player = nearest_mario_state_to_object(o)
 | 
			
		||||
            if player ~= nil then
 | 
			
		||||
                oHiddenStarLastInteractedPlayer = player
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            cur_obj_play_sound_2(SOUND_MENU_COLLECT_SECRET + ((hiddenStar.oHiddenStarTriggerCounter - 1) << 16))
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        obj.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
        o.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_custom_hidden_star_init(obj)
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_custom_hidden_star_init(o)
 | 
			
		||||
    local count = obj_count_objects_with_behavior_id(bhvSMSRHiddenStarTrigger)
 | 
			
		||||
    if count == 0 then
 | 
			
		||||
        local star = spawn_object_abs_with_rot(obj, 0, E_MODEL_STAR, id_bhvStar, obj.oPosX, obj.oPosY, obj.oPosZ, 0, 0, 0)
 | 
			
		||||
        if not (star == nil) then
 | 
			
		||||
            star.oBehParams = obj.oBehParams
 | 
			
		||||
        local star = spawn_object_abs_with_rot(o, 0, E_MODEL_STAR, id_bhvStar, o.oPosX, o.oPosY, o.oPosZ, 0, 0, 0)
 | 
			
		||||
        if star ~= nil then
 | 
			
		||||
            star.oBehParams = o.oBehParams
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        obj.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
        o.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    obj.oHiddenStarTriggerCounter = 5 - count
 | 
			
		||||
    o.oHiddenStarTriggerCounter = 5 - count
 | 
			
		||||
 | 
			
		||||
    -- We haven't interacted with a player yet.
 | 
			
		||||
    -- we haven't interacted with a player yet.
 | 
			
		||||
    -- We also don't sync this as not only is it not required
 | 
			
		||||
    -- but it also is only set for an interaction.
 | 
			
		||||
    -- Therefore this object must already be loaded for it to be set
 | 
			
		||||
    -- and if it wasn't. You couldn't of possibly been the one
 | 
			
		||||
    -- who last interacted to begin with.
 | 
			
		||||
    -- who last interacted to begin with
 | 
			
		||||
    --
 | 
			
		||||
    -- coding™
 | 
			
		||||
    oHiddenStarLastInteractedPlayer = nil
 | 
			
		||||
 | 
			
		||||
    network_init_object(obj, false, { 'oAction', 'oHiddenStarTriggerCounter', 'oPosX', 'oPosY', 'oPosZ', 'oTimer' })
 | 
			
		||||
    network_init_object(o, false, { "oAction", "oHiddenStarTriggerCounter", "oPosX", "oPosY", "oPosZ", "oTimer" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_custom_hidden_star_loop(obj)
 | 
			
		||||
    switch(obj.oAction, {
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_custom_hidden_star_loop(o)
 | 
			
		||||
    switch(o.oAction, {
 | 
			
		||||
        [0] = function() -- for case 0
 | 
			
		||||
            if obj.oHiddenStarTriggerCounter == 5 then
 | 
			
		||||
                obj.oAction = 1
 | 
			
		||||
            if o.oHiddenStarTriggerCounter == 5 then
 | 
			
		||||
                o.oAction = 1
 | 
			
		||||
            end
 | 
			
		||||
        end,
 | 
			
		||||
        [1] = function() -- for case 1
 | 
			
		||||
            if obj.oTimer > 2 then
 | 
			
		||||
                star = spawn_red_coin_cutscene_star(obj.oPosX, obj.oPosY, obj.oPosZ)
 | 
			
		||||
            if o.oTimer > 2 then
 | 
			
		||||
                star = spawn_red_coin_cutscene_star(o.oPosX, o.oPosY, o.oPosZ)
 | 
			
		||||
                if not (star == nil) then
 | 
			
		||||
                    if oHiddenStarLastInteractedPlayer == gMarioStates[0] then
 | 
			
		||||
                        star.oStarSpawnExtCutsceneFlags = 1
 | 
			
		||||
| 
						 | 
				
			
			@ -74,7 +82,7 @@ function bhv_custom_hidden_star_loop(obj)
 | 
			
		|||
                    end
 | 
			
		||||
                    spawn_mist_particles()
 | 
			
		||||
                end
 | 
			
		||||
                obj.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
                o.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
            end
 | 
			
		||||
        end,
 | 
			
		||||
    })
 | 
			
		||||
| 
						 | 
				
			
			@ -82,195 +90,217 @@ end
 | 
			
		|||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_breakable_rock_init(obj)
 | 
			
		||||
    network_init_object(obj, false, nil)
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_breakable_rock_init(o)
 | 
			
		||||
    network_init_object(o, false, nil)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_breakable_window_init(obj)
 | 
			
		||||
    obj.collisionData = smlua_collision_util_get("wf_seg7_collision_small_bomp")
 | 
			
		||||
    network_init_object(obj, false, { 'oFlags', 'oInteractStatus' });
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_breakable_window_init(o)
 | 
			
		||||
    o.collisionData = COL_WF_SMALL_BOMP
 | 
			
		||||
    network_init_object(o, false, { "oFlags", "oInteractStatus" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_breakable_window_loop(obj)
 | 
			
		||||
    if not (obj.oInteractStatus & INT_STATUS_INTERACTED) or not (obj.oInteractStatus & INT_STATUS_WAS_ATTACKED) then
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_breakable_window_loop(o)
 | 
			
		||||
    if (o.oInteractStatus & INT_STATUS_INTERACTED) == 0 or (o.oInteractStatus & INT_STATUS_WAS_ATTACKED) == 0 then
 | 
			
		||||
        return
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if not (check_local_mario_attacking(obj) == 0) then
 | 
			
		||||
    if check_local_mario_attacking(o) ~= 0 then
 | 
			
		||||
        obj_explode_and_spawn_coins(80, 0)
 | 
			
		||||
        create_sound_spawner(obj, SOUND_GENERAL_WALL_EXPLOSION)
 | 
			
		||||
        create_sound_spawner(SOUND_GENERAL_WALL_EXPLOSION)
 | 
			
		||||
 | 
			
		||||
        obj.oInteractStatus = 0;
 | 
			
		||||
        o.oInteractStatus = 0
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_star_replica_init(obj)
 | 
			
		||||
    despawn_if_stars_below_count(obj, 121) -- 121 star check
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_star_replica_init(o)
 | 
			
		||||
    despawn_if_stars_below_count(o, 121) -- 121 star check
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_red_sinking_platform_init(obj)
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_red_sinking_platform_init(o)
 | 
			
		||||
    cur_obj_set_home_once()
 | 
			
		||||
    network_init_object(obj, true, { 'oSinkWhenSteppedOnUnk104', 'oGraphYOffset', 'oHomeY' })
 | 
			
		||||
    network_init_object(o, true, { "oSinkWhenSteppedOnUnk104", "oGraphYOffset", "oHomeY" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_star_door_wall_loop(obj)
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_star_door_wall_loop(o)
 | 
			
		||||
    if get_star_count() >= 30 then
 | 
			
		||||
        obj.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
        o.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_special_breakable_box_init(obj)
 | 
			
		||||
    despawn_if_stars_below_count(obj, 121) -- 121 star check
 | 
			
		||||
    network_init_object(obj, false, nil);
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_special_breakable_box_init(o)
 | 
			
		||||
    despawn_if_stars_below_count(o, 121) -- 121 star check
 | 
			
		||||
    network_init_object(o, false, nil)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_piranha_plant_wild_loop(obj)
 | 
			
		||||
-- why even make an init function
 | 
			
		||||
function bhv_piranha_plant_wild_loop()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_big_leaves_init(obj)
 | 
			
		||||
-- why even make an init function
 | 
			
		||||
function bhv_big_leaves_init()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_lily_pad_init(obj)
 | 
			
		||||
    network_init_object(obj, true, { 'oSinkWhenSteppedOnUnk104', 'oGraphYOffset', 'oHomeY' })
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_lily_pad_init(o)
 | 
			
		||||
    network_init_object(o, true, { "oSinkWhenSteppedOnUnk104", "oGraphYOffset", "oHomeY" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_tambourine_init(obj)
 | 
			
		||||
    network_init_object(obj, false, nil);
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_tambourine_init(o)
 | 
			
		||||
    network_init_object(o, false, nil)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_small_bee_init(obj)
 | 
			
		||||
    network_init_object(obj, false, nil);
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_small_bee_init(o)
 | 
			
		||||
    network_init_object(o, false, nil)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_star_moving_init(obj)
 | 
			
		||||
    network_init_object(obj, false, nil);
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_star_moving_init(o)
 | 
			
		||||
    network_init_object(o, false, nil)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_falling_domino_init(obj)
 | 
			
		||||
    network_init_object(obj, false, nil);
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_falling_domino_init(o)
 | 
			
		||||
    network_init_object(o, false, nil)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_lava_lift_init(obj)
 | 
			
		||||
    network_init_object(obj, false, nil);
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_lava_lift_init(o)
 | 
			
		||||
    network_init_object(o, false, nil)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_rotating_lava_platform_init(obj)
 | 
			
		||||
    network_init_object(obj, false, nil);
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_rotating_lava_platform_init(o)
 | 
			
		||||
    network_init_object(o, false, nil)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_sinking_donut_init(obj)
 | 
			
		||||
    network_init_object(obj, true, { 'oSinkWhenSteppedOnUnk104', 'oGraphYOffset', 'oHomeY' })
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_sinking_donut_init(o)
 | 
			
		||||
    network_init_object(o, true, { "oSinkWhenSteppedOnUnk104", "oGraphYOffset", "oHomeY" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_sinking_donut_loop(obj)
 | 
			
		||||
    sinking_perform_sink_check(obj)
 | 
			
		||||
    sinking_perform_sink_check(obj) -- called twice
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_sinking_donut_loop(o)
 | 
			
		||||
    sinking_perform_sink_check(o)
 | 
			
		||||
    sinking_perform_sink_check(o) -- called twice
 | 
			
		||||
end
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_floating_thwomp_init(obj)
 | 
			
		||||
    network_init_object(obj, true, { 'oHomeX', 'oHomeY', 'oHomeZ', 'oAction', 'oPosX', 'oPosY', 'oPosZ', 'oVelX', 'oVelY', 'oVelZ' })
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_floating_thwomp_init(o)
 | 
			
		||||
    network_init_object(o, true, { "oHomeX", "oHomeY", "oHomeZ", "oAction", "oPosX", "oPosY", "oPosZ", "oVelX", "oVelY", "oVelZ" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_toxic_waste_platform_init(obj)
 | 
			
		||||
    network_init_object(obj, true, { 'oSinkWhenSteppedOnUnk104', 'oGraphYOffset', 'oHomeY' })
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_toxic_waste_platform_init(o)
 | 
			
		||||
    network_init_object(o, true, { "oSinkWhenSteppedOnUnk104", "oGraphYOffset", "oHomeY" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_toxic_waste_platform_loop(obj)
 | 
			
		||||
    sinking_perform_sink_check(obj)
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_toxic_waste_platform_loop(o)
 | 
			
		||||
    sinking_perform_sink_check(o)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
function bhv_pushable_tomb_init(obj)
 | 
			
		||||
    network_init_object(obj, true, { 'oPosX', 'oPosY', 'oPosZ' })
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_pushable_tomb_init(o)
 | 
			
		||||
    network_init_object(o, true, { "oPosX", "oPosY", "oPosZ" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
E_MODEL_VCUTM_LIGHT = smlua_model_util_get_id("vcutm_light_geo")
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_lights_on_switch_init(o)
 | 
			
		||||
    o.parentObj = cur_obj_nearest_object_with_behavior(get_behavior_from_id(id_bhvFloorSwitchAnimatesObject))
 | 
			
		||||
    obj_set_model_extended(o, E_MODEL_VCUTM_LIGHT)
 | 
			
		||||
 | 
			
		||||
function bhv_lights_on_switch_init(obj)
 | 
			
		||||
    obj.parentObj = cur_obj_nearest_object_with_behavior(get_behavior_from_id(id_bhvFloorSwitchAnimatesObject));
 | 
			
		||||
    obj_set_model_extended(obj, E_MODEL_VCUTM_LIGHT)
 | 
			
		||||
    
 | 
			
		||||
    network_init_object(obj, true, { 'oFloorSwitchPressAnimationUnkF4', 'oFloorSwitchPressAnimationUnkF8', 'oFloorSwitchPressAnimationUnkFC' })
 | 
			
		||||
    network_init_object(o, true, { "oFloorSwitchPressAnimationUnkF4", "oFloorSwitchPressAnimationUnkF8", "oFloorSwitchPressAnimationUnkFC" })
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_lights_on_switch_loop(obj)
 | 
			
		||||
    if obj.oFloorSwitchPressAnimationUnk100 ~= 0 then
 | 
			
		||||
        if obj.parentObj ~= nil and obj.parentObj.oAction ~= 2 then
 | 
			
		||||
            obj.oFloorSwitchPressAnimationUnk100 = 0
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_lights_on_switch_loop(o)
 | 
			
		||||
    if o.oFloorSwitchPressAnimationUnk100 ~= 0 then
 | 
			
		||||
        if o.parentObj ~= nil and o.parentObj.oAction ~= 2 then
 | 
			
		||||
            o.oFloorSwitchPressAnimationUnk100 = 0
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        if obj.oFloorSwitchPressAnimationUnkFC ~= 0 then
 | 
			
		||||
            if obj.oBehParams2ndByte >= 0 and obj.oBehParams2ndByte <= 2 then
 | 
			
		||||
                obj.oFloorSwitchPressAnimationUnkF4 = 200
 | 
			
		||||
        if o.oFloorSwitchPressAnimationUnkFC ~= 0 then
 | 
			
		||||
            if o.oBehParams2ndByte >= 0 and o.oBehParams2ndByte <= 2 then
 | 
			
		||||
                o.oFloorSwitchPressAnimationUnkF4 = 200
 | 
			
		||||
            end
 | 
			
		||||
        else
 | 
			
		||||
            obj.oFloorSwitchPressAnimationUnkF4 = 0
 | 
			
		||||
            o.oFloorSwitchPressAnimationUnkF4 = 0
 | 
			
		||||
        end
 | 
			
		||||
    elseif obj.parentObj ~= nil and obj.parentObj.oAction == 2 then
 | 
			
		||||
        obj.oFloorSwitchPressAnimationUnkFC = obj.oFloorSwitchPressAnimationUnkFC ~ 1
 | 
			
		||||
        obj.oFloorSwitchPressAnimationUnk100 = 1
 | 
			
		||||
    elseif o.parentObj ~= nil and o.parentObj.oAction == 2 then
 | 
			
		||||
        o.oFloorSwitchPressAnimationUnkFC = o.oFloorSwitchPressAnimationUnkFC ~ 1
 | 
			
		||||
        o.oFloorSwitchPressAnimationUnk100 = 1
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if obj.oFloorSwitchPressAnimationUnkF4 ~= 0 then
 | 
			
		||||
        if obj.oFloorSwitchPressAnimationUnkF4 < 60 then
 | 
			
		||||
    if o.oFloorSwitchPressAnimationUnkF4 ~= 0 then
 | 
			
		||||
        if o.oFloorSwitchPressAnimationUnkF4 < 60 then
 | 
			
		||||
            cur_obj_play_sound_1(SOUND_GENERAL2_SWITCH_TICK_SLOW)
 | 
			
		||||
        else
 | 
			
		||||
            cur_obj_play_sound_1(SOUND_GENERAL2_SWITCH_TICK_FAST)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        obj.oFloorSwitchPressAnimationUnkF4 = obj.oFloorSwitchPressAnimationUnkF4 - 1
 | 
			
		||||
        if obj.oFloorSwitchPressAnimationUnkF4 == 0 then
 | 
			
		||||
            obj.oFloorSwitchPressAnimationUnkFC = 0
 | 
			
		||||
        o.oFloorSwitchPressAnimationUnkF4 = o.oFloorSwitchPressAnimationUnkF4 - 1
 | 
			
		||||
        if o.oFloorSwitchPressAnimationUnkF4 == 0 then
 | 
			
		||||
            o.oFloorSwitchPressAnimationUnkFC = 0
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        if obj.oFloorSwitchPressAnimationUnkF8 < 9 then
 | 
			
		||||
            obj.oFloorSwitchPressAnimationUnkF8 = obj.oFloorSwitchPressAnimationUnkF8 + 1
 | 
			
		||||
        if o.oFloorSwitchPressAnimationUnkF8 < 9 then
 | 
			
		||||
            o.oFloorSwitchPressAnimationUnkF8 = o.oFloorSwitchPressAnimationUnkF8 + 1
 | 
			
		||||
        end
 | 
			
		||||
    else
 | 
			
		||||
        obj.oFloorSwitchPressAnimationUnkF8 = obj.oFloorSwitchPressAnimationUnkF8 - 2
 | 
			
		||||
        if obj.oFloorSwitchPressAnimationUnkF8 < 0 then
 | 
			
		||||
            obj.oFloorSwitchPressAnimationUnkF8 = 0
 | 
			
		||||
            obj.oFloorSwitchPressAnimationUnkFC = 1
 | 
			
		||||
        o.oFloorSwitchPressAnimationUnkF8 = o.oFloorSwitchPressAnimationUnkF8 - 2
 | 
			
		||||
        if o.oFloorSwitchPressAnimationUnkF8 < 0 then
 | 
			
		||||
            o.oFloorSwitchPressAnimationUnkF8 = 0
 | 
			
		||||
            o.oFloorSwitchPressAnimationUnkFC = 1
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    local fType = math.floor(obj.oFloorSwitchPressAnimationUnkF8 / 2)
 | 
			
		||||
    local fType = math.floor(o.oFloorSwitchPressAnimationUnkF8 / 2)
 | 
			
		||||
    if fType == 0 then
 | 
			
		||||
        cur_obj_hide()
 | 
			
		||||
    else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,103 +1,119 @@
 | 
			
		|||
function bhv_custom_koopa_the_quick_loop(obj)
 | 
			
		||||
    if obj.oKoopaMovementType >= KOOPA_BP_KOOPA_THE_QUICK_BASE then
 | 
			
		||||
--- @param o Object
 | 
			
		||||
local function bhv_custom_koopa_the_quick_loop(o)
 | 
			
		||||
    if o.oKoopaMovementType >= KOOPA_BP_KOOPA_THE_QUICK_BASE then
 | 
			
		||||
        if gNetworkPlayers[0].currLevelNum == 27 then
 | 
			
		||||
            obj.oKoopaTheQuickRaceIndex = 1
 | 
			
		||||
            o.oKoopaTheQuickRaceIndex = 1
 | 
			
		||||
        else
 | 
			
		||||
            obj.oKoopaTheQuickRaceIndex = 0
 | 
			
		||||
            o.oKoopaTheQuickRaceIndex = 0
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- hook the behavior
 | 
			
		||||
bhvKoopa = hook_behavior(id_bhvKoopa, OBJ_LIST_PUSHABLE, false, nil, bhv_custom_koopa_the_quick_loop)
 | 
			
		||||
id_bhvKoopa = hook_behavior(id_bhvKoopa, OBJ_LIST_PUSHABLE, false, nil, bhv_custom_koopa_the_quick_loop, "bhvKoopa")
 | 
			
		||||
 | 
			
		||||
---------------------------------------------------
 | 
			
		||||
 | 
			
		||||
function bhv_custom_castle_cannon_grate_init(obj)
 | 
			
		||||
    obj.oFlags = (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)
 | 
			
		||||
    obj.collisionData = smlua_collision_util_get("castle_grounds_seg7_collision_cannon_grill")
 | 
			
		||||
    obj.oCollisionDistance = 4000
 | 
			
		||||
--- @param o Object
 | 
			
		||||
local function bhv_custom_castle_cannon_grate_init(o)
 | 
			
		||||
    o.oFlags = (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)
 | 
			
		||||
    o.collisionData = smlua_collision_util_get("castle_grounds_seg7_collision_cannon_grill")
 | 
			
		||||
    o.oCollisionDistance = 4000
 | 
			
		||||
    load_object_collision_model()
 | 
			
		||||
 | 
			
		||||
    if get_star_count() > 64 then -- 65 star check
 | 
			
		||||
        obj.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
    if get_star_count() >= 65 then -- 65 star check
 | 
			
		||||
        o.activeFlags = ACTIVE_FLAG_DEACTIVATED
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_custom_castle_cannon_grate_loop(obj)
 | 
			
		||||
local function bhv_custom_castle_cannon_grate_loop()
 | 
			
		||||
    load_object_collision_model()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- hook the behavior
 | 
			
		||||
bhvSMSRHiddenAt120Stars = hook_behavior(id_bhvHiddenAt120Stars, OBJ_LIST_SURFACE, true, bhv_custom_castle_cannon_grate_init, bhv_custom_castle_cannon_grate_loop)
 | 
			
		||||
id_bhvSMSRHiddenAt120Stars = hook_behavior(id_bhvHiddenAt120Stars, OBJ_LIST_SURFACE, true, bhv_custom_castle_cannon_grate_init, bhv_custom_castle_cannon_grate_loop, "bhvSMSRHiddenAt120Stars")
 | 
			
		||||
 | 
			
		||||
---------------------------------------------------
 | 
			
		||||
 | 
			
		||||
function bully_custom_act_level_death(obj)
 | 
			
		||||
local function bully_custom_act_level_death(o)
 | 
			
		||||
    if obj_lava_death() == 1 then
 | 
			
		||||
        spawn_mist_particles()
 | 
			
		||||
        local m = get_mario_from_global_index(obj.oBullyLastNetworkPlayerIndex)
 | 
			
		||||
        spawn_non_sync_object(id_bhvBowserKey, E_MODEL_BOWSER_KEY, m.pos.x, m.pos.y, m.pos.z, nil)
 | 
			
		||||
        local m = get_mario_from_global_index(o.oBullyLastNetworkPlayerIndex)
 | 
			
		||||
        spawn_non_sync_object(
 | 
			
		||||
            id_bhvBowserKey,
 | 
			
		||||
            E_MODEL_BOWSER_KEY,
 | 
			
		||||
            m.pos.x, m.pos.y, m.pos.z,
 | 
			
		||||
            nil
 | 
			
		||||
        )
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_custom_big_bully_init(obj)
 | 
			
		||||
    obj.oFlags = (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)
 | 
			
		||||
    obj.oAnimations = gObjectAnimations.bully_seg5_anims_0500470C
 | 
			
		||||
    object_drop_to_floor(obj)
 | 
			
		||||
local function bhv_custom_big_bully_init(o)
 | 
			
		||||
    o.oFlags = (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)
 | 
			
		||||
    o.oAnimations = gObjectAnimations.bully_seg5_anims_0500470C
 | 
			
		||||
    object_drop_to_floor(o)
 | 
			
		||||
    cur_obj_set_home_once()
 | 
			
		||||
    obj.oIntangibleTimer = 0
 | 
			
		||||
    o.oIntangibleTimer = 0
 | 
			
		||||
 | 
			
		||||
    cur_obj_init_animation(0)
 | 
			
		||||
    bhv_big_bully_init()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_custom_bully_loop(obj)
 | 
			
		||||
    if obj.oAction == BULLY_ACT_LAVA_DEATH then
 | 
			
		||||
        obj.oBullyPrevX = obj.oPosX
 | 
			
		||||
        obj.oBullyPrevY = obj.oPosY
 | 
			
		||||
        obj.oBullyPrevZ = obj.oPosZ
 | 
			
		||||
local function bhv_custom_big_bully_loop(o)
 | 
			
		||||
    if o.oAction == BULLY_ACT_LAVA_DEATH then
 | 
			
		||||
        o.oBullyPrevX = o.oPosX
 | 
			
		||||
        o.oBullyPrevY = o.oPosY
 | 
			
		||||
        o.oBullyPrevZ = o.oPosZ
 | 
			
		||||
 | 
			
		||||
        bully_custom_act_level_death(obj)
 | 
			
		||||
        bully_custom_act_level_death(o)
 | 
			
		||||
 | 
			
		||||
        set_object_visibility(obj, 3000)
 | 
			
		||||
        set_object_visibility(o, 3000)
 | 
			
		||||
    else
 | 
			
		||||
        bhv_bully_loop()
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- hook the behavior
 | 
			
		||||
bhvBigBullyBoss = hook_behavior(id_bhvBigBully, OBJ_LIST_GENACTOR, true, bhv_custom_big_bully_init, bhv_custom_bully_loop)
 | 
			
		||||
id_bhvBigBully = hook_behavior(id_bhvBigBully, OBJ_LIST_GENACTOR, true, bhv_custom_big_bully_init, bhv_custom_big_bully_loop, "bhvBigBully")
 | 
			
		||||
 | 
			
		||||
---------------------------------------------------
 | 
			
		||||
 | 
			
		||||
function bhv_custom_bowser_loop(obj)
 | 
			
		||||
--- @param o Object
 | 
			
		||||
local function bhv_custom_bowser_loop(o)
 | 
			
		||||
    local np = gNetworkPlayers[0]
 | 
			
		||||
    if np.currAreaSyncValid and np.currLevelSyncValid and np.currLevelNum ~= LEVEL_BOWSER_3 then
 | 
			
		||||
        -- force bowser into do nothing action when not displaying cutscene
 | 
			
		||||
        if obj.oAction ~= 5 and obj.oAction ~= 6 and obj.oAction ~= 20 then
 | 
			
		||||
            obj.oAction = 4
 | 
			
		||||
            obj.oSubAction = 11
 | 
			
		||||
        -- magic number hell
 | 
			
		||||
        if o.oAction ~= 5 and o.oAction ~= 6 and o.oAction ~= 20 then
 | 
			
		||||
            o.oAction = 4
 | 
			
		||||
            o.oSubAction = 11
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- hook the behavior
 | 
			
		||||
id_bhvBowserCustom = hook_behavior(id_bhvBowser, OBJ_LIST_GENACTOR, false, nil, bhv_custom_bowser_loop)
 | 
			
		||||
id_bhvBowser = hook_behavior(id_bhvBowser, OBJ_LIST_GENACTOR, false, nil, bhv_custom_bowser_loop, "bhvBowser")
 | 
			
		||||
 | 
			
		||||
---------------------------------------------------
 | 
			
		||||
 | 
			
		||||
function bhv_custom_grand_star_init(obj)
 | 
			
		||||
    obj.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
 | 
			
		||||
    obj.oInteractType = INTERACT_WARP
 | 
			
		||||
    obj.oIntangibleTimer = 0
 | 
			
		||||
--- @param o Object
 | 
			
		||||
local function bhv_custom_grand_star_init(o)
 | 
			
		||||
    o.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
 | 
			
		||||
    o.oInteractType = INTERACT_WARP
 | 
			
		||||
    o.oIntangibleTimer = 0
 | 
			
		||||
    cur_obj_set_home_once()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function bhv_custom_grand_star_loop(obj)
 | 
			
		||||
local function bhv_custom_grand_star_loop()
 | 
			
		||||
    bhv_warp_loop()
 | 
			
		||||
    bhv_grand_star_loop()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- hook the behavior
 | 
			
		||||
id_bhvGrandStar = hook_behavior(id_bhvGrandStar, OBJ_LIST_LEVEL, true, bhv_custom_grand_star_init, bhv_custom_grand_star_loop)
 | 
			
		||||
id_bhvGrandStar = hook_behavior(id_bhvGrandStar, OBJ_LIST_LEVEL, true, bhv_custom_grand_star_init, bhv_custom_grand_star_loop, "bhvGrandStar")
 | 
			
		||||
 | 
			
		||||
---------------------------------------------------
 | 
			
		||||
 | 
			
		||||
--- @param o Object
 | 
			
		||||
local function bhv_custom_racing_penguin_update(o)
 | 
			
		||||
    if o.oRacingPenguinReachedBottom == 1 then
 | 
			
		||||
        o.oRacingPenguinWeightedNewTargetSpeed = 10
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
id_bhvRacingPenguin = hook_behavior(id_bhvRacingPenguin, OBJ_LIST_GENACTOR, false, nil, bhv_custom_racing_penguin_update, "bhvRacingPenguin")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ smlua_text_utils_secret_star_replace(COURSE_CAKE_END, "   SECRET STARS")
 | 
			
		|||
 | 
			
		||||
smlua_text_utils_castle_secret_stars_replace("   SECRET STARS")
 | 
			
		||||
smlua_text_utils_extra_text_replace(0, "ONE OF THE SECRET STARS!")
 | 
			
		||||
smlua_text_utils_extra_text_replace(1, "TEST")
 | 
			
		||||
smlua_text_utils_extra_text_replace(1, "")
 | 
			
		||||
smlua_text_utils_extra_text_replace(2, "")
 | 
			
		||||
smlua_text_utils_extra_text_replace(3, "")
 | 
			
		||||
smlua_text_utils_extra_text_replace(4, "")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,3 @@
 | 
			
		|||
changed_dialogs = {}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
smlua_text_utils_dialog_replace(DIALOG_000, 1, 6, 30, 200, "--WARNING--\
 | 
			
		||||
FLOOR UNSTABLE. DO NOT\
 | 
			
		||||
GROUND-POUND UNDER \
 | 
			
		||||
| 
						 | 
				
			
			@ -1610,7 +1605,6 @@ their houses!")
 | 
			
		|||
smlua_text_utils_dialog_replace(DIALOG_168, 1, 5, 30, 200, "Ack! Stop it or I'll\
 | 
			
		||||
make you stop!")
 | 
			
		||||
 | 
			
		||||
changed_dialogs[169] = 1
 | 
			
		||||
smlua_text_utils_dialog_replace(DIALOG_169, 1, 6, 30, 200, "Psst! Looking for\
 | 
			
		||||
a challenge? Try pressing\
 | 
			
		||||
[R] after pausing the\
 | 
			
		||||
| 
						 | 
				
			
			@ -1623,11 +1617,8 @@ host a lobby with 'Super\
 | 
			
		|||
Mario Star Road' as the\
 | 
			
		||||
active romhack!")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function dialog_replace()
 | 
			
		||||
      if gGlobalSyncTable.hardMode then
 | 
			
		||||
            changed_dialogs[169] = 1 -- thank you Emmi for being so cool and having this in MarioHunt so I could remember how to change dialog this way
 | 
			
		||||
            smlua_text_utils_dialog_replace(DIALOG_169, 1, 4, 30, 200, "Welcome to HARD MODE!\
 | 
			
		||||
This challenge mode is an\
 | 
			
		||||
OHKO, which means that\
 | 
			
		||||
| 
						 | 
				
			
			@ -1637,7 +1628,6 @@ one hit! Do you have what\
 | 
			
		|||
it takes to complete this\
 | 
			
		||||
challenge?")
 | 
			
		||||
      else
 | 
			
		||||
            changed_dialogs[169] = 1
 | 
			
		||||
            smlua_text_utils_dialog_replace(DIALOG_169, 1, 6, 30, 200, "Psst! Looking for\
 | 
			
		||||
a challenge? Try pressing\
 | 
			
		||||
[R] after pausing the\
 | 
			
		||||
| 
						 | 
				
			
			@ -1652,6 +1642,4 @@ active romhack! ")
 | 
			
		|||
      end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
hook_event(HOOK_ON_DIALOG, dialog_replace)
 | 
			
		||||
| 
						 | 
				
			
			@ -21,6 +21,9 @@ gLevelValues.vanishCapDurationVcutm = 900
 | 
			
		|||
 | 
			
		||||
gLevelValues.wingCapLookUpReq = 120
 | 
			
		||||
 | 
			
		||||
gLevelValues.fixCollisionBugs = true
 | 
			
		||||
gLevelValues.vanishCapSequence = 0x32
 | 
			
		||||
 | 
			
		||||
-- Replace Stars
 | 
			
		||||
starPositions = gLevelValues.starPositions
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,24 +1,14 @@
 | 
			
		|||
gGlobalSyncTable.hardMode = false
 | 
			
		||||
 | 
			
		||||
function on_level_init()
 | 
			
		||||
    local m = gMarioStates[0]
 | 
			
		||||
    local np = gNetworkPlayers[0]
 | 
			
		||||
    if gGlobalSyncTable.hardMode then
 | 
			
		||||
        gMarioStates[0].numStars = save_file_get_total_star_count(get_current_save_file_num() - 1, COURSE_MIN - 1,
 | 
			
		||||
            COURSE_MAX - 1)
 | 
			
		||||
        gLevelValues.exitCastleArea = gNetworkPlayers[0].currAreaIndex
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
burnActions = { --Accounting for when you are on fire since that type of damage is handled differently.
 | 
			
		||||
local sBurnActions = { --Accounting for when you are on fire since that type of damage is handled differently.
 | 
			
		||||
    [ACT_BURNING_FALL] = true,
 | 
			
		||||
    [ACT_BURNING_GROUND] = true,
 | 
			
		||||
    [ACT_BURNING_JUMP] = true
 | 
			
		||||
}
 | 
			
		||||
seenPopup = false
 | 
			
		||||
 | 
			
		||||
local frameCounter = 10
 | 
			
		||||
local function mario_update(m)
 | 
			
		||||
    if m.playerIndex ~= 0 then return end
 | 
			
		||||
local seenPopup = false
 | 
			
		||||
 | 
			
		||||
--- @param m MarioState
 | 
			
		||||
function mario_update_hardmode(m)
 | 
			
		||||
    if network_is_server() and frameCounter > 0 then
 | 
			
		||||
        if m.controller.buttonDown & L_TRIG ~= 0 then
 | 
			
		||||
            gGlobalSyncTable.hardMode = true -- Starts up "Hard Mode" on Hack Boot. Hold the L button within 10 frames of loading Star Road to activate it.
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +20,9 @@ local function mario_update(m)
 | 
			
		|||
        end
 | 
			
		||||
        frameCounter = frameCounter - 1
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if not gGlobalSyncTable.hardMode then return end
 | 
			
		||||
 | 
			
		||||
    if not seenPopup and not network_is_server() then
 | 
			
		||||
        save_file_set_using_backup_slot(gGlobalSyncTable.hardMode)
 | 
			
		||||
        save_file_reload(1)
 | 
			
		||||
| 
						 | 
				
			
			@ -38,60 +30,56 @@ local function mario_update(m)
 | 
			
		|||
        play_sound(SOUND_MENU_MARIO_CASTLE_WARP + 1 << 0, { x = 0, y = 0, z = 0 })
 | 
			
		||||
        seenPopup = true
 | 
			
		||||
    end
 | 
			
		||||
    if m.hurtCounter > 0 or burnActions[m.action] then
 | 
			
		||||
        m.hurtCounter = 64 -- Damage Check. Hard Mode is a OHKO mode.
 | 
			
		||||
        m.healCounter = 0  -- Prevents you from healing from a coin or any health regen object via landing on one while dying.
 | 
			
		||||
 | 
			
		||||
    if m.hurtCounter > 0 or sBurnActions[m.action] then
 | 
			
		||||
        m.hurtCounter = 64 -- Damage Check. Hard Mode is a OHKO mode
 | 
			
		||||
        m.healCounter = 0  -- Prevents you from healing from a coin or any health regen object via landing on one while dying
 | 
			
		||||
    end
 | 
			
		||||
    if not gGlobalSyncTable.hardMode then return false end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
---@param m MarioState
 | 
			
		||||
function air(m)
 | 
			
		||||
    if gGlobalSyncTable.hardMode then
 | 
			
		||||
function before_mario_update_hardmode(m)
 | 
			
		||||
    if not gGlobalSyncTable.hardMode then return end
 | 
			
		||||
 | 
			
		||||
    if m.action & ACT_GROUP_MASK == ACT_GROUP_SUBMERGED and m.area.terrainType ~= TERRAIN_SNOW then
 | 
			
		||||
        change = (m.pos.y < m.waterLevel - 140 and 1 or -0x1A)
 | 
			
		||||
        m.health = m.health + change
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function on_level_init_hardmode()
 | 
			
		||||
    if gGlobalSyncTable.hardMode then
 | 
			
		||||
        gMarioStates[0].numStars = save_file_get_total_star_count(get_current_save_file_num() - 1, COURSE_MIN - 1,
 | 
			
		||||
            COURSE_MAX - 1)
 | 
			
		||||
        gLevelValues.exitCastleArea = gNetworkPlayers[0].currAreaIndex
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function hard_mode_menu(_, value)
 | 
			
		||||
    gGlobalSyncTable.hardMode = value
 | 
			
		||||
    save_file_set_using_backup_slot(gGlobalSyncTable.hardMode)
 | 
			
		||||
    save_file_reload(1)
 | 
			
		||||
    djui_popup_create(value and "\\#ff0000\\HARD MODE\\#dcdcdc\\ Activated" or "You are currently in NORMAL MODE.", 1)
 | 
			
		||||
    play_sound(SOUND_MENU_MARIO_CASTLE_WARP, { x = 0, y = 0, z = 0 })
 | 
			
		||||
    warp_to_warpnode(LEVEL_CASTLE_GROUNDS, 1, 0, 128)
 | 
			
		||||
function on_hud_render_hardmode()
 | 
			
		||||
    if not is_game_paused() or not gGlobalSyncTable.hardMode then return end
 | 
			
		||||
 | 
			
		||||
    djui_hud_set_resolution(RESOLUTION_N64)
 | 
			
		||||
    djui_hud_set_font(FONT_HUD)
 | 
			
		||||
 | 
			
		||||
    djui_hud_set_color(255, 255, 255, 255)
 | 
			
		||||
    local height = djui_hud_get_screen_height()
 | 
			
		||||
    djui_hud_print_text("HARD MODE", 10, height - 30, 1)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function dialog_box_colors(id)
 | 
			
		||||
    if changed_dialogs[id] and gGlobalSyncTable.hardMode then -- red dialog box (Thank you  again Emmi)
 | 
			
		||||
function on_dialog_hardmode(dialogID)
 | 
			
		||||
    if dialogID == DIALOG_169 and gGlobalSyncTable.hardMode then -- red dialog box (Thank you again Emmi)
 | 
			
		||||
        set_dialog_override_color(255, 100, 100, 180, 255, 255, 255, 255)
 | 
			
		||||
    else
 | 
			
		||||
        reset_dialog_override_color()
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if network_is_server() then
 | 
			
		||||
    hook_mod_menu_checkbox("Hard Mode", gGlobalSyncTable.hardMode, hard_mode_menu)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function menu_hud_render()
 | 
			
		||||
    if is_game_paused() and gGlobalSyncTable.hardMode then
 | 
			
		||||
        djui_hud_set_font(FONT_CUSTOM_HUD)
 | 
			
		||||
        djui_hud_set_color(0xdc, 0xdc, 0xdc, 255)
 | 
			
		||||
        local height = djui_hud_get_screen_height()
 | 
			
		||||
        djui_hud_print_text("Hard Mode", 40, height - 130, 4)
 | 
			
		||||
function hard_mode_menu(_, value)
 | 
			
		||||
    gGlobalSyncTable.hardMode = value
 | 
			
		||||
    save_file_set_using_backup_slot(gGlobalSyncTable.hardMode)
 | 
			
		||||
    save_file_reload(1)
 | 
			
		||||
    djui_popup_create(value and "\\#ff0000\\HARD MODE\\#dcdcdc\\ enabled." or "\\#ff0000\\HARD MODE\\#dcdcdc\\ disabled.", 1)
 | 
			
		||||
    play_sound(SOUND_MENU_MARIO_CASTLE_WARP, { x = 0, y = 0, z = 0 })
 | 
			
		||||
    warp_to_start_level()
 | 
			
		||||
end
 | 
			
		||||
end
 | 
			
		||||
-- Main loop
 | 
			
		||||
local function hud_render()
 | 
			
		||||
    djui_hud_set_resolution(RESOLUTION_DJUI)
 | 
			
		||||
    menu_hud_render()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
hook_event(HOOK_ON_HUD_RENDER, hud_render)
 | 
			
		||||
hook_event(HOOK_ON_DIALOG, dialog_box_colors)
 | 
			
		||||
hook_event(HOOK_ON_LEVEL_INIT, on_level_init)
 | 
			
		||||
hook_event(HOOK_MARIO_UPDATE, mario_update)
 | 
			
		||||
hook_event(HOOK_BEFORE_MARIO_UPDATE, air)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,15 @@
 | 
			
		|||
_G.switch = function(param, case_table)
 | 
			
		||||
    local case = case_table[param]
 | 
			
		||||
--- @param caseTable table
 | 
			
		||||
function switch(param, caseTable)
 | 
			
		||||
    local case = caseTable[param]
 | 
			
		||||
    if case then return case() end
 | 
			
		||||
    local def = case_table['default']
 | 
			
		||||
    local def = caseTable['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)
 | 
			
		||||
    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)
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +32,6 @@ 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
 | 
			
		||||
| 
						 | 
				
			
			@ -94,19 +92,9 @@ function sinking_perform_sink_check(obj)
 | 
			
		|||
    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);
 | 
			
		||||
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
 | 
			
		||||
| 
						 | 
				
			
			@ -116,78 +104,8 @@ function spawn_object_abs_with_rot(parent, uselessArg, modelId, bhvId, x, y, z,
 | 
			
		|||
    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);
 | 
			
		||||
    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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,73 @@
 | 
			
		|||
-- name: Star Road Dev
 | 
			
		||||
-- description: Romhack created by \\#FFD700\\SKELUX\\#DCDCDC\\\n\nwww.youtube.com/c/Skelux\n\nThere are 23 custom levels, with a total of 130 stars.\n\nPorted to PC by AloXado320,\n\\#FFAAFF\\PeachyPeach\\#DCDCDC\\, and \\#8C4AC7\\PrinceFrizzy\\#DCDCDC\\\n\nPorted to coop by \\#093614\\djoslin0\\#DCDCDC\\,\n\\#8C4AC7\\PrinceFrizzy\\#DCDCDC\\, and \\#141699\\Isaac\\#DCDCDC\\.\n\nAdditional Fixes and "\\#FF0000\\Hard Mode\\#DCDCDC\\" addition by  \\#2D851C\\Mr.Needlemouse\\#DCDCDC\\.
 | 
			
		||||
-- name: Star Road
 | 
			
		||||
-- incompatible: romhack
 | 
			
		||||
-- description: Star Road\nRomhack created by \\#ffd700\\SKELUX\\#dcdcdc\\\n\nwww.youtube.com/c/Skelux\n\nThere are 23 custom levels, with a total of 130 stars.\n\nPorted to PC by AloXado320,\n\\#ffaaff\\PeachyPeach\\#dcdcdc\\, and \\#8c4ac7\\PrinceFrizzy\\#dcdcdc\\\n\nPorted to coop by \\#093614\\djoslin0\\#dcdcdc\\,\n\\#8c4ac7\\PrinceFrizzy\\#dcdcdc\\, and \\#141699\\Isaac\\#dcdcdc\\.\n\nAdditional Fixes and "\\#ff0000\\Hard Mode\\#dcdcdc\\" addition by  \\#2D851C\\Mr.Needlemouse\\#dcdcdc\\.
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
-- movtexs --
 | 
			
		||||
--------------
 | 
			
		||||
LEVEL_ZERO_LIFE = level_register("level_zerolife_entry", COURSE_NONE, "ZERO LIFE", "zl", 28000, 0x28, 0x28, 0x28)
 | 
			
		||||
 | 
			
		||||
gGlobalSyncTable.hardMode = false
 | 
			
		||||
 | 
			
		||||
local startingLives = false
 | 
			
		||||
local zeroLife = false
 | 
			
		||||
 | 
			
		||||
local function mario_update(m)
 | 
			
		||||
    if m.playerIndex ~= 0 then return end
 | 
			
		||||
 | 
			
		||||
    if not startingLives then
 | 
			
		||||
        m.numLives = 3
 | 
			
		||||
        startingLives = true
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if zeroLife then
 | 
			
		||||
        warp_to_level(LEVEL_ZERO_LIFE, 1, 0)
 | 
			
		||||
        zeroLife = false
 | 
			
		||||
        startingLives = true
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    mario_update_hardmode(m)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function before_mario_update(m)
 | 
			
		||||
    before_mario_update_hardmode(m)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function on_hud_render()
 | 
			
		||||
    on_hud_render_hardmode()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- 130 stars castle grounds music
 | 
			
		||||
local function on_warp()
 | 
			
		||||
    if get_star_count() >= 130 and gNetworkPlayers[0].currLevelNum == LEVEL_CASTLE_GROUNDS then
 | 
			
		||||
        play_music(SEQ_PLAYER_LEVEL, 0x2F, 1)
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function on_level_init()
 | 
			
		||||
    on_warp()
 | 
			
		||||
    on_level_init_hardmode()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function on_death()
 | 
			
		||||
    --- @type MarioState
 | 
			
		||||
    local m = gMarioStates[0]
 | 
			
		||||
    if m.numLives < 0 then
 | 
			
		||||
        zeroLife = true
 | 
			
		||||
        m.numLives = 3
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function on_screen_transition(transitionType)
 | 
			
		||||
    local m = gMarioStates[0]
 | 
			
		||||
    if m.numLives < 0 and transitionType == WARP_TRANSITION_FADE_INTO_BOWSER then
 | 
			
		||||
        zeroLife = true
 | 
			
		||||
        m.numLives = 3
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function on_dialog(dialogID)
 | 
			
		||||
    on_dialog_hardmode(dialogID)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
gServerSettings.skipIntro = 1
 | 
			
		||||
 | 
			
		||||
movtexqc_register('bbh_1_Movtex_0',              LEVEL_BBH,              1, 0)
 | 
			
		||||
movtexqc_register('ccm_1_Movtex_0',              LEVEL_CCM,              1, 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -23,39 +86,8 @@ movtexqc_register('cotmc_1_Movtex_0', LEVEL_COTMC, 1, 0)
 | 
			
		|||
movtexqc_register('totwc_1_Movtex_0',            LEVEL_TOTWC,            1, 0)
 | 
			
		||||
movtexqc_register('wmotr_1_Movtex_0',            LEVEL_WMOTR,            1, 0)
 | 
			
		||||
 | 
			
		||||
------------------
 | 
			
		||||
-- extra levels --
 | 
			
		||||
------------------
 | 
			
		||||
 | 
			
		||||
LEVEL_ZERO_LIFE = level_register('level_zerolife_entry', COURSE_NONE, 'ZERO LIFE', 'zl', 28000, 0x28, 0x28, 0x28)
 | 
			
		||||
 | 
			
		||||
---------------------------
 | 
			
		||||
-- race character speed--
 | 
			
		||||
---------------------------
 | 
			
		||||
--- @param o Object
 | 
			
		||||
function bhv_tuxierace_init(o)
 | 
			
		||||
    if o.oRacingPenguinReachedBottom == 1 then
 | 
			
		||||
        o.oRacingPenguinWeightedNewTargetSpeed = 10
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
hook_behavior(id_bhvRacingPenguin, OBJ_LIST_GENACTOR, false, nil, bhv_tuxierace_init, "bhvRacingPenguin")
 | 
			
		||||
 | 
			
		||||
---------------------------
 | 
			
		||||
-- force server settings --
 | 
			
		||||
---------------------------
 | 
			
		||||
 | 
			
		||||
gLevelValues.fixCollisionBugs = true
 | 
			
		||||
gLevelValues.vanishCapSequence = 0x32
 | 
			
		||||
gServerSettings.skipIntro = 1
 | 
			
		||||
 | 
			
		||||
-----------
 | 
			
		||||
-- music --
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
-- These have a custom entry in the Star road sequences.json patch. But aren't actually ripped.
 | 
			
		||||
-- these have a custom entry in the Star road sequences.json patch. But aren't actually ripped
 | 
			
		||||
-- smlua_audio_utils_replace_sequence(0x01, 0x22, 80, "01_Seq_smsrdeluxe_custom") -- SEQ_EVENT_CUTSCENE_COLLECT_STAR
 | 
			
		||||
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x02, 0x25, 80, "02_Seq_smsrdeluxe_custom") -- SEQ_MENU_TITLE_SCREEN
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x03, 0x25, 75, "03_Seq_smsrdeluxe_custom") -- SEQ_LEVEL_GRASS
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x04, 0x25, 70, "04_Seq_smsrdeluxe_custom") -- SEQ_LEVEL_INSIDE_CASTLE
 | 
			
		||||
| 
						 | 
				
			
			@ -88,8 +120,7 @@ smlua_audio_utils_replace_sequence(0x1F, 0x25, 80, "1F_Seq_smsrdeluxe_custom") -
 | 
			
		|||
smlua_audio_utils_replace_sequence(0x20, 0x25, 70, "20_Seq_smsrdeluxe_custom") -- SEQ_EVENT_CUTSCENE_ENDING
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x21, 0x25, 65, "21_Seq_smsrdeluxe_custom") -- SEQ_MENU_FILE_SELECT
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x22, 0x11, 80, "22_Seq_smsrdeluxe_custom") -- SEQ_EVENT_CUTSCENE_LAKITU
 | 
			
		||||
 | 
			
		||||
-- TODO: See if we can figure out the original volumes for the things below this point.
 | 
			
		||||
-- TODO: See if we can figure out the original volumes for the things below this point
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x23, 0x25, 80, "23_Seq_smsrdeluxe_custom")
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x24, 0x11, 70, "24_Seq_smsrdeluxe_custom")
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x25, 0x25, 85, "25_Seq_smsrdeluxe_custom")
 | 
			
		||||
| 
						 | 
				
			
			@ -100,8 +131,7 @@ smlua_audio_utils_replace_sequence(0x29, 0x25, 70, "29_Seq_smsrdeluxe_custom")
 | 
			
		|||
smlua_audio_utils_replace_sequence(0x2A, 0x11, 80, "2A_Seq_smsrdeluxe_custom")
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x2B, 0x1B, 80, "2B_Seq_smsrdeluxe_custom")
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x2C, 0x25, 70, "2C_Seq_smsrdeluxe_custom")
 | 
			
		||||
 | 
			
		||||
-- We don't know the correct instruments for these.
 | 
			
		||||
-- we don't know the correct instruments for these
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x2D, 0x25, 75, "2D_Seq_smsrdeluxe_custom")
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x2E, 0x12, 80, "2E_Seq_smsrdeluxe_custom") -- Final Boss Music
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x2F, 0x25, 70, "2F_Seq_smsrdeluxe_custom")
 | 
			
		||||
| 
						 | 
				
			
			@ -109,56 +139,18 @@ smlua_audio_utils_replace_sequence(0x30, 0x25, 65, "30_Seq_smsrdeluxe_custom") -
 | 
			
		|||
smlua_audio_utils_replace_sequence(0x31, 0x25, 80, "31_Seq_smsrdeluxe_custom")
 | 
			
		||||
smlua_audio_utils_replace_sequence(0x32, 0x25, 80, "32_Seq_smsrdeluxe_custom")
 | 
			
		||||
 | 
			
		||||
------------
 | 
			
		||||
-- camera --
 | 
			
		||||
------------
 | 
			
		||||
camera_set_romhack_override(RCO_ALL_EXCEPT_BOWSER)
 | 
			
		||||
camera_set_use_course_specific_settings(false)
 | 
			
		||||
 | 
			
		||||
-------------------------
 | 
			
		||||
-- zero life checks --
 | 
			
		||||
-------------------------
 | 
			
		||||
hook_event(HOOK_MARIO_UPDATE, mario_update)
 | 
			
		||||
hook_event(HOOK_BEFORE_MARIO_UPDATE, before_mario_update)
 | 
			
		||||
hook_event(HOOK_ON_HUD_RENDER, on_hud_render)
 | 
			
		||||
hook_event(HOOK_ON_LEVEL_INIT, on_level_init)
 | 
			
		||||
hook_event(HOOK_ON_WARP, on_warp)
 | 
			
		||||
hook_event(HOOK_ON_DEATH, on_death)
 | 
			
		||||
hook_event(HOOK_ON_SCREEN_TRANSITION, on_screen_transition)
 | 
			
		||||
hook_event(HOOK_ON_DIALOG, on_dialog)
 | 
			
		||||
 | 
			
		||||
local zerolife = false
 | 
			
		||||
function on_death(transitionType)
 | 
			
		||||
    local m = gMarioStates[0]
 | 
			
		||||
    if m.numLives < 0 and transitionType == WARP_TRANSITION_FADE_INTO_BOWSER then
 | 
			
		||||
        zerolife = true
 | 
			
		||||
        m.numLives = 3
 | 
			
		||||
if network_is_server() then
 | 
			
		||||
    hook_mod_menu_checkbox("Hard Mode", gGlobalSyncTable.hardMode, hard_mode_menu)
 | 
			
		||||
end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function void_death()
 | 
			
		||||
    local m = gMarioStates[0]
 | 
			
		||||
    if m.numLives < 0 then
 | 
			
		||||
        zerolife = true
 | 
			
		||||
        m.numLives = 3
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local startingLives = true
 | 
			
		||||
local function lives(m)
 | 
			
		||||
    if m.playerIndex ~= 0 then return end
 | 
			
		||||
    if startingLives then
 | 
			
		||||
        m.numLives = 3
 | 
			
		||||
        startingLives = false
 | 
			
		||||
    end
 | 
			
		||||
    if zerolife then
 | 
			
		||||
        warp_to_level(LEVEL_ZERO_LIFE, 1, 0)
 | 
			
		||||
        zerolife = false
 | 
			
		||||
        startingLives = true
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function on_warp_and_init() -- 130 stars castle grounds music
 | 
			
		||||
    local m = gMarioStates[0]
 | 
			
		||||
    if m.numStars >= 130 and gNetworkPlayers[0].currLevelNum == LEVEL_CASTLE_GROUNDS then
 | 
			
		||||
        play_music(0, 0x2F, 1)
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
hook_event(HOOK_ON_SCREEN_TRANSITION, on_death)
 | 
			
		||||
hook_event(HOOK_ON_LEVEL_INIT, on_warp_and_init)
 | 
			
		||||
hook_event(HOOK_ON_WARP, on_warp_and_init)
 | 
			
		||||
hook_event(HOOK_MARIO_UPDATE, lives)
 | 
			
		||||
hook_event(HOOK_ON_DEATH, void_death)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue