mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			139 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
-- name: Shell Rush
 | 
						|
-- description: Race around SM64 levels on shells.\n\nCollect powerups such as red shells, green shells, bananas, and mushrooms.
 | 
						|
-- incompatible: gamemode moveset
 | 
						|
 | 
						|
DEBUG = false
 | 
						|
UNST22 = true -- gotta work around unst 22 bugs :(
 | 
						|
 | 
						|
gPowerups = {}
 | 
						|
 | 
						|
gGlobalSyncTable.speed = 0.8
 | 
						|
 | 
						|
for i = 0, (MAX_PLAYERS - 1) do
 | 
						|
    gPowerups[i] = {
 | 
						|
        [0] = nil,
 | 
						|
        [1] = nil,
 | 
						|
        [2] = nil,
 | 
						|
    }
 | 
						|
    local s = gPlayerSyncTable[i]
 | 
						|
    s.waypoint = 1
 | 
						|
    s.lap = 0
 | 
						|
    s.powerup = {}
 | 
						|
    s.powerup[0] = POWERUP_NONE
 | 
						|
    s.powerup[1] = POWERUP_NONE
 | 
						|
    s.powerup[2] = POWERUP_NONE
 | 
						|
    s.finish = 0
 | 
						|
    s.random = 0
 | 
						|
end
 | 
						|
 | 
						|
-------------------------------------------------------------------------------
 | 
						|
 | 
						|
function mario_update_local(m)
 | 
						|
    local s = gPlayerSyncTable[m.playerIndex]
 | 
						|
 | 
						|
    -- crouch to use shell
 | 
						|
    local pressZ = (m.controller.buttonPressed & Z_TRIG) ~= 0
 | 
						|
    local blockShell = (m.action & (ACT_FLAG_INVULNERABLE | ACT_GROUP_CUTSCENE | ACT_FLAG_INTANGIBLE)) ~= 0
 | 
						|
    local allowShell = (m.action & (ACT_FLAG_STATIONARY | ACT_FLAG_MOVING | ACT_FLAG_SWIMMING)) ~= 0
 | 
						|
    if pressZ and not is_riding(m) and not blockShell and allowShell then
 | 
						|
        set_mario_action(m, ACT_RIDING_SHELL_GROUND, 0)
 | 
						|
        m.actionTimer = 0
 | 
						|
        -- fix vanilla camera
 | 
						|
        if m.area.camera.mode == CAMERA_MODE_WATER_SURFACE then
 | 
						|
            set_camera_mode(m.area.camera, CAMERA_MODE_FREE_ROAM, 1)
 | 
						|
        end
 | 
						|
    end
 | 
						|
 | 
						|
    -- use powerups
 | 
						|
    if (m.controller.buttonPressed & Z_TRIG) ~= 0 and ((is_riding(m) and m.actionTimer > 1) or DEBUG) then
 | 
						|
        for i = 0, 2 do
 | 
						|
            if s.powerup[i] ~= POWERUP_NONE then
 | 
						|
                use_powerup(m, s.powerup[i])
 | 
						|
                s.powerup[i] = POWERUP_NONE
 | 
						|
                break
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
 | 
						|
    -- debug
 | 
						|
    if DEBUG then
 | 
						|
        if (m.controller.buttonPressed & D_JPAD) ~= 0 then
 | 
						|
            warp_to_level(LEVEL_CASTLE_GROUNDS, 1, 16)
 | 
						|
            print(m.pos.x, m.pos.y, m.pos.z, ' --- ', m.faceAngle.y)
 | 
						|
 | 
						|
            for i = 0, 2 do
 | 
						|
                gPlayerSyncTable[0].powerup[i] = POWERUP_BANANA
 | 
						|
            end
 | 
						|
        end
 | 
						|
 | 
						|
        if (m.controller.buttonPressed & L_JPAD) ~= 0 then
 | 
						|
            for i = 0, 2 do
 | 
						|
                gPlayerSyncTable[0].powerup[i] = POWERUP_GREEN_SHELL
 | 
						|
            end
 | 
						|
        end
 | 
						|
 | 
						|
        if (m.controller.buttonPressed & R_JPAD) ~= 0 then
 | 
						|
            for i = 0, 2 do
 | 
						|
                gPlayerSyncTable[0].powerup[i] = POWERUP_RED_SHELL
 | 
						|
            end
 | 
						|
        end
 | 
						|
 | 
						|
        if (m.controller.buttonPressed & U_JPAD) ~= 0 then
 | 
						|
            for i = 0, 2 do
 | 
						|
                gPlayerSyncTable[0].powerup[i] = POWERUP_MUSHROOM
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function on_speed_command(msg)
 | 
						|
    if tonumber(msg) > 0 then
 | 
						|
        gGlobalSyncTable.speed = tonumber(msg)
 | 
						|
        return true
 | 
						|
    end
 | 
						|
    return false
 | 
						|
end
 | 
						|
 | 
						|
function mario_update(m)
 | 
						|
    local s = gPlayerSyncTable[m.playerIndex]
 | 
						|
    if not active_player(m) then
 | 
						|
        return
 | 
						|
    end
 | 
						|
 | 
						|
    if m.playerIndex == 0 then
 | 
						|
        mario_update_local(m)
 | 
						|
    end
 | 
						|
 | 
						|
    -- max health
 | 
						|
    m.health = 0x880
 | 
						|
 | 
						|
    -- spawn powerups
 | 
						|
    for i = 0, 2 do
 | 
						|
        if gPowerups[m.playerIndex][i] == nil and s.powerup[i] ~= POWERUP_NONE then
 | 
						|
            if s.powerup[i] ~= POWERUP_NONE then
 | 
						|
                gPowerups[m.playerIndex][i] = spawn_powerup(m, s.powerup[i], i)
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function allow_pvp_attack(m1, m2)
 | 
						|
    return false
 | 
						|
end
 | 
						|
 | 
						|
function on_pause_exit(exitToCastle)
 | 
						|
    return false
 | 
						|
end
 | 
						|
 | 
						|
function on_update()
 | 
						|
    spawn_custom_level_objects()
 | 
						|
    race_update()
 | 
						|
end
 | 
						|
 | 
						|
hook_event(HOOK_UPDATE, on_update)
 | 
						|
hook_event(HOOK_MARIO_UPDATE, mario_update)
 | 
						|
hook_event(HOOK_ALLOW_PVP_ATTACK, allow_pvp_attack)
 | 
						|
hook_event(HOOK_ON_PAUSE_EXIT, on_pause_exit)
 | 
						|
if network_is_server() then
 | 
						|
    hook_chat_command('speed', "[decimal number, default: 0.8]", on_speed_command)
 | 
						|
 end
 |