2023-12-16 18:25:28 +00:00
|
|
|
for i = 0, MAX_PLAYERS -1, 1 do
|
|
|
|
gPlayerSyncTable[i].customVoice = 0
|
|
|
|
end
|
|
|
|
|
|
|
|
local voicecount = 0
|
|
|
|
|
|
|
|
local SLEEP_TALK_SNORES = 8
|
|
|
|
|
|
|
|
gCustomVoiceSamples = {}
|
|
|
|
gCustomVoiceSamplesBackup = {}
|
|
|
|
gCustomVoiceStream = nil
|
|
|
|
|
2024-03-09 19:23:25 +00:00
|
|
|
-- localize functions to improve performance
|
|
|
|
local audio_sample_stop,audio_sample_destroy,type,math_random,audio_stream_stop,audio_stream_destroy,audio_stream_load,audio_stream_play,audio_sample_load,audio_sample_play,is_game_paused,play_character_sound = audio_sample_stop,audio_sample_destroy,type,math.random,audio_stream_stop,audio_stream_destroy,audio_stream_load,audio_stream_play,audio_sample_load,audio_sample_play,is_game_paused,play_character_sound
|
|
|
|
|
2023-12-16 18:25:28 +00:00
|
|
|
--- @param m MarioState
|
|
|
|
function stop_custom_character_sound(m, sound)
|
|
|
|
local voice_sample = gCustomVoiceSamples[m.playerIndex]
|
|
|
|
if voice_sample == false and gCustomVoiceSamplesBackup[m.playerIndex].loaded then
|
|
|
|
audio_sample_stop(gCustomVoiceSamplesBackup[m.playerIndex])
|
|
|
|
audio_sample_destroy(gCustomVoiceSamplesBackup[m.playerIndex])
|
|
|
|
voicecount = voicecount - 1
|
|
|
|
gCustomVoiceSamplesBackup[m.playerIndex] = nil
|
|
|
|
return
|
|
|
|
end
|
|
|
|
if voice_sample == nil or type(voice_sample) == "boolean" then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
if not voice_sample.loaded then
|
|
|
|
gCustomVoiceSamplesBackup[m.playerIndex] = true
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
audio_sample_stop(voice_sample)
|
|
|
|
if voice_sample.file.relativePath:match('^.+/(.+)$') == sound then
|
|
|
|
return voice_sample
|
|
|
|
end
|
|
|
|
audio_sample_destroy(voice_sample)
|
|
|
|
voicecount = voicecount - 1
|
|
|
|
end
|
|
|
|
|
|
|
|
--- @param m MarioState
|
|
|
|
function play_custom_character_sound(m, voice)
|
|
|
|
local sound
|
|
|
|
if type(voice) == "table" then
|
|
|
|
sound = voice[math.random(#voice)]
|
|
|
|
else
|
|
|
|
sound = voice
|
|
|
|
end
|
|
|
|
if sound == nil then return 0 end
|
|
|
|
|
|
|
|
--Get current sample and stop it
|
|
|
|
local voice_sample = stop_custom_character_sound(m, sound)
|
|
|
|
|
|
|
|
if type(sound) ~= "string" then
|
|
|
|
return sound
|
|
|
|
end
|
|
|
|
|
|
|
|
if (m.area == nil or m.area.camera == nil) and m.playerIndex == 0 then
|
|
|
|
if gCustomVoiceStream ~= nil then
|
|
|
|
audio_stream_stop(gCustomVoiceStream)
|
|
|
|
audio_stream_destroy(gCustomVoiceStream)
|
|
|
|
end
|
|
|
|
gCustomVoiceStream = audio_stream_load(sound)
|
|
|
|
audio_stream_play(gCustomVoiceStream, true, 1)
|
|
|
|
else
|
|
|
|
if voice_sample == nil then
|
|
|
|
voice_sample = audio_sample_load(sound)
|
|
|
|
while not voice_sample.loaded do end
|
|
|
|
voicecount = voicecount + 1
|
|
|
|
end
|
|
|
|
audio_sample_play(voice_sample, m.pos, 1)
|
|
|
|
|
|
|
|
if gCustomVoiceSamplesBackup[m.playerIndex] ~= nil and not(gCustomVoiceSamples[m.playerIndex] == false) then
|
|
|
|
gCustomVoiceSamplesBackup[m.playerIndex] = voice_sample
|
|
|
|
else
|
|
|
|
gCustomVoiceSamples[m.playerIndex] = voice_sample
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return 0
|
|
|
|
end
|
|
|
|
|
|
|
|
--- @param m MarioState
|
|
|
|
local function custom_character_sound(m, characterSound)
|
2024-02-20 21:10:45 +00:00
|
|
|
if is_game_paused() or optionTable[optionTableRef.localVoices].toggle == 0 then return end
|
2023-12-16 18:25:28 +00:00
|
|
|
if characterSound == CHAR_SOUND_SNORING3 then return 0 end
|
|
|
|
if characterSound == CHAR_SOUND_HAHA and m.hurtCounter > 0 then return 0 end
|
|
|
|
|
|
|
|
local voice = _G.charSelect.character_get_voice(m)[characterSound]
|
|
|
|
if voice ~= nil then
|
|
|
|
return play_custom_character_sound(m, voice)
|
|
|
|
end
|
|
|
|
return 0
|
|
|
|
end
|
|
|
|
|
|
|
|
local STARTING_SNORE = 46
|
|
|
|
local SLEEP_TALK_START = STARTING_SNORE + 49
|
|
|
|
local SLEEP_TALK_END = SLEEP_TALK_START + SLEEP_TALK_SNORES
|
|
|
|
|
|
|
|
--- @param m MarioState
|
|
|
|
local function custom_character_snore(m)
|
2024-02-20 21:10:45 +00:00
|
|
|
if is_game_paused() or optionTable[optionTableRef.localVoices].toggle == 0 then return end
|
2023-12-16 18:25:28 +00:00
|
|
|
if gCustomVoiceSamplesBackup[m.playerIndex] ~= nil and not (gCustomVoiceSamples[m.playerIndex] == false) then
|
|
|
|
if gCustomVoiceSamples[m.playerIndex].loaded then
|
|
|
|
audio_sample_destroy(gCustomVoiceSamples[m.playerIndex])
|
|
|
|
voicecount = voicecount - 1
|
|
|
|
gCustomVoiceSamples[m.playerIndex] = false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
local SNORE3_TABLE = _G.charSelect.character_get_voice(m)[CHAR_SOUND_SNORING3]
|
|
|
|
|
|
|
|
if m.action ~= ACT_SLEEPING then
|
|
|
|
if m.isSnoring > 0 then
|
|
|
|
stop_custom_character_sound(m)
|
|
|
|
end
|
|
|
|
return
|
|
|
|
|
|
|
|
elseif not (m.actionState == 2 and (m.flags & MARIO_MARIO_SOUND_PLAYED) ~= 0) then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
local animFrame = m.marioObj.header.gfx.animInfo.animFrame
|
|
|
|
|
|
|
|
if SNORE3_TABLE ~= nil and #SNORE3_TABLE >= 2 then
|
|
|
|
if animFrame == 2 and m.actionTimer < SLEEP_TALK_START then
|
|
|
|
play_custom_character_sound(m, SNORE3_TABLE[2])
|
|
|
|
elseif animFrame == 25 then
|
|
|
|
if #SNORE3_TABLE >= 3 then
|
|
|
|
m.actionTimer = m.actionTimer + 1
|
|
|
|
if m.actionTimer >= SLEEP_TALK_END then
|
|
|
|
m.actionTimer = STARTING_SNORE
|
|
|
|
end
|
|
|
|
if m.actionTimer == SLEEP_TALK_START then
|
|
|
|
play_custom_character_sound(m, SNORE3_TABLE[3])
|
|
|
|
elseif m.actionTimer < SLEEP_TALK_START then
|
|
|
|
play_custom_character_sound(m, SNORE3_TABLE[1])
|
|
|
|
end
|
|
|
|
else
|
|
|
|
play_custom_character_sound(m, SNORE3_TABLE[1])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
elseif animFrame == 2 then
|
|
|
|
play_character_sound(m, CHAR_SOUND_SNORING2)
|
|
|
|
|
|
|
|
elseif animFrame == 25 then
|
|
|
|
play_character_sound(m, CHAR_SOUND_SNORING1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
_G.charSelect.voice = {
|
|
|
|
sound = custom_character_sound,
|
|
|
|
snore = custom_character_snore,
|
|
|
|
}
|
|
|
|
gPlayerSyncTable[0].customVoice = true
|