mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-01-22 15:43:18 -05:00
Hide and seek modifications (#101)
This commit is contained in:
parent
489597b574
commit
3eed46a2a1
1 changed files with 131 additions and 11 deletions
|
@ -11,7 +11,11 @@ ROUND_STATE_ACTIVE = 1
|
||||||
ROUND_STATE_SEEKERS_WIN = 2
|
ROUND_STATE_SEEKERS_WIN = 2
|
||||||
ROUND_STATE_HIDERS_WIN = 3
|
ROUND_STATE_HIDERS_WIN = 3
|
||||||
ROUND_STATE_UNKNOWN_END = 4
|
ROUND_STATE_UNKNOWN_END = 4
|
||||||
|
gGlobalSyncTable.touchTag = true
|
||||||
gGlobalSyncTable.campingTimer = false -- enable/disable camping timer
|
gGlobalSyncTable.campingTimer = false -- enable/disable camping timer
|
||||||
|
gGlobalSyncTable.hiderCaps = true
|
||||||
|
gGlobalSyncTable.banKoopaShell = true
|
||||||
|
gGlobalSyncTable.seekerCaps = false
|
||||||
gGlobalSyncTable.roundState = ROUND_STATE_WAIT -- current round state
|
gGlobalSyncTable.roundState = ROUND_STATE_WAIT -- current round state
|
||||||
gGlobalSyncTable.displayTimer = 0 -- the displayed timer
|
gGlobalSyncTable.displayTimer = 0 -- the displayed timer
|
||||||
sRoundTimer = 0 -- the server's round timer
|
sRoundTimer = 0 -- the server's round timer
|
||||||
|
@ -100,7 +104,8 @@ function server_update(m)
|
||||||
|
|
||||||
-- pick random seeker if last turned to seeker is invalid
|
-- pick random seeker if last turned to seeker is invalid
|
||||||
if not hasSeeker then
|
if not hasSeeker then
|
||||||
local s = activePlayers[math.random(#activePlayers)]
|
local randNum = math.random(#activePlayers)
|
||||||
|
local s = activePlayers[randNum]
|
||||||
s.seeking = true
|
s.seeking = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -179,7 +184,10 @@ function mario_update(m)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
m.flags = m.flags & ~MARIO_VANISH_CAP --Always Remove Vanish Cap Cuz Broken
|
if (m.flags & MARIO_VANISH_CAP) ~= 0 then
|
||||||
|
m.flags = m.flags & ~MARIO_VANISH_CAP --Always Remove Vanish Cap Cuz Broken
|
||||||
|
stop_cap_music()
|
||||||
|
end
|
||||||
|
|
||||||
-- this code runs for all players
|
-- this code runs for all players
|
||||||
local s = gPlayerSyncTable[m.playerIndex]
|
local s = gPlayerSyncTable[m.playerIndex]
|
||||||
|
@ -189,11 +197,18 @@ function mario_update(m)
|
||||||
s.seeking = true
|
s.seeking = true
|
||||||
end
|
end
|
||||||
|
|
||||||
if m.playerIndex == 0 and not s.seeking or gGlobalSyncTable.roundState ~= ROUND_STATE_ACTIVE then
|
if m.playerIndex == 0 or gGlobalSyncTable.roundState ~= ROUND_STATE_ACTIVE then
|
||||||
m.flags = m.flags & ~MARIO_WING_CAP --Remove wing cap if hider
|
if gGlobalSyncTable.seekerCaps and gPlayerSyncTable[m.playerIndex].seeking then
|
||||||
m.flags = m.flags & ~MARIO_METAL_CAP --Remove metal cap if hider
|
m.flags = m.flags & ~MARIO_WING_CAP --Remove wing cap if seeking
|
||||||
|
m.flags = m.flags & ~MARIO_METAL_CAP --Remove metal cap if seeking
|
||||||
m.capTimer = 0
|
stop_cap_music()
|
||||||
|
m.capTimer = 0
|
||||||
|
elseif gGlobalSyncTable.hiderCaps and not gPlayerSyncTable[m.playerIndex].seeking then
|
||||||
|
m.flags = m.flags & ~MARIO_WING_CAP --Remove wing cap if hiding
|
||||||
|
m.flags = m.flags & ~MARIO_METAL_CAP --Remove metal cap if hiding
|
||||||
|
stop_cap_music()
|
||||||
|
m.capTimer = 0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if gNetworkPlayers[m.playerIndex].currLevelNum == LEVEL_RR and m.playerIndex == 0 then
|
if gNetworkPlayers[m.playerIndex].currLevelNum == LEVEL_RR and m.playerIndex == 0 then
|
||||||
|
@ -212,6 +227,10 @@ function mario_update(m)
|
||||||
warp_to_castle(LEVEL_BITS)
|
warp_to_castle(LEVEL_BITS)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if m.playerIndex == 0 and gPlayerSyncTable[m.playerIndex].seeking and gGlobalSyncTable.displayTimer == 0 and gGlobalSyncTable.roundState == ROUND_STATE_ACTIVE then
|
||||||
|
warp_to_level(LEVEL_CASTLE_GROUNDS, 1, 0)
|
||||||
|
end
|
||||||
|
|
||||||
-- display all seekers as metal
|
-- display all seekers as metal
|
||||||
if s.seeking then
|
if s.seeking then
|
||||||
m.marioBodyState.modelState = MODEL_STATE_METAL
|
m.marioBodyState.modelState = MODEL_STATE_METAL
|
||||||
|
@ -281,7 +300,7 @@ function on_pvp_attack(attacker, victim)
|
||||||
end
|
end
|
||||||
|
|
||||||
function on_player_connected(m)
|
function on_player_connected(m)
|
||||||
-- start out as a non-seeker
|
-- start out as a seeker
|
||||||
local s = gPlayerSyncTable[m.playerIndex]
|
local s = gPlayerSyncTable[m.playerIndex]
|
||||||
s.seeking = true
|
s.seeking = true
|
||||||
network_player_set_description(gNetworkPlayers[m.playerIndex], "seeker", 255, 64, 64, 255)
|
network_player_set_description(gNetworkPlayers[m.playerIndex], "seeker", 255, 64, 64, 255)
|
||||||
|
@ -416,6 +435,13 @@ function on_hide_and_seek_command(msg)
|
||||||
if msg == 'on' then
|
if msg == 'on' then
|
||||||
djui_chat_message_create('Hide-and-seek mod: enabled')
|
djui_chat_message_create('Hide-and-seek mod: enabled')
|
||||||
gGlobalSyncTable.hideAndSeek = true
|
gGlobalSyncTable.hideAndSeek = true
|
||||||
|
gGlobalSyncTable.roundState = ROUND_STATE_WAIT
|
||||||
|
sRoundTimer = 0
|
||||||
|
for i=0,(MAX_PLAYERS-1) do
|
||||||
|
gPlayerSyncTable[i].seeking = true
|
||||||
|
end
|
||||||
|
sLastSeekerIndex = 0
|
||||||
|
|
||||||
return true
|
return true
|
||||||
elseif msg == 'off' then
|
elseif msg == 'off' then
|
||||||
djui_chat_message_create('Hide-and-seek mod: disabled')
|
djui_chat_message_create('Hide-and-seek mod: disabled')
|
||||||
|
@ -442,6 +468,74 @@ function on_anti_camp_command(msg)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function on_touch_tag_command(msg)
|
||||||
|
if not network_is_server() then
|
||||||
|
djui_chat_message_create('Only the server can change this setting!')
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if msg == 'on' then
|
||||||
|
djui_chat_message_create('Touch tag: enabled')
|
||||||
|
gGlobalSyncTable.touchTag = true
|
||||||
|
return true
|
||||||
|
elseif msg == 'off' then
|
||||||
|
djui_chat_message_create('Touch tag: disabled')
|
||||||
|
gGlobalSyncTable.touchTag = false
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function on_koopa_shell_command(msg)
|
||||||
|
if not network_is_server() then
|
||||||
|
djui_chat_message_create('Only the server can change this setting!')
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if msg == 'on' then
|
||||||
|
djui_chat_message_create('Koopa Shell: enabled')
|
||||||
|
gGlobalSyncTable.banKoopaShell = false
|
||||||
|
return true
|
||||||
|
elseif msg == 'off' then
|
||||||
|
djui_chat_message_create('Koopa Shell: disabled')
|
||||||
|
gGlobalSyncTable.banKoopaShell = true
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function on_hider_cap_command(msg)
|
||||||
|
if not network_is_server() then
|
||||||
|
djui_chat_message_create('Only the server can change this setting!')
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if msg == 'on' then
|
||||||
|
djui_chat_message_create('Hider Caps: enabled')
|
||||||
|
gGlobalSyncTable.hiderCaps = false
|
||||||
|
return true
|
||||||
|
elseif msg == 'off' then
|
||||||
|
djui_chat_message_create('Hider Caps: disabled')
|
||||||
|
gGlobalSyncTable.hiderCaps = true
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function on_seeker_cap_command(msg)
|
||||||
|
if not network_is_server() then
|
||||||
|
djui_chat_message_create('Only the server can change this setting!')
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if msg == 'on' then
|
||||||
|
djui_chat_message_create('Seeker Caps: enabled')
|
||||||
|
gGlobalSyncTable.seekerCaps = false
|
||||||
|
return true
|
||||||
|
elseif msg == 'off' then
|
||||||
|
djui_chat_message_create('Seeker Caps: disabled')
|
||||||
|
gGlobalSyncTable.seekerCaps = true
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
function on_pause_exit(exitToCastle)
|
function on_pause_exit(exitToCastle)
|
||||||
local s = gPlayerSyncTable[0]
|
local s = gPlayerSyncTable[0]
|
||||||
if not s.seeking then
|
if not s.seeking then
|
||||||
|
@ -493,7 +587,9 @@ function on_seeking_changed(tag, oldVal, newVal)
|
||||||
if gGlobalSyncTable.roundState == ROUND_STATE_ACTIVE then
|
if gGlobalSyncTable.roundState == ROUND_STATE_ACTIVE then
|
||||||
sLastSeekerIndex = m.playerIndex
|
sLastSeekerIndex = m.playerIndex
|
||||||
end
|
end
|
||||||
sRoundTimer = 0
|
sRoundTimer = 32
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if newVal then
|
if newVal then
|
||||||
|
@ -505,10 +601,15 @@ end
|
||||||
|
|
||||||
function on_interact(m, obj, intee)
|
function on_interact(m, obj, intee)
|
||||||
if intee == INTERACT_PLAYER then
|
if intee == INTERACT_PLAYER then
|
||||||
|
|
||||||
|
if not gGlobalSyncTable.touchTag then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if m ~= gMarioStates[0] then
|
if m ~= gMarioStates[0] then
|
||||||
for i=0,(MAX_PLAYERS-1) do
|
for i=0,(MAX_PLAYERS-1) do
|
||||||
if gNetworkPlayers[i].connected then
|
if gNetworkPlayers[i].connected and gNetworkPlayers[i].currAreaSyncValid then
|
||||||
if gPlayerSyncTable[m.playerIndex].seeking and not gPlayerSyncTable[i].seeking and obj == gMarioStates[i].marioObj then
|
if gPlayerSyncTable[m.playerIndex].seeking and not gPlayerSyncTable[i].seeking and obj == gMarioStates[i].marioObj and check_touch_tag_allowed(i) then
|
||||||
gPlayerSyncTable[i].seeking = true
|
gPlayerSyncTable[i].seeking = true
|
||||||
|
|
||||||
network_player_set_description(gNetworkPlayers[i], "seeker", 255, 64, 64, 255)
|
network_player_set_description(gNetworkPlayers[i], "seeker", 255, 64, 64, 255)
|
||||||
|
@ -519,6 +620,20 @@ function on_interact(m, obj, intee)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function check_touch_tag_allowed(i)
|
||||||
|
if gMarioStates[i].action ~= ACT_TELEPORT_FADE_IN and gMarioStates[i].action ~= ACT_TELEPORT_FADE_OUT and gMarioStates[i].action ~= ACT_PULLING_DOOR and gMarioStates[i].action ~= ACT_PUSHING_DOOR and gMarioStates[i].action ~= ACT_WARP_DOOR_SPAWN and gMarioStates[i].action ~= ACT_ENTERING_STAR_DOOR and gMarioStates[i].action ~= ACT_STAR_DANCE_EXIT and gMarioStates[i].action ~= ACT_STAR_DANCE_NO_EXIT and gMarioStates[i].action ~= ACT_STAR_DANCE_WATER and gMarioStates[i].action ~= ACT_PANTING then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function allow_interact(m, obj, intee)
|
||||||
|
if intee == INTERACT_KOOPA_SHELL and gGlobalSyncTable.banKoopaShell then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-----------
|
-----------
|
||||||
-- hooks --
|
-- hooks --
|
||||||
-----------
|
-----------
|
||||||
|
@ -532,9 +647,14 @@ hook_event(HOOK_ON_HUD_RENDER, on_hud_render)
|
||||||
hook_event(HOOK_ON_PAUSE_EXIT, on_pause_exit)
|
hook_event(HOOK_ON_PAUSE_EXIT, on_pause_exit)
|
||||||
hook_event(HOOK_ALLOW_PVP_ATTACK, allow_pvp_attack)
|
hook_event(HOOK_ALLOW_PVP_ATTACK, allow_pvp_attack)
|
||||||
hook_event(HOOK_ON_INTERACT, on_interact)
|
hook_event(HOOK_ON_INTERACT, on_interact)
|
||||||
|
hook_event(HOOK_ALLOW_INTERACT, allow_interact)
|
||||||
|
|
||||||
hook_chat_command('hide-and-seek', "[on|off] turn hide-and-seek on or off", on_hide_and_seek_command)
|
hook_chat_command('hide-and-seek', "[on|off] turn hide-and-seek on or off", on_hide_and_seek_command)
|
||||||
|
hook_chat_command('touch-to-tag', "[on|off] turn touch tag on or off", on_touch_tag_command)
|
||||||
|
hook_chat_command('hiders-caps', "[on|off] turn caps for hiders on or off", on_hider_cap_command)
|
||||||
|
hook_chat_command('seekers-caps', "[on|off] turn caps for seekers on or off", on_seeker_cap_command)
|
||||||
hook_chat_command('anti-camp', "[on|off] turn the anti-camp timer on or off", on_anti_camp_command)
|
hook_chat_command('anti-camp', "[on|off] turn the anti-camp timer on or off", on_anti_camp_command)
|
||||||
|
hook_chat_command('koopa-shell', "[on|off] Turn the koopa shell on or off", on_koopa_shell_command)
|
||||||
|
|
||||||
-- call functions when certain sync table values change
|
-- call functions when certain sync table values change
|
||||||
hook_on_sync_table_change(gGlobalSyncTable, 'roundState', 0, on_round_state_changed)
|
hook_on_sync_table_change(gGlobalSyncTable, 'roundState', 0, on_round_state_changed)
|
||||||
|
|
Loading…
Reference in a new issue