2022-03-31 05:15:17 +02:00
-- name: Shell Rush
-- description: Race around SM64 levels on shells.\n\nCollect powerups such as red shells, green shells, bananas, and mushrooms.\n\nOnly use a save that has lowered the water in the moat.
2022-05-09 17:28:30 +02:00
-- incompatible: gamemode moveset
2022-03-31 05:15:17 +02:00
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 not network_is_server ( ) then
djui_chat_message_create ( ' Only the server can change this setting! ' )
return true
end
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 )
hook_chat_command ( ' speed ' , " [decimal number, default: 0.8] " , on_speed_command )