diff --git a/include/PR/os_voice.h b/include/PR/os_voice.h index c6317a28c4..09cbc906e2 100644 --- a/include/PR/os_voice.h +++ b/include/PR/os_voice.h @@ -29,6 +29,21 @@ typedef struct { /* 0x14 */ u16 distance[5]; // Distance value } OSVoiceData; // size = 0x20 +#define VOICE_STATUS_READY 0 /* stop/end */ +#define VOICE_STATUS_START 1 /* Voice Undetected (no voice input) */ +#define VOICE_STATUS_CANCEL 3 /* Cancel (cancel extraneous noise) */ +#define VOICE_STATUS_BUSY 5 /* Detected/Detecting (voice being input, recognition processing under way) */ +#define VOICE_STATUS_END 7 /* End recognition processing (enable execution of Get Recognition Results command) */ + +#define VOICE_WARN_TOO_SMALL 0x400 /* Voice level is too low (100 < Voice Level < 150) */ +#define VOICE_WARN_TOO_LARGE 0x800 /* Voice level is too high (Voice Level > 3500) */ +#define VOICE_WARN_NOT_FIT 0x4000 /* No words match recognition word (No. 1 Candidate Distance Value > 1600) */ +#define VOICE_WARN_TOO_NOISY 0x8000 /* Too much ambient noise (Relative Voice Level =< 400) */ + +typedef struct { + /* 0x000 */ u16 words[20][15]; // 20 words, each with up to 15 syllables + /* 0x258 */ u8 numWords; +} OSVoiceDictionary; // size = 0x25C s32 osVoiceInit(OSMesgQueue* mq, OSVoiceHandle* hd, int channel); s32 osVoiceSetWord(OSVoiceHandle* hd, u8* word); diff --git a/include/functions.h b/include/functions.h index 75f24f3c91..76ac1de877 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1326,25 +1326,6 @@ u8 func_801A3950(u8 seqPlayerIndex, u8 resetChannelIO); u8 func_801A39F8(void); s32 func_801A46F8(void); -void func_801A4EB0(void); -// void func_801A4EB8(void); -void func_801A4FD8(void); -void func_801A5080(u16 arg0); -u16 func_801A5100(void); -void func_801A5118(void); -UNK_TYPE func_801A51F0(UNK_TYPE arg0); -// void func_801A5228(void); -// void func_801A5390(void); -// void func_801A53E8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5); -// void func_801A541C(void); -// void func_801A5488(void); -// void func_801A54C4(void); -// void func_801A54D0(void); -// void func_801A5680(void); -// void func_801A5808(void); -void AudioVoice_ResetData(void); -// void func_801A5A1C(void); - void AudioSfx_MuteBanks(u16 muteMask); void AudioSfx_LowerBgmVolume(u8 channelIndex); void AudioSfx_RestoreBgmVolume(u8 channelIndex); diff --git a/include/variables.h b/include/variables.h index a2e1c6f63c..6cec939222 100644 --- a/include/variables.h +++ b/include/variables.h @@ -225,144 +225,15 @@ extern s16 gInvalidAdpcmCodeBook[]; extern f32 gHeadsetPanVolume[]; extern f32 gStereoPanVolume[]; extern f32 gDefaultPanVolume[]; -// extern UNK_TYPE1 D_801D5F24; -// extern UNK_TYPE4 D_801D5FB4; -// extern UNK_TYPE4 D_801D5FB8; -// extern UNK_TYPE4 D_801D5FBC; -// extern UNK_TYPE4 D_801D5FC0; -// extern UNK_TYPE1 D_801D5FD4; -extern UNK_PTR D_801D5FE0; -// extern UNK_TYPE1 D_801D5FE4; extern s32 gAudioCtxInitalized; -// extern UNK_TYPE4 D_801D5FEC; -// extern UNK_TYPE4 D_801D6190; -// extern UNK_TYPE4 D_801D6194; extern u8 D_801D6200[0x400]; extern u8 gIsLargeSfxBank[7]; extern u8 D_801D6608[7]; extern u8 gChannelsPerBank[4][7]; extern u8 gUsedChannelsPerBank[4][7]; -// extern UNK_TYPE1 D_801D6648; -// extern UNK_TYPE1 D_801D664C; -// extern UNK_TYPE1 D_801D6650; extern f32 gSfxVolume; -// extern UNK_TYPE1 D_801D6658; -// extern UNK_TYPE1 D_801D665C; -// extern UNK_TYPE1 D_801D6660; -// extern UNK_TYPE1 D_801D666C; -// extern UNK_TYPE1 D_801D6680; -// extern UNK_TYPE1 D_801D6684; -// extern UNK_TYPE4 D_801D6694; -// extern UNK_TYPE1 D_801D6698; -// extern UNK_TYPE1 D_801D669E; -// extern UNK_TYPE1 D_801D669F; -// extern UNK_TYPE1 D_801D66A0; -// extern UNK_TYPE2 D_801D66A4; -// extern UNK_TYPE1 D_801D66A8; -// extern UNK_TYPE1 D_801D66AC; -// extern UNK_TYPE1 D_801D66B0; -// extern UNK_TYPE1 D_801D66B4; -// extern UNK_TYPE1 D_801D66B8; -// extern UNK_TYPE1 D_801D66BC; -// extern UNK_TYPE1 D_801D66C0; -// extern UNK_TYPE4 D_801D66C4; -// extern UNK_TYPE1 D_801D66C8; -// extern UNK_TYPE2 D_801D66CC; -// extern UNK_TYPE1 D_801D66D0; -// extern UNK_TYPE1 D_801D66D4; -// extern UNK_TYPE4 D_801D66D8; -// extern UNK_TYPE4 D_801D66DC; -// extern UNK_TYPE1 D_801D66E0; -// extern UNK_TYPE1 D_801D66E4; -// extern UNK_TYPE1 D_801D66E8; -// extern UNK_TYPE1 D_801D66EC; -// extern UNK_TYPE1 D_801D66F0; -// extern UNK_TYPE4 D_801D66F4; -// extern UNK_TYPE4 D_801D66F8; -// extern UNK_TYPE1 D_801D66FC; -// extern UNK_TYPE1 D_801D6700; -// extern UNK_TYPE1 D_801D6780; -// extern UNK_TYPE1 D_801D6794; -// extern UNK_TYPE1 D_801D6FB4; -// extern UNK_TYPE1 D_801D6FB8; -// extern UNK_TYPE1 D_801D6FBC; -// extern UNK_TYPE1 D_801D6FC0; -// extern UNK_TYPE1 D_801D6FC4; -// extern UNK_TYPE1 D_801D6FC8; -// extern UNK_TYPE4 D_801D6FCC; -// extern UNK_TYPE1 D_801D6FD0; -// extern UNK_TYPE1 D_801D6FD4; -// extern UNK_TYPE1 D_801D6FD8; -// extern UNK_TYPE1 D_801D6FDC; -// extern UNK_TYPE1 D_801D6FE0; -// extern UNK_TYPE1 sPlaybackStaffStopPos; -// extern UNK_TYPE1 sPlaybackStaffStartPos; -// extern UNK_TYPE4 D_801D6FEC; -// extern UNK_TYPE4 D_801D6FF0; -// extern UNK_TYPE2 D_801D6FF4; -// extern UNK_TYPE2 D_801D6FF8; -// extern UNK_TYPE4 D_801D6FFC; -// extern UNK_TYPE1 D_801D7000; -// extern UNK_TYPE1 D_801D7004; -// extern UNK_TYPE1 D_801D7008; -// extern UNK_TYPE1 D_801D700C; -// extern UNK_TYPE4 D_801D7010; -// extern UNK_TYPE4 D_801D7014; -// extern UNK_TYPE4 D_801D7018; -// extern UNK_TYPE4 D_801D701C; -// extern UNK_TYPE1 D_801D701E; -// extern UNK_TYPE1 D_801D701F; -// extern UNK_TYPE1 D_801D7020; -// extern UNK_TYPE1 D_801D7028; -// extern UNK_TYPE1 D_801D702C; -// extern UNK_TYPE1 D_801D7030; -// extern UNK_TYPE1 D_801D7038; -// extern UNK_TYPE1 D_801D703C; -// extern UNK_TYPE1 D_801D7040; -// extern UNK_TYPE1 D_801D7044; -// extern UNK_TYPE4 D_801D7E04; -// extern UNK_TYPE1 D_801D7EA4; -// extern UNK_TYPE1 D_801D7F44; -// extern UNK_TYPE1 D_801D84E4; -extern UNK_PTR D_801D84F0; -// extern UNK_TYPE1 D_801D84F4; -// extern UNK_TYPE1 D_801D8508; -// extern UNK_TYPE1 D_801D850C; -// extern UNK_TYPE4 D_801D8510; -// extern UNK_TYPE1 D_801D8514; -// extern UNK_TYPE1 D_801D8518; -// extern UNK_TYPE1 D_801D851C; -// extern UNK_TYPE1 D_801D8520; -// extern UNK_TYPE1 D_801D8524; -// extern UNK_TYPE1 D_801D8528; -// extern UNK_TYPE1 D_801D852C; -// extern UNK_TYPE1 D_801D8530; -// extern UNK_TYPE4 D_801D8534; -// extern UNK_TYPE1 D_801D8538; -// extern UNK_TYPE1 D_801D853C; -// extern UNK_TYPE2 D_801D853E; -// extern UNK_TYPE1 D_801D8544; -extern UNK_PTR D_801D889C; extern u8* gScarecrowSpawnSongPtr; -extern UNK_PTR D_801D88A4; -// extern UNK_TYPE1 D_801D88A8; -// extern UNK_TYPE1 D_801D88B8; extern OcarinaSongButtons gOcarinaSongButtons[24]; -// extern UNK_TYPE1 D_801D8B20; -extern UNK_PTR D_801D8B24; -// extern UNK_TYPE2 D_801D8B28; -// extern UNK_TYPE1 D_801D8B2C; -// extern UNK_TYPE1 D_801D8B30; -// extern UNK_TYPE1 D_801D8BB0; -// extern UNK_TYPE2 D_801D8BD0; -// extern UNK_TYPE4 D_801D8BD4; -// extern UNK_TYPE1 D_801D8BE0; -// extern UNK_TYPE1 D_801D8E3C; -// extern UNK_TYPE4 D_801D8E40; -// extern UNK_TYPE2 D_801D8E44; -// extern UNK_TYPE1 D_801D8E48; -// extern UNK_TYPE1 D_801D8E50; -// extern UNK_TYPE1 D_801D8F70; extern SfxParams* gSfxParams[7]; extern SfxBankEntry* gSfxBanks[7]; extern u8 gSfxChannelLayout; @@ -1765,98 +1636,7 @@ extern MtxF* sMatrixStack; extern MtxF* sCurrentMatrix; extern s32 D_801FD120; -// extern UNK_TYPE1 D_801FD140; -// extern UNK_TYPE1 D_801FD158; -// extern UNK_TYPE1 D_801FD198; -// extern UNK_TYPE1 D_801FD1E0; -// extern UNK_TYPE1 D_801FD1F0; -// extern UNK_TYPE1 D_801FD250; -// extern UNK_TYPE1 D_801FD254; -// extern UNK_TYPE1 D_801FD258; -// extern UNK_TYPE1 D_801FD25C; -// extern UNK_TYPE1 D_801FD260; -// extern UNK_TYPE1 D_801FD264; -// extern UNK_TYPE1 D_801FD268; -// extern UNK_TYPE1 D_801FD278; -// extern UNK_TYPE1 D_801FD288; -// extern UNK_TYPE1 D_801FD28C; -// extern UNK_TYPE1 D_801FD28D; -// extern UNK_TYPE1 D_801FD28E; -// extern UNK_TYPE1 D_801FD28F; -// extern UNK_TYPE1 D_801FD290; -// extern UNK_TYPE1 D_801FD291; -// extern UNK_TYPE1 D_801FD294; -// extern UNK_TYPE1 D_801FD298; -// extern UNK_TYPE1 D_801FD29C; -// extern UNK_TYPE1 D_801FD2A0; -// extern UNK_TYPE1 D_801FD2A8; -// extern UNK_TYPE1 sRomaniSingingTimer; -// extern UNK_TYPE1 sRomaniSingingDisabled; -// extern UNK_TYPE1 D_801FD3AA; -// extern UNK_TYPE1 D_801FD3AB; -// extern UNK_TYPE1 D_801FD3AC; -// extern UNK_TYPE1 D_801FD3AE; -// extern UNK_TYPE1 D_801FD3AF; -// extern UNK_TYPE1 D_801FD3B0; -// extern UNK_TYPE1 D_801FD3B4; -// extern UNK_TYPE1 D_801FD3B7; -// extern UNK_TYPE1 D_801FD3B8; -// extern UNK_TYPE1 D_801FD3D8; -// extern UNK_TYPE1 D_801FD3D9; -// extern UNK_TYPE1 D_801FD3DA; -// extern UNK_TYPE1 D_801FD3E0; -// extern UNK_TYPE1 D_801FD3EC; -// extern UNK_TYPE1 D_801FD3F0; -// extern UNK_TYPE1 D_801FD3FC; -// extern UNK_TYPE1 D_801FD400; -// extern UNK_TYPE1 D_801FD404; -// extern UNK_TYPE1 D_801FD408; -// extern UNK_TYPE1 D_801FD40C; -// extern UNK_TYPE1 D_801FD410; -// extern UNK_TYPE1 D_801FD420; -// extern UNK_TYPE1 D_801FD42C; -// extern UNK_TYPE1 D_801FD430; -// extern UNK_TYPE1 D_801FD431; -// extern UNK_TYPE1 D_801FD432; -// extern UNK_TYPE1 D_801FD433; -// extern UNK_TYPE1 D_801FD434; -// extern UNK_TYPE1 D_801FD435; -// extern UNK_TYPE1 D_801FD436; -// extern UNK_TYPE1 sPrevAmbienceSeqId; -// extern UNK_TYPE1 D_801FD43A; -// extern UNK_TYPE1 D_801FD43B; -// extern UNK_TYPE1 D_801FD43E; -// extern UNK_TYPE1 D_801FD442; -// extern UNK_TYPE1 D_801FD448; -// extern UNK_TYPE1 D_801FD44C; -// extern UNK_TYPE1 D_801FD44D; -// extern UNK_TYPE1 D_801FD450; -// extern UNK_TYPE1 D_801FD454; -// extern UNK_TYPE1 D_801FD458; -// extern UNK_TYPE1 D_801FD45C; -// extern UNK_TYPE1 D_801FD460; -// extern UNK_TYPE1 D_801FD461; -// extern UNK_TYPE1 D_801FD462; -// extern UNK_TYPE1 D_801FD463; -// extern UNK_TYPE1 D_801FD464; -// extern UNK_TYPE1 D_801FD468; -// extern UNK_TYPE1 D_801FD46C; -// extern UNK_TYPE1 D_801FD470; -// extern UNK_TYPE1 D_801FD4A0; -// extern UNK_TYPE1 D_801FD4D0; -// extern UNK_TYPE1 D_801FD500; -// extern UNK_TYPE1 D_801FD518; -// extern UNK_TYPE1 D_801FD530; -// extern UNK_TYPE1 D_801FD533; -// extern UNK_TYPE1 D_801FD590; -// extern UNK_TYPE1 D_801FD598; -// extern UNK_TYPE1 D_801FD5A0; -// extern UNK_TYPE1 D_801FD5A4; -// extern UNK_TYPE1 D_801FD5C4; -// extern UNK_TYPE1 D_801FD5C8; -// extern UNK_TYPE1 D_801FD5E8; -// extern UNK_TYPE1 D_801FD608; -// extern UNK_TYPE1 D_801FD610; + extern ActiveSfx gActiveSfx[7][3]; extern SeqRequest sSeqRequests[][5]; extern u8 sNumSeqRequests[5]; diff --git a/include/z64audio.h b/include/z64audio.h index 7beabf7e8f..64fbf11da3 100644 --- a/include/z64audio.h +++ b/include/z64audio.h @@ -935,6 +935,4 @@ typedef u32 (*AudioCustomSeqFunction)(s8 value, SequenceChannel* channel); typedef void* (*AudioCustomReverbFunction)(Sample*, s32, s8, s32); typedef Acmd* (*AudioCustomSynthFunction)(Acmd*, s32, s32); -extern OSVoiceHandle gVoiceHandle; - #endif diff --git a/include/z64ocarina.h b/include/z64ocarina.h index 2419a98df3..5d1aea26ac 100644 --- a/include/z64ocarina.h +++ b/include/z64ocarina.h @@ -197,16 +197,16 @@ typedef enum { // Mainly set by func_80152CAC in z_message.c typedef enum { - /* 0 */ OCARINA_INSTRUMENT_OFF, - /* 1 */ OCARINA_INSTRUMENT_DEFAULT, - /* 2 */ OCARINA_INSTRUMENT_FEMALE_VOICE, - /* 3 */ OCARINA_INSTRUMENT_WHISTLING_FLUTE, - /* 4 */ OCARINA_INSTRUMENT_HARP, - /* 5 */ OCARINA_INSTRUMENT_IKANA_KING, - /* 6 */ OCARINA_INSTRUMENT_TATL, // Sounds like bells - /* 7 */ OCARINA_INSTRUMENT_GORON_DRUMS, - /* 8 */ OCARINA_INSTRUMENT_ZORA_GUITAR, - /* 9 */ OCARINA_INSTRUMENT_DEKU_PIPES, + /* 0 */ OCARINA_INSTRUMENT_OFF, + /* 1 */ OCARINA_INSTRUMENT_DEFAULT, + /* 2 */ OCARINA_INSTRUMENT_FEMALE_VOICE, + /* 3 */ OCARINA_INSTRUMENT_WHISTLING_FLUTE, + /* 4 */ OCARINA_INSTRUMENT_HARP, + /* 5 */ OCARINA_INSTRUMENT_IKANA_KING, + /* 6 */ OCARINA_INSTRUMENT_TATL, // Sounds like bells + /* 7 */ OCARINA_INSTRUMENT_GORON_DRUMS, + /* 8 */ OCARINA_INSTRUMENT_ZORA_GUITAR, + /* 9 */ OCARINA_INSTRUMENT_DEKU_PIPES, /* 10 */ OCARINA_INSTRUMENT_MONKEY, /* 11 */ OCARINA_INSTRUMENT_DEKU_TRUMPET, // Pull out ocarina for captured monkey /* 12 */ OCARINA_INSTRUMENT_ELDER_GORON_DRUMS, @@ -217,9 +217,9 @@ typedef enum { } OcarinaInstrumentId; typedef enum { - /* 0 */ OCARINA_RECORD_OFF, - /* 1 */ OCARINA_RECORD_SCARECROW_LONG, - /* 2 */ OCARINA_RECORD_SCARECROW_SPAWN, + /* 0 */ OCARINA_RECORD_OFF, + /* 1 */ OCARINA_RECORD_SCARECROW_LONG, + /* 2 */ OCARINA_RECORD_SCARECROW_SPAWN, /* -1 */ OCARINA_RECORD_REJECTED = 0xFF } OcarinaRecordingState; diff --git a/include/z64save.h b/include/z64save.h index 1a43308f97..cdebffc256 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -34,16 +34,16 @@ typedef enum RespawnMode { #define SAVE_BUFFER_SIZE 0x4000 typedef enum { - /* 0 */ MAGIC_STATE_IDLE, // Regular gameplay - /* 1 */ MAGIC_STATE_CONSUME_SETUP, // Sets the speed at which the magic border flashes - /* 2 */ MAGIC_STATE_CONSUME, // Consume magic until target is reached or no more magic is available - /* 3 */ MAGIC_STATE_METER_FLASH_1, // Flashes border - /* 4 */ MAGIC_STATE_METER_FLASH_2, // Flashes border and draws yellow magic to preview target consumption - /* 5 */ MAGIC_STATE_RESET, // Reset colors and return to idle - /* 6 */ MAGIC_STATE_METER_FLASH_3, // Flashes border with no additional behaviour - /* 7 */ MAGIC_STATE_CONSUME_LENS, // Magic slowly consumed by Lens of Truth - /* 8 */ MAGIC_STATE_STEP_CAPACITY, // Step `magicCapacity` to full capacity - /* 9 */ MAGIC_STATE_FILL, // Add magic until magicFillTarget is reached + /* 0 */ MAGIC_STATE_IDLE, // Regular gameplay + /* 1 */ MAGIC_STATE_CONSUME_SETUP, // Sets the speed at which the magic border flashes + /* 2 */ MAGIC_STATE_CONSUME, // Consume magic until target is reached or no more magic is available + /* 3 */ MAGIC_STATE_METER_FLASH_1, // Flashes border + /* 4 */ MAGIC_STATE_METER_FLASH_2, // Flashes border and draws yellow magic to preview target consumption + /* 5 */ MAGIC_STATE_RESET, // Reset colors and return to idle + /* 6 */ MAGIC_STATE_METER_FLASH_3, // Flashes border with no additional behaviour + /* 7 */ MAGIC_STATE_CONSUME_LENS, // Magic slowly consumed by Lens of Truth + /* 8 */ MAGIC_STATE_STEP_CAPACITY, // Step `magicCapacity` to full capacity + /* 9 */ MAGIC_STATE_FILL, // Add magic until magicFillTarget is reached /* 10 */ MAGIC_STATE_CONSUME_GORON_ZORA_SETUP, /* 11 */ MAGIC_STATE_CONSUME_GORON_ZORA, // Magic slowly consumed by Goron spiked rolling or Zora electric barrier. /* 12 */ MAGIC_STATE_CONSUME_GIANTS_MASK // Magic slowly consumed by Giant's Mask @@ -1362,7 +1362,9 @@ typedef enum { #define WEEKEVENTREG_86_20 PACK_WEEKEVENTREG_FLAG(86, 0x20) #define WEEKEVENTREG_86_40 PACK_WEEKEVENTREG_FLAG(86, 0x40) #define WEEKEVENTREG_86_80 PACK_WEEKEVENTREG_FLAG(86, 0x80) -#define WEEKEVENTREG_87_01 PACK_WEEKEVENTREG_FLAG(87, 0x01) + +// Currently talking to a cow using the voice recognition unit +#define WEEKEVENTREG_TALKING_TO_COW_WITH_VOICE PACK_WEEKEVENTREG_FLAG(87, 0x01) // Set by Anju #define WEEKEVENTREG_COUPLES_MASK_CUTSCENE_STARTED PACK_WEEKEVENTREG_FLAG(87, 0x02) diff --git a/include/z64voice.h b/include/z64voice.h new file mode 100644 index 0000000000..957f20a234 --- /dev/null +++ b/include/z64voice.h @@ -0,0 +1,36 @@ +#ifndef Z64VOICE_H +#define Z64VOICE_H + +#include "PR/ultratypes.h" +#include "unk.h" +#include "PR/os_voice.h" + +typedef enum OSVoiceWordId { + /* 0 */ VOICE_WORD_ID_HOURS, + /* 1 */ VOICE_WORD_ID_CHEESE, + /* 2 */ VOICE_WORD_ID_WAKE_UP, + /* 3 */ VOICE_WORD_ID_SIT, + /* 4 */ VOICE_WORD_ID_MILK, + /* 5 */ VOICE_WORD_ID_HIYA, + /* 6 */ VOICE_WORD_ID_MAX, + /* -1 */ VOICE_WORD_ID_NONE = 0xFFFF +} OSVoiceWordId; + +void AudioVoice_Noop(void); +void AudioVoice_ResetWord(void); +void AudioVoice_InitWord(u16 wordId); +u16 AudioVoice_GetWord(void); +void AudioVoice_Update(void); +s32 func_801A51F0(s32 errorCode); +s32 func_801A5228(OSVoiceDictionary* dict); +OSVoiceData* func_801A5390(void); +void func_801A53E8(u16 distance, u16 answerNum, u16 warning, u16 voiceLevel, u16 voiceRelLevel); +u8* AudioVoice_GetVoiceMaskPattern(void); +s32 AudioVoice_InitWordImplAlt(u16 wordId); +s32 AudioVoice_InitWordImpl(u16 wordId); +s32 func_801A5808(void); +void AudioVoice_ResetData(void); + +extern OSVoiceHandle gVoiceHandle; + +#endif diff --git a/spec b/spec index 61b84f7959..49b24db348 100644 --- a/spec +++ b/spec @@ -594,10 +594,7 @@ beginseg include "build/asm/code/code_8019AEC0.text.o" // handwritten include "build/src/audio/code_8019AF00.o" include "build/src/audio/voice_external.o" - include "build/data/code/voice_external.data.o" include "build/src/audio/voice_internal.o" - include "build/data/code/voice_internal.data.o" - include "build/data/code/voice_internal.bss.o" pad_text include "build/src/audio/sfx_params.o" include "build/src/audio/sfx.o" diff --git a/src/audio/code_8019AF00.c b/src/audio/code_8019AF00.c index 039c8f5c55..6bf126dd1e 100644 --- a/src/audio/code_8019AF00.c +++ b/src/audio/code_8019AF00.c @@ -1,4 +1,5 @@ #include "global.h" +#include "z64voice.h" typedef struct { /* 0x0 */ s8 x; @@ -3626,7 +3627,7 @@ void Audio_Update(void) { if ((AudioSeq_UpdateAudioHeapReset() == 0) && !AudioSeq_ResetReverb()) { AudioOcarina_SetCustomSequence(); AudioOcarina_Update(); - func_801A5118(); + AudioVoice_Update(); Audio_StepFreqLerp(&sRiverFreqScaleLerp); Audio_StepFreqLerp(&sWaterfallFreqScaleLerp); Audio_UpdateRiverSoundVolumes(); @@ -6471,7 +6472,7 @@ void Audio_ResetForAudioHeapStep1(s32 specId) { AudioSfx_ResetSfxChannelState(); AudioSeq_ResetActiveSequences(); AudioSfx_Reset(); - func_801A4FD8(); + AudioVoice_ResetWord(); if (gAudioSpecId == 0xB) { AudioSfx_MuteBanks((1 << BANK_PLAYER) | (1 << BANK_ITEM) | (1 << BANK_ENV) | (1 << BANK_ENEMY) | (1 << BANK_OCARINA) | (1 << BANK_VOICE)); @@ -6484,5 +6485,5 @@ void Audio_UnusedReset(void) { Audio_ResetData(); AudioSfx_ResetSfxChannelState(); AudioSfx_Init(1); - func_801A4FD8(); + AudioVoice_ResetWord(); } diff --git a/src/audio/voice_external.c b/src/audio/voice_external.c index eba2069d8f..e483144e60 100644 --- a/src/audio/voice_external.c +++ b/src/audio/voice_external.c @@ -1,17 +1,139 @@ -#include "global.h" +#include "z64voice.h" +#include "padmgr.h" -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_external/func_801A4EB0.s") +OSVoiceDictionary sVoiceDictionary = { + { + // "アトナンジカン" - "atonanjikan" - "How many hours" + { 0x8341, 0x8367, 0x8369, 0x8393, 0x8357, 0x834A, 0x8393 }, -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_external/func_801A4EB8.s") + // "ハイチーズ" - "haichīzu" - "say cheese" + { 0x836E, 0x8343, 0x8360, 0x815B, 0x8359 }, -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_external/func_801A4FD8.s") + // "オキロー" - "okirō" - "wake up" + { 0x8349, 0x834C, 0x838D, 0x815B }, -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_external/func_801A5080.s") + // "オスワリ" - "osuwari" - "sit" + { 0x8349, 0x8358, 0x838F, 0x838A }, -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_external/func_801A50C0.s") + // "ミルク" - "miruku" - "milk" + { 0x837E, 0x838B, 0x834E }, -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_external/func_801A5100.s") + // "ハイヤー" - "haiyā" - "hiya!" + { 0x836E, 0x8343, 0x8384, 0x815B }, + }, -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_external/func_801A510C.s") + VOICE_WORD_ID_MAX, // number of words +}; -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_external/func_801A5118.s") +u8 D_801D8E3C = 0; +OSVoiceData* sVoiceData = NULL; +u16 sTopScoreWordId = VOICE_WORD_ID_NONE; +u8 D_801D8E48 = 0; + +// Relation to voice initialization +void AudioVoice_Noop(void) { +} + +void func_801A4EB8(void) { + u8* voiceMaskPattern; + OSMesgQueue* serialEventQueue; + s32 index; + u8 sp38[1]; + u8 i; + + if (D_801D8E3C != 0) { + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + osVoiceStopReadData(&gVoiceHandle); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + } + + voiceMaskPattern = AudioVoice_GetVoiceMaskPattern(); + + for (i = 0; i < 1; i++) { + sp38[i] = voiceMaskPattern[i]; + } + + if (func_801A5228(&sVoiceDictionary) == 0) { + for (i = 0; i < VOICE_WORD_ID_MAX; i++) { + index = i / 8; + if (((sp38[index] >> (i % 8)) & 1) == 1) { + AudioVoice_InitWordImplAlt(i); + } + } + + func_801A53E8(800, 2, VOICE_WARN_TOO_SMALL, 500, 2000); + D_801D8E3C = 1; + } +} + +void AudioVoice_ResetWord(void) { + s32 errorCode; + OSMesgQueue* serialEventQueue; + + AudioVoice_InitWordImplAlt(VOICE_WORD_ID_NONE); + + if (D_801D8E3C != 0) { + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + osVoiceStopReadData(&gVoiceHandle); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + errorCode = func_801A5228(&sVoiceDictionary); + AudioVoice_InitWordImplAlt(VOICE_WORD_ID_NONE); + if (errorCode == 0) { + func_801A53E8(800, 2, VOICE_WARN_TOO_SMALL, 500, 2000); + D_801D8E3C = 1; + } + + AudioVoice_InitWord(VOICE_WORD_ID_HIYA); + AudioVoice_InitWord(VOICE_WORD_ID_CHEESE); + } +} + +void AudioVoice_InitWord(u16 wordId) { + if ((D_801D8E3C != 0) && (wordId < VOICE_WORD_ID_MAX)) { + AudioVoice_InitWordImpl(wordId); + } +} + +// Unused +void AudioVoice_InitWordAlt(u16 wordId) { + if ((D_801D8E3C != 0) && (wordId < VOICE_WORD_ID_MAX)) { + AudioVoice_InitWordImplAlt(wordId); + } +} + +u16 AudioVoice_GetWord(void) { + return sTopScoreWordId; +} + +// Unused +u8 func_801A510C(void) { + return D_801D8E3C; +} + +void AudioVoice_Update(void) { + if (D_801D8E3C & 2) { + D_801D8E3C &= 1; + func_801A4EB8(); + } + + if (D_801D8E3C != 0) { + if (func_801A5808() != 0) { + D_801D8E48++; + if (D_801D8E48 == 10) { + D_801D8E3C = 0; + sTopScoreWordId = VOICE_WORD_ID_NONE; + return; + } + } else { + D_801D8E48 = 0; + } + + sVoiceData = func_801A5390(); + if (sVoiceData != 0) { + sTopScoreWordId = sVoiceData->answer[0]; + } else { + sTopScoreWordId = VOICE_WORD_ID_NONE; + } + } +} diff --git a/src/audio/voice_internal.c b/src/audio/voice_internal.c index 055b66ed16..3458cd85b1 100644 --- a/src/audio/voice_internal.c +++ b/src/audio/voice_internal.c @@ -1,42 +1,367 @@ -#include "global.h" +#include "z64voice.h" +#include "libc/stdbool.h" +#include "libc/string.h" +#include "padmgr.h" -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/D_801E0EC0.s") +// internal voice functions +char* func_801A5A1C(s8* words); -UNK_TYPE func_801A51F0(UNK_TYPE arg0) { - switch (arg0) { - case 1: - case 4: - case 5: - case 11: - case 13: - case 14: - case 15: +typedef struct { + /* 0x00 */ OSVoiceDictionary* dict; + /* 0x04 */ s8 mode; + /* 0x08 */ OSVoiceData* data; + /* 0x0C */ u16 distance; + /* 0x0E */ u16 answerNum; + /* 0x10 */ u16 warning; + /* 0x12 */ u16 voiceLevel; + /* 0x14 */ u16 voiceRelLevel; +} OSVoiceContext; // size = 0x18 + +typedef enum VoiceMode { + /* 0 */ VOICE_MODE_0, + /* 1 */ VOICE_MODE_1, + /* 2 */ VOICE_MODE_2 +} VoiceMode; + +// BSS +OSVoiceContext sVoiceContext; +OSVoiceHandle gVoiceHandle; +OSVoiceData D_801FD5C8; // Intermediate Voice Data during processsing? +OSVoiceData D_801FD5E8; // Best Match Voice Data? +u8 sVoiceMaskPattern[8]; +char D_801FD610[256]; + +// Data +s8 D_801D8E50[96][3] = { + "aa", "AA", "ii", "II", "uu", "UU", "ee", "EE", "oo", "OO", "KA", "GA", "KI", "GI", "KU", "GU", + "KE", "GE", "KO", "GO", "SA", "ZA", "SI", "ZI", "SU", "ZU", "SE", "ZE", "SO", "ZO", "TA", "DA", + "TI", "DI", "tu", "TU", "DU", "TE", "DE", "TO", "DO", "NA", "NI", "NU", "NE", "NO", "HA", "BA", + "PA", "HI", "BI", "PI", "HU", "BU", "PU", "HE", "BE", "PE", "HO", "BO", "PO", "MA", "MI", "MU", + "ME", "MO", "ya", "YA", "yu", "YU", "yo", "YO", "RA", "RI", "RU", "RE", "RO", "wa", "WA", "WI", + "WE", "WO", "NN", "VU", "ka", "ke", "", "", "", "", "", "", "", "", "", "", +}; + +s8 D_801D8F70[96][3] = { + "aa", "AA", "ii", "II", "uu", "UU", "ee", "EE", "oo", "OO", "KA", "GA", "KI", "GI", "KU", "GU", + "KE", "GE", "KO", "GO", "SA", "ZA", "SI", "ZI", "SU", "ZU", "SE", "ZE", "SO", "ZO", "TA", "DA", + "TI", "DI", "tu", "TU", "DU", "TE", "DE", "TO", "DO", "NA", "NI", "NU", "NE", "NO", "HA", "BA", + "PA", "HI", "BI", "PI", "HU", "BU", "PU", "HE", "BE", "PE", "HO", "BO", "PO", "MA", "MI", " ", + "MU", "ME", "MO", "ya", "YA", "yu", "YU", "yo", "YO", "RA", "RI", "RU", "RE", "RO", "wa", "WA", + "WI", "WE", "WO", "NN", "VU", "ka", "ke", "", "", "", "", "", "", "", "", "", +}; + +const char D_801E0EC0[] = "Error %d\n"; +const char D_801E0ECC[] = "NAI_VRS:osVoiceClearDictionary %d\n"; +const char D_801E0EF0[] = "NAI_VRS:dict error! (%d-%d %s)\n"; +const char D_801E0F10[] = "NAI_VRS:Ina_SetVruGain Error!\n"; +const char D_801E0F30[] = "NAI_VRS:mask on %d\n"; +const char D_801E0F48[] = "NAI_VRS:mask off %d\n"; +const char D_801E0F60[] = "NAI_VRS:answer No.:%d Dist:%d Warn:%04X Level:%5d SN:%5d (Num:%d)\n"; +const char D_801E0FA4[] = "NAI_VRS:error !! (ANS_MAX:%d DIST:%d WARNING:%04X LEVEL:%5d SN:%5d)\n"; + +s32 func_801A51F0(s32 errorCode) { + switch (errorCode) { + case CONT_ERR_NO_CONTROLLER: + case CONT_ERR_CONTRFAIL: + case CONT_ERR_INVALID: + case CONT_ERR_DEVICE: + case CONT_ERR_VOICE_MEMORY: + case CONT_ERR_VOICE_WORD: + case CONT_ERR_VOICE_NO_RESPONSE: return -1; + default: return 0; } } -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A5228.s") +s32 func_801A5228(OSVoiceDictionary* dict) { + OSMesgQueue* serialEventQueue; + s32 errorCode; + u8 numWords; + u8 i; -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A5390.s") + sVoiceContext.mode = VOICE_MODE_0; + sVoiceContext.data = NULL; + sVoiceContext.distance = 1000; + sVoiceContext.answerNum = 5; + sVoiceContext.warning = 0; + sVoiceContext.dict = dict; -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A53DC.s") + numWords = dict->numWords; -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A53E8.s") + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceClearDictionary(&gVoiceHandle, numWords); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A541C.s") + if (errorCode != 0) { + return errorCode; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A5488.s") + for (i = 0; i < (((numWords - 1) / 8) + 1); i++) { + sVoiceMaskPattern[i] = 0; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A54C4.s") + for (i = 0; i < numWords; i++) { + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceSetWord(&gVoiceHandle, (u8*)&dict->words[i]); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A54D0.s") + if (func_801A51F0(errorCode) != 0) { + func_801A5A1C((s8*)&dict->words[i]); + } + } -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A5680.s") + return errorCode; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A5808.s") +OSVoiceData* func_801A5390(void) { + OSVoiceData* voiceData; + OSMesgQueue* serialEventQueue; -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/AudioVoice_ResetData.s") + voiceData = sVoiceContext.data; + sVoiceContext.data = NULL; -#pragma GLOBAL_ASM("asm/non_matchings/code/voice_internal/func_801A5A1C.s") + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + osVoiceStartReadData(&gVoiceHandle); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + return voiceData; +} + +// Unused +OSVoiceDictionary* AudioVoice_GetVoiceDict(void) { + return sVoiceContext.dict; +} + +void func_801A53E8(u16 distance, u16 answerNum, u16 warning, u16 voiceLevel, u16 voiceRelLevel) { + sVoiceContext.distance = distance; + sVoiceContext.answerNum = answerNum; + sVoiceContext.warning = warning; + sVoiceContext.voiceLevel = voiceLevel; + sVoiceContext.voiceRelLevel = voiceRelLevel; +} + +// Unused +s32 func_801A541C(s32 analog, s32 digital) { + s32 errorCode; + OSMesgQueue* serialEventQueue; + + if (sVoiceContext.dict != NULL) { + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceControlGain(&gVoiceHandle, analog, digital); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + if (errorCode != 0) { + func_801A51F0(errorCode); + } + } +} + +// Unused +s32 func_801A5488(u8* word) { + s32 errorCode; + OSMesgQueue* serialEventQueue; + + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceCheckWord(word); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + return errorCode; +} + +u8* AudioVoice_GetVoiceMaskPattern(void) { + return sVoiceMaskPattern; +} + +s32 AudioVoice_InitWordImplAlt(u16 wordId) { + s32 errorCode; + u8 stopReadingData = true; + u8 numWords; + u8 i; + OSMesgQueue* serialEventQueue; + + if (sVoiceContext.dict != NULL) { + numWords = sVoiceContext.dict->numWords; + } else { + numWords = 20; + stopReadingData = false; + } + + if (wordId == VOICE_WORD_ID_NONE) { + for (i = 0; i < numWords; i++) { + sVoiceMaskPattern[i / 8] |= 1 << (i % 8); + } + } else { + if (sVoiceMaskPattern[wordId / 8] & (1 << (wordId % 8))) { + stopReadingData = false; + } else { + sVoiceMaskPattern[wordId / 8] |= (1 << (wordId % 8)); + } + } + + if (stopReadingData) { + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceStopReadData(&gVoiceHandle); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + if ((errorCode == 0) || (sVoiceContext.mode == VOICE_MODE_0)) { + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceMaskDictionary(&gVoiceHandle, sVoiceMaskPattern, ((numWords - 1) / 8) + 1); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + } + + sVoiceContext.mode = VOICE_MODE_0; + } + + return errorCode; +} + +s32 AudioVoice_InitWordImpl(u16 wordId) { + s32 errorCode; + u8 stopReadingData = true; + u8 numWords; + u8 i; + OSMesgQueue* serialEventQueue; + + if (sVoiceContext.dict != NULL) { + numWords = sVoiceContext.dict->numWords; + } else { + numWords = 20; + stopReadingData = false; + } + + if (wordId == VOICE_WORD_ID_NONE) { + for (i = 0; i < (((numWords - 1) / 8) + 1); i++) { + sVoiceMaskPattern[i] = 0; + } + } else { + if (!(sVoiceMaskPattern[wordId / 8] & (1 << (wordId % 8)))) { + stopReadingData = false; + } else { + sVoiceMaskPattern[wordId / 8] &= (1 << (wordId % 8)) ^ 0xFF; + } + } + + if (stopReadingData) { + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceStopReadData(&gVoiceHandle); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + if ((errorCode == 0) || (sVoiceContext.mode == VOICE_MODE_0)) { + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceMaskDictionary(&gVoiceHandle, sVoiceMaskPattern, ((numWords - 1) / 8) + 1); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + } + + sVoiceContext.mode = VOICE_MODE_0; + } + + return errorCode; +} + +s32 func_801A5808(void) { + s32 errorCode = 0; + s32 pad; + OSMesgQueue* serialEventQueue; + + switch (sVoiceContext.mode) { + case VOICE_MODE_0: + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceStartReadData(&gVoiceHandle); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + sVoiceContext.mode = VOICE_MODE_1; + break; + + case VOICE_MODE_1: + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceGetReadData(&gVoiceHandle, &D_801FD5C8); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + if (func_801A51F0(errorCode) == 0) { + switch (gVoiceHandle.status) { + case VOICE_STATUS_READY: + sVoiceContext.mode = VOICE_MODE_2; + break; + + case VOICE_STATUS_START: + case 2: + case VOICE_STATUS_CANCEL: + case 4: + case VOICE_STATUS_BUSY: + case 6: + break; + + case VOICE_STATUS_END: + sVoiceContext.mode = VOICE_MODE_2; + break; + + default: + break; + } + } + break; + + case VOICE_MODE_2: + if (((D_801FD5C8.warning & sVoiceContext.warning) == 0) && + (sVoiceContext.answerNum >= D_801FD5C8.answerNum) && + (sVoiceContext.distance >= D_801FD5C8.distance[0]) && + (D_801FD5C8.voiceLevel >= sVoiceContext.voiceLevel) && + (D_801FD5C8.voiceRelLevel >= sVoiceContext.voiceRelLevel)) { + D_801FD5E8 = D_801FD5C8; + sVoiceContext.data = &D_801FD5E8; + } + + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + osVoiceStopReadData(&gVoiceHandle); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + serialEventQueue = PadMgr_VoiceAcquireSerialEventQueue(); + errorCode = osVoiceStartReadData(&gVoiceHandle); + PadMgr_VoiceReleaseSerialEventQueue(serialEventQueue); + + sVoiceContext.mode = VOICE_MODE_1; + break; + + default: + break; + } + + return func_801A51F0(errorCode); +} + +// Unused +void AudioVoice_ResetData(void) { + sVoiceContext.dict = NULL; +} + +char* func_801A5A1C(s8* words) { + u8 i; + u8 j; + u8 numSyllables = strlen((const char*)words); // technically twice the num of syllables + u8 syllable[2]; + + for (j = 0, i = 0; i < numSyllables; i += 2) { + syllable[0] = words[i]; + syllable[1] = words[i + 1]; + + if (syllable[0] == 0x83) { + D_801FD610[j++] = D_801D8F70[syllable[1] - 0x40][0]; + D_801FD610[j++] = D_801D8F70[syllable[1] - 0x40][1]; + } else if (syllable[0] == 0x82) { + D_801FD610[j++] = D_801D8E50[syllable[1] - 0x9F][0]; + D_801FD610[j++] = D_801D8E50[syllable[1] - 0x9F][1]; + } else if ((syllable[0] == 0x81) && (syllable[1] == 0x5B)) { + D_801FD610[j++] = '-'; + D_801FD610[j++] = '-'; + } else { + D_801FD610[j++] = ' '; + D_801FD610[j++] = ' '; + } + } + + D_801FD610[i] = '\0'; + + return D_801FD610; +} diff --git a/src/code/padmgr.c b/src/code/padmgr.c index 1b75721cb9..2301024597 100644 --- a/src/code/padmgr.c +++ b/src/code/padmgr.c @@ -35,6 +35,7 @@ #include "PR/controller.h" #include "PR/os_motor.h" #include "fault.h" +#include "z64voice.h" extern FaultMgr gFaultMgr; @@ -527,7 +528,7 @@ void PadMgr_InitVoice(void) { } else { sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_VOICE; sVoiceInitStatus = VOICE_INIT_SUCCESS; - func_801A4EB0(); + AudioVoice_Noop(); } } } diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index cf7fbd1e39..f3077da953 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -3,6 +3,7 @@ #include "sys_cfb.h" #include "z64snap.h" #include "z64view.h" +#include "z64voice.h" #include "archives/icon_item_static/icon_item_static_yar.h" #include "interface/parameter_static/parameter_static.h" #include "interface/do_action_static/do_action_static.h" @@ -2345,7 +2346,8 @@ void Interface_UpdateButtonsPart1(PlayState* play) { interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0; restoreHudVisibility = true; sPictoState = PICTO_BOX_STATE_OFF; - } else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) || (func_801A5100() == 1)) { + } else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) || + (AudioVoice_GetWord() == VOICE_WORD_ID_CHEESE)) { if (!CHECK_EVENTINF(EVENTINF_41) || (CHECK_EVENTINF(EVENTINF_41) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE))) { Audio_PlaySfx(NA_SE_SY_CAMERA_SHUTTER); diff --git a/src/libultra/voice/voicegetreaddata.c b/src/libultra/voice/voicegetreaddata.c index 5e5a2b62bf..a82d23a870 100644 --- a/src/libultra/voice/voicegetreaddata.c +++ b/src/libultra/voice/voicegetreaddata.c @@ -33,7 +33,7 @@ s32 osVoiceGetReadData(OSVoiceHandle* hd, OSVoiceData* result) { sHandleStatus = data[0] & 7; hd->status = sHandleStatus; - if ((sHandleStatus != 0) && (sHandleStatus != 7)) { + if ((sHandleStatus != VOICE_STATUS_READY) && (sHandleStatus != VOICE_STATUS_END)) { return CONT_ERR_NOT_READY; } // fallthrough @@ -88,7 +88,7 @@ s32 osVoiceGetReadData(OSVoiceHandle* hd, OSVoiceData* result) { } hd->status = data[34] & 7; - if ((sHandleStatus == 0) || (hd->status == 0)) { + if ((sHandleStatus == VOICE_STATUS_READY) || (hd->status == VOICE_STATUS_READY)) { break; } // fallthrough diff --git a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c index 7023d20c74..cf3d93e951 100644 --- a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c +++ b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c @@ -29,9 +29,9 @@ ActorInit Dm_Ah_InitVars = { typedef enum { /* -1 */ DMAH_ANIM_NONE = -1, - /* 0 */ DMAH_ANIM_0, - /* 1 */ DMAH_ANIM_1, - /* 2 */ DMAH_ANIM_MAX + /* 0 */ DMAH_ANIM_0, + /* 1 */ DMAH_ANIM_1, + /* 2 */ DMAH_ANIM_MAX } DmAhAnimation; static AnimationInfoS sAnimationInfo[DMAH_ANIM_MAX] = { diff --git a/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/src/overlays/actors/ovl_En_Cow/z_en_cow.c index f9f1925d06..20fbfd41d4 100644 --- a/src/overlays/actors/ovl_En_Cow/z_en_cow.c +++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.c @@ -6,6 +6,7 @@ #include "z_en_cow.h" #include "z64horse.h" +#include "z64voice.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -132,7 +133,7 @@ void EnCow_Init(Actor* thisx, PlayState* play) { this->actor.targetMode = TARGET_MODE_6; gHorsePlayedEponasSong = false; - func_801A5080(4); + AudioVoice_InitWord(VOICE_WORD_ID_MILK); break; case EN_COW_TYPE_TAIL: @@ -158,7 +159,7 @@ void EnCow_Init(Actor* thisx, PlayState* play) { Actor_SetScale(&this->actor, 0.01f); this->flags = 0; - CLEAR_WEEKEVENTREG(WEEKEVENTREG_87_01); + CLEAR_WEEKEVENTREG(WEEKEVENTREG_TALKING_TO_COW_WITH_VOICE); } void EnCow_Destroy(Actor* thisx, PlayState* play) { @@ -291,11 +292,11 @@ void EnCow_Idle(EnCow* this, PlayState* play) { } } - if (this->actor.xzDistToPlayer < 150.0f && - ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) < 25000) { - if (func_801A5100() == 4) { - if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_87_01)) { - SET_WEEKEVENTREG(WEEKEVENTREG_87_01); + if ((this->actor.xzDistToPlayer < 150.0f) && + (ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) < 0x61A8)) { + if (AudioVoice_GetWord() == VOICE_WORD_ID_MILK) { + if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKING_TO_COW_WITH_VOICE)) { + SET_WEEKEVENTREG(WEEKEVENTREG_TALKING_TO_COW_WITH_VOICE); if (Inventory_HasEmptyBottle()) { this->actor.textId = 0x32C9; // Text to give milk. } else { @@ -306,7 +307,7 @@ void EnCow_Idle(EnCow* this, PlayState* play) { this->actionFunc = EnCow_Talk; } } else { - CLEAR_WEEKEVENTREG(WEEKEVENTREG_87_01); + CLEAR_WEEKEVENTREG(WEEKEVENTREG_TALKING_TO_COW_WITH_VOICE); } } @@ -322,8 +323,8 @@ void EnCow_DoTail(EnCow* this, PlayState* play) { Animation_GetLastFrame(&gCowTailIdleAnim), ANIMMODE_ONCE, 1.0f); } - if (this->actor.xzDistToPlayer < 150.0f && - ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) > 25000) { + if ((this->actor.xzDistToPlayer < 150.0f) && + (ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) > 0x61A8)) { if (!(this->flags & EN_COW_FLAG_PLAYER_HAS_APPROACHED)) { this->flags |= EN_COW_FLAG_PLAYER_HAS_APPROACHED; if (this->skelAnime.animation == &gCowTailIdleAnim) { @@ -360,8 +361,8 @@ void EnCow_Update(Actor* thisx, PlayState* play2) { this->actionFunc(this, play); - if (this->actor.xzDistToPlayer < 150.0f && - ABS_ALT(Math_Vec3f_Yaw(&thisx->world.pos, &player->actor.world.pos)) < 0xC000) { + if ((this->actor.xzDistToPlayer < 150.0f) && + (ABS_ALT(Math_Vec3f_Yaw(&thisx->world.pos, &player->actor.world.pos)) < 0xC000)) { targetX = Math_Vec3f_Pitch(&thisx->focus.pos, &player->actor.focus.pos); targetY = Math_Vec3f_Yaw(&thisx->focus.pos, &player->actor.focus.pos) - this->actor.shape.rot.y; diff --git a/src/overlays/actors/ovl_En_Gs/z_en_gs.c b/src/overlays/actors/ovl_En_Gs/z_en_gs.c index cae85e03c3..f021dd5e3a 100644 --- a/src/overlays/actors/ovl_En_Gs/z_en_gs.c +++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.c @@ -5,6 +5,7 @@ */ #include "z_en_gs.h" +#include "z64voice.h" #include "overlays/actors/ovl_En_Bom/z_en_bom.h" #include "overlays/actors/ovl_En_Elf/z_en_elf.h" #include "objects/object_gs/object_gs.h" @@ -159,7 +160,7 @@ void EnGs_Init(Actor* thisx, PlayState* play) { Math_Vec3f_Copy(&this->unk_1B0[0], &gOneVec3f); Math_Vec3f_Copy(&this->unk_1B0[1], &gOneVec3f); SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList)); - func_801A5080(0); + AudioVoice_InitWord(VOICE_WORD_ID_HOURS); if (this->actor.params == ENGS_1) { Actor_SetScale(&this->actor, 0.15f); this->collider.dim.radius *= 1.5f; @@ -946,7 +947,7 @@ void func_80999BC8(Actor* thisx, PlayState* play2) { EnGs* this = THIS; s32 pad; - if (this->actor.isLockedOn && !func_801A5100()) { + if (this->actor.isLockedOn && (AudioVoice_GetWord() == VOICE_WORD_ID_HOURS)) { this->unk_19D = 0; this->unk_19A |= 1; func_80999AC0(this); diff --git a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c index c7c516d121..37e6035df4 100644 --- a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c +++ b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c @@ -5,6 +5,7 @@ */ #include "z_en_hidden_nuts.h" +#include "z64voice.h" #include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_2000000) @@ -131,7 +132,7 @@ void EnHiddenNuts_Init(Actor* thisx, PlayState* play) { this->path = SubS_GetPathByIndex(play, this->pathIndex, ENHIDDENNUTS_PATH_INDEX_NONE_ALT); this->csId = this->actor.csId; - func_801A5080(2); + AudioVoice_InitWord(VOICE_WORD_ID_WAKE_UP); func_80BDB268(this); } @@ -213,7 +214,7 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) { if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) { play->msgCtx.ocarinaMode = OCARINA_MODE_END; func_80BDB788(this); - } else if (func_801A5100() == 2) { + } else if (AudioVoice_GetWord() == VOICE_WORD_ID_WAKE_UP) { func_80BDB788(this); } else { Actor_OfferTalk(&this->actor, play, BREG(13) + 100.0f); diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c index ea92d954c5..3c3bbe0f53 100644 --- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -7,6 +7,7 @@ #include "z_en_horse.h" #include "z64horse.h" #include "z64rumble.h" +#include "z64voice.h" #include "overlays/actors/ovl_En_In/z_en_in.h" #include "overlays/actors/ovl_Obj_Um/z_obj_um.h" #include "overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h" @@ -4016,9 +4017,9 @@ void func_80886C00(EnHorse* this, PlayState* play) { if (((this->action == ENHORSE_ACTION_MOUNTED_WALK) || (this->action == ENHORSE_ACTION_MOUNTED_TROT) || (this->action == ENHORSE_ACTION_MOUNTED_GALLOP)) && - (CHECK_BTN_ALL(input->press.button, BTN_A) || (func_801A5100() == 5)) && (play->interfaceCtx.unk_212 == 8) && - !(this->stateFlags & ENHORSE_BOOST) && !(this->stateFlags & ENHORSE_FLAG_8) && - !(this->stateFlags & ENHORSE_FLAG_9)) { + (CHECK_BTN_ALL(input->press.button, BTN_A) || (AudioVoice_GetWord() == VOICE_WORD_ID_HIYA)) && + (play->interfaceCtx.unk_212 == 8) && !(this->stateFlags & ENHORSE_BOOST) && + !(this->stateFlags & ENHORSE_FLAG_8) && !(this->stateFlags & ENHORSE_FLAG_9)) { if (this->numBoosts > 0) { Rumble_Request(0.0f, 180, 20, 100); this->stateFlags |= ENHORSE_BOOST; diff --git a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c index 258c57e320..b864df840f 100644 --- a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c +++ b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c @@ -4,7 +4,6 @@ * Description: Breakable Pot With Grass */ -#include "prevent_bss_reordering.h" #include "z_obj_flowerpot.h" #include "objects/object_flowerpot/object_flowerpot.h" diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index ca53f46bcc..0c64b8fdfd 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -4009,24 +4009,24 @@ 0x801A4DA4:("Audio_ResetForAudioHeapStep2",), 0x801A4DF4:("Audio_ResetForAudioHeapStep1",), 0x801A4E64:("Audio_UnusedReset",), - 0x801A4EB0:("func_801A4EB0",), + 0x801A4EB0:("AudioVoice_Noop",), 0x801A4EB8:("func_801A4EB8",), - 0x801A4FD8:("func_801A4FD8",), - 0x801A5080:("func_801A5080",), - 0x801A50C0:("func_801A50C0",), - 0x801A5100:("func_801A5100",), + 0x801A4FD8:("AudioVoice_ResetWord",), + 0x801A5080:("AudioVoice_InitWord",), + 0x801A50C0:("AudioVoice_InitWordAlt",), + 0x801A5100:("AudioVoice_GetWord",), 0x801A510C:("func_801A510C",), - 0x801A5118:("func_801A5118",), + 0x801A5118:("AudioVoice_Update",), 0x801A51F0:("func_801A51F0",), 0x801A5228:("func_801A5228",), 0x801A5390:("func_801A5390",), - 0x801A53DC:("func_801A53DC",), + 0x801A53DC:("AudioVoice_GetVoiceDict",), 0x801A53E8:("func_801A53E8",), 0x801A541C:("func_801A541C",), 0x801A5488:("func_801A5488",), - 0x801A54C4:("func_801A54C4",), - 0x801A54D0:("func_801A54D0",), - 0x801A5680:("func_801A5680",), + 0x801A54C4:("AudioVoice_GetVoiceMaskPattern",), + 0x801A54D0:("AudioVoice_InitWordImplAlt",), + 0x801A5680:("AudioVoice_InitWordImpl",), 0x801A5808:("func_801A5808",), 0x801A5A10:("AudioVoice_ResetData",), 0x801A5A1C:("func_801A5A1C",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index fd76b8ea8d..c24d84e72a 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -2302,10 +2302,10 @@ 0x801D8BB0:("sBigBellsVolume","UNK_TYPE1","",0x1), 0x801D8BD0:("sBgmPlayers","UNK_TYPE2","",0x2), 0x801D8BD4:("sSfxOriginalPos","UNK_TYPE4","",0x4), - 0x801D8BE0:("D_801D8BE0","UNK_TYPE1","",0x1), + 0x801D8BE0:("sVoiceDictionary","UNK_TYPE1","",0x1), 0x801D8E3C:("D_801D8E3C","UNK_TYPE1","",0x1), - 0x801D8E40:("D_801D8E40","UNK_TYPE4","",0x4), - 0x801D8E44:("D_801D8E44","UNK_TYPE2","",0x2), + 0x801D8E40:("sVoiceData","UNK_TYPE4","",0x4), + 0x801D8E44:("sTopScoreWordId","UNK_TYPE2","",0x2), 0x801D8E48:("D_801D8E48","UNK_TYPE1","",0x1), 0x801D8E50:("D_801D8E50","UNK_TYPE1","",0x1), 0x801D8F70:("D_801D8F70","UNK_TYPE1","",0x1), @@ -4231,13 +4231,13 @@ 0x801FD530:("D_801FD530","u32","[24]",0x60), 0x801FD590:("sScarecrowsLongSongSecondNote","UNK_TYPE1","",0x1), 0x801FD598:("sCustomSequencePc","UNK_TYPE1","",0x1), - 0x801FD5A0:("D_801FD5A0","UNK_TYPE1","",0x1), + 0x801FD5A0:("sVoiceContext","UNK_TYPE1","",0x1), 0x801FD5A4:("D_801FD5A4","UNK_TYPE1","",0x1), 0x801FD5B8:("gVoiceHandle","UNK_TYPE1","",0x1), 0x801FD5C4:("D_801FD5C4","UNK_TYPE1","",0x1), 0x801FD5C8:("D_801FD5C8","UNK_TYPE1","",0x1), 0x801FD5E8:("D_801FD5E8","UNK_TYPE1","",0x1), - 0x801FD608:("D_801FD608","UNK_TYPE1","",0x1), + 0x801FD608:("sVoiceMaskPattern","UNK_TYPE1","",0x1), 0x801FD610:("D_801FD610","UNK_TYPE1","",0x1), 0x801FD710:("sSfxPlayerBank","UNK_TYPE1","",0x1), 0x801FD8C0:("sSfxItemBank","UNK_TYPE1","",0x1), diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index ab776b321e..d601f3f95b 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -3526,24 +3526,24 @@ asm/non_matchings/code/code_8019AF00/Audio_ResetForAudioHeapStep3.s,Audio_ResetF asm/non_matchings/code/code_8019AF00/Audio_ResetForAudioHeapStep2.s,Audio_ResetForAudioHeapStep2,0x801A4DA4,0x14 asm/non_matchings/code/code_8019AF00/Audio_ResetForAudioHeapStep1.s,Audio_ResetForAudioHeapStep1,0x801A4DF4,0x1C asm/non_matchings/code/code_8019AF00/Audio_UnusedReset.s,Audio_UnusedReset,0x801A4E64,0x13 -asm/non_matchings/code/voice_external/func_801A4EB0.s,func_801A4EB0,0x801A4EB0,0x2 +asm/non_matchings/code/voice_external/AudioVoice_Noop.s,AudioVoice_Noop,0x801A4EB0,0x2 asm/non_matchings/code/voice_external/func_801A4EB8.s,func_801A4EB8,0x801A4EB8,0x48 -asm/non_matchings/code/voice_external/func_801A4FD8.s,func_801A4FD8,0x801A4FD8,0x2A -asm/non_matchings/code/voice_external/func_801A5080.s,func_801A5080,0x801A5080,0x10 -asm/non_matchings/code/voice_external/func_801A50C0.s,func_801A50C0,0x801A50C0,0x10 -asm/non_matchings/code/voice_external/func_801A5100.s,func_801A5100,0x801A5100,0x3 +asm/non_matchings/code/voice_external/AudioVoice_ResetWord.s,AudioVoice_ResetWord,0x801A4FD8,0x2A +asm/non_matchings/code/voice_external/AudioVoice_InitWord.s,AudioVoice_InitWord,0x801A5080,0x10 +asm/non_matchings/code/voice_external/AudioVoice_InitWordAlt.s,AudioVoice_InitWordAlt,0x801A50C0,0x10 +asm/non_matchings/code/voice_external/AudioVoice_GetWord.s,AudioVoice_GetWord,0x801A5100,0x3 asm/non_matchings/code/voice_external/func_801A510C.s,func_801A510C,0x801A510C,0x3 -asm/non_matchings/code/voice_external/func_801A5118.s,func_801A5118,0x801A5118,0x36 +asm/non_matchings/code/voice_external/AudioVoice_Update.s,AudioVoice_Update,0x801A5118,0x36 asm/non_matchings/code/voice_internal/func_801A51F0.s,func_801A51F0,0x801A51F0,0xE asm/non_matchings/code/voice_internal/func_801A5228.s,func_801A5228,0x801A5228,0x5A asm/non_matchings/code/voice_internal/func_801A5390.s,func_801A5390,0x801A5390,0x13 -asm/non_matchings/code/voice_internal/func_801A53DC.s,func_801A53DC,0x801A53DC,0x3 +asm/non_matchings/code/voice_internal/AudioVoice_GetVoiceDict.s,AudioVoice_GetVoiceDict,0x801A53DC,0x3 asm/non_matchings/code/voice_internal/func_801A53E8.s,func_801A53E8,0x801A53E8,0xD asm/non_matchings/code/voice_internal/func_801A541C.s,func_801A541C,0x801A541C,0x1B asm/non_matchings/code/voice_internal/func_801A5488.s,func_801A5488,0x801A5488,0xF -asm/non_matchings/code/voice_internal/func_801A54C4.s,func_801A54C4,0x801A54C4,0x3 -asm/non_matchings/code/voice_internal/func_801A54D0.s,func_801A54D0,0x801A54D0,0x6C -asm/non_matchings/code/voice_internal/func_801A5680.s,func_801A5680,0x801A5680,0x62 +asm/non_matchings/code/voice_internal/AudioVoice_GetVoiceMaskPattern.s,AudioVoice_GetVoiceMaskPattern,0x801A54C4,0x3 +asm/non_matchings/code/voice_internal/AudioVoice_InitWordImplAlt.s,AudioVoice_InitWordImplAlt,0x801A54D0,0x6C +asm/non_matchings/code/voice_internal/AudioVoice_InitWordImpl.s,AudioVoice_InitWordImpl,0x801A5680,0x62 asm/non_matchings/code/voice_internal/func_801A5808.s,func_801A5808,0x801A5808,0x82 asm/non_matchings/code/voice_internal/AudioVoice_ResetData.s,AudioVoice_ResetData,0x801A5A10,0x3 asm/non_matchings/code/voice_internal/func_801A5A1C.s,func_801A5A1C,0x801A5A1C,0x69 diff --git a/tools/weekeventregconvert.py b/tools/weekeventregconvert.py index 0d721654e3..6f8a2c1c22 100755 --- a/tools/weekeventregconvert.py +++ b/tools/weekeventregconvert.py @@ -700,7 +700,7 @@ weekEventReg = { (86 << 8) | 0x20: "WEEKEVENTREG_86_20", (86 << 8) | 0x40: "WEEKEVENTREG_86_40", (86 << 8) | 0x80: "WEEKEVENTREG_86_80", - (87 << 8) | 0x01: "WEEKEVENTREG_87_01", + (87 << 8) | 0x01: "WEEKEVENTREG_TALKING_TO_COW_WITH_VOICE", (87 << 8) | 0x02: "WEEKEVENTREG_COUPLES_MASK_CUTSCENE_STARTED", (87 << 8) | 0x04: "WEEKEVENTREG_87_04", (87 << 8) | 0x08: "WEEKEVENTREG_87_08",