mirror of https://github.com/zeldaret/mm.git
Audio Voice Decompiled (#1490)
* Add Tharo's documentation comments * Voice progress * Match osVoiceControlGain * Match osVoiceStartReadData * Cleanup * Add docs from n64devkit * WIP on osVoiceGetReadData * Add comment * Match voiceinit.c * Remove CONT_ERR, already present in controller.h * Really close to matching osVoiceStopReadData * Progress on voicecheckword * Match osVoiceSetWord * Add error codes * Matched __osVoiceContRead2... Somehow... * Add small amount of docs * __osVoiceContRead36 was basically identical from __osVoiceContRead2 * docs, but maybe a little carried away * Match __osVoiceContWrite4, Write is very similar to Read * Match __osVoiceContWrite20 from __osVoiceContWrite4, ez * Some docs * Improve osVoiceGetReadData * Match osVoiceCheckWord * currentSyllable -> currSyllable * Match osVoiceMaskDictionary * Match __osVoiceSetADConverter * Meme matched osVoiceStopReadData * small cleanup * Missed macros * osVoiceGetReadData Meme Match * Small clean-up * format * Properly split voice files from code * Use proper flags for voice files * Add basic docs for func_801A5AF0 * Import Voice Data * Update matching functions in code_801A51F0 from audio WIP * Update matching functions in code_801A4EB0 from audio WIP * Match func_801A5A1C * Match func_801A5228 * Match func_801A54D0 * Doc padmgr functions used * Match func_801A5680, it's near identical to func_801A54D0 * code_801A51F0 OK * Match func_801A4EB8 * Match func_801A4FD8 (mips2c got it matching directly) * code_801A4EB0 & all of voice, OK * Import bss * Better match for func_801A5A1C * format * Cleanup * Clean up dictionary * Introduce OSVoiceDictionary * More voice docs * Fix bss * Import code_801A4EB0 data * Introduce Word Id enum * Dictionary: u8 -> u16 * Introduce bgms * Fill in bgm enums * Rename bgm to clearer names * Fix spacing * Fix "No_Music" define * remove comment * import rodata * Improve bgm names, found another seqId function * Another seqId function * Another name change * Woods of Mystery -> Sarias Song * Fix match in osVoiceControlGain * Fix bss reordering * Fix bss file split * add saria's song bgm to pierre * Another bgm function found! * Add bgm's to `gSaveContext.seqIndex` * Fix BSS * fix bss * Fix bss * cleanup * more cleanup * cow voice weekeventflag * small cleanup * some docs * cleanup var * global * more docs * PR Review --------- Co-authored-by: Elliptic Ellipsis <elliptic.ellipsis@gmail.com> Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>
This commit is contained in:
parent
61e2f12cf5
commit
8ab62788b2
|
@ -29,6 +29,21 @@ typedef struct {
|
||||||
/* 0x14 */ u16 distance[5]; // Distance value
|
/* 0x14 */ u16 distance[5]; // Distance value
|
||||||
} OSVoiceData; // size = 0x20
|
} 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 osVoiceInit(OSMesgQueue* mq, OSVoiceHandle* hd, int channel);
|
||||||
s32 osVoiceSetWord(OSVoiceHandle* hd, u8* word);
|
s32 osVoiceSetWord(OSVoiceHandle* hd, u8* word);
|
||||||
|
|
|
@ -1326,25 +1326,6 @@ u8 func_801A3950(u8 seqPlayerIndex, u8 resetChannelIO);
|
||||||
u8 func_801A39F8(void);
|
u8 func_801A39F8(void);
|
||||||
s32 func_801A46F8(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_MuteBanks(u16 muteMask);
|
||||||
void AudioSfx_LowerBgmVolume(u8 channelIndex);
|
void AudioSfx_LowerBgmVolume(u8 channelIndex);
|
||||||
void AudioSfx_RestoreBgmVolume(u8 channelIndex);
|
void AudioSfx_RestoreBgmVolume(u8 channelIndex);
|
||||||
|
|
|
@ -225,144 +225,15 @@ extern s16 gInvalidAdpcmCodeBook[];
|
||||||
extern f32 gHeadsetPanVolume[];
|
extern f32 gHeadsetPanVolume[];
|
||||||
extern f32 gStereoPanVolume[];
|
extern f32 gStereoPanVolume[];
|
||||||
extern f32 gDefaultPanVolume[];
|
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 s32 gAudioCtxInitalized;
|
||||||
// extern UNK_TYPE4 D_801D5FEC;
|
|
||||||
// extern UNK_TYPE4 D_801D6190;
|
|
||||||
// extern UNK_TYPE4 D_801D6194;
|
|
||||||
extern u8 D_801D6200[0x400];
|
extern u8 D_801D6200[0x400];
|
||||||
extern u8 gIsLargeSfxBank[7];
|
extern u8 gIsLargeSfxBank[7];
|
||||||
extern u8 D_801D6608[7];
|
extern u8 D_801D6608[7];
|
||||||
extern u8 gChannelsPerBank[4][7];
|
extern u8 gChannelsPerBank[4][7];
|
||||||
extern u8 gUsedChannelsPerBank[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 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 u8* gScarecrowSpawnSongPtr;
|
||||||
extern UNK_PTR D_801D88A4;
|
|
||||||
// extern UNK_TYPE1 D_801D88A8;
|
|
||||||
// extern UNK_TYPE1 D_801D88B8;
|
|
||||||
extern OcarinaSongButtons gOcarinaSongButtons[24];
|
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 SfxParams* gSfxParams[7];
|
||||||
extern SfxBankEntry* gSfxBanks[7];
|
extern SfxBankEntry* gSfxBanks[7];
|
||||||
extern u8 gSfxChannelLayout;
|
extern u8 gSfxChannelLayout;
|
||||||
|
@ -1765,98 +1636,7 @@ extern MtxF* sMatrixStack;
|
||||||
extern MtxF* sCurrentMatrix;
|
extern MtxF* sCurrentMatrix;
|
||||||
|
|
||||||
extern s32 D_801FD120;
|
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 ActiveSfx gActiveSfx[7][3];
|
||||||
extern SeqRequest sSeqRequests[][5];
|
extern SeqRequest sSeqRequests[][5];
|
||||||
extern u8 sNumSeqRequests[5];
|
extern u8 sNumSeqRequests[5];
|
||||||
|
|
|
@ -935,6 +935,4 @@ typedef u32 (*AudioCustomSeqFunction)(s8 value, SequenceChannel* channel);
|
||||||
typedef void* (*AudioCustomReverbFunction)(Sample*, s32, s8, s32);
|
typedef void* (*AudioCustomReverbFunction)(Sample*, s32, s8, s32);
|
||||||
typedef Acmd* (*AudioCustomSynthFunction)(Acmd*, s32, s32);
|
typedef Acmd* (*AudioCustomSynthFunction)(Acmd*, s32, s32);
|
||||||
|
|
||||||
extern OSVoiceHandle gVoiceHandle;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1362,7 +1362,9 @@ typedef enum {
|
||||||
#define WEEKEVENTREG_86_20 PACK_WEEKEVENTREG_FLAG(86, 0x20)
|
#define WEEKEVENTREG_86_20 PACK_WEEKEVENTREG_FLAG(86, 0x20)
|
||||||
#define WEEKEVENTREG_86_40 PACK_WEEKEVENTREG_FLAG(86, 0x40)
|
#define WEEKEVENTREG_86_40 PACK_WEEKEVENTREG_FLAG(86, 0x40)
|
||||||
#define WEEKEVENTREG_86_80 PACK_WEEKEVENTREG_FLAG(86, 0x80)
|
#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
|
// Set by Anju
|
||||||
#define WEEKEVENTREG_COUPLES_MASK_CUTSCENE_STARTED PACK_WEEKEVENTREG_FLAG(87, 0x02)
|
#define WEEKEVENTREG_COUPLES_MASK_CUTSCENE_STARTED PACK_WEEKEVENTREG_FLAG(87, 0x02)
|
||||||
|
|
|
@ -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
|
3
spec
3
spec
|
@ -594,10 +594,7 @@ beginseg
|
||||||
include "build/asm/code/code_8019AEC0.text.o" // handwritten
|
include "build/asm/code/code_8019AEC0.text.o" // handwritten
|
||||||
include "build/src/audio/code_8019AF00.o"
|
include "build/src/audio/code_8019AF00.o"
|
||||||
include "build/src/audio/voice_external.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/src/audio/voice_internal.o"
|
||||||
include "build/data/code/voice_internal.data.o"
|
|
||||||
include "build/data/code/voice_internal.bss.o"
|
|
||||||
pad_text
|
pad_text
|
||||||
include "build/src/audio/sfx_params.o"
|
include "build/src/audio/sfx_params.o"
|
||||||
include "build/src/audio/sfx.o"
|
include "build/src/audio/sfx.o"
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
#include "z64voice.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/* 0x0 */ s8 x;
|
/* 0x0 */ s8 x;
|
||||||
|
@ -3626,7 +3627,7 @@ void Audio_Update(void) {
|
||||||
if ((AudioSeq_UpdateAudioHeapReset() == 0) && !AudioSeq_ResetReverb()) {
|
if ((AudioSeq_UpdateAudioHeapReset() == 0) && !AudioSeq_ResetReverb()) {
|
||||||
AudioOcarina_SetCustomSequence();
|
AudioOcarina_SetCustomSequence();
|
||||||
AudioOcarina_Update();
|
AudioOcarina_Update();
|
||||||
func_801A5118();
|
AudioVoice_Update();
|
||||||
Audio_StepFreqLerp(&sRiverFreqScaleLerp);
|
Audio_StepFreqLerp(&sRiverFreqScaleLerp);
|
||||||
Audio_StepFreqLerp(&sWaterfallFreqScaleLerp);
|
Audio_StepFreqLerp(&sWaterfallFreqScaleLerp);
|
||||||
Audio_UpdateRiverSoundVolumes();
|
Audio_UpdateRiverSoundVolumes();
|
||||||
|
@ -6471,7 +6472,7 @@ void Audio_ResetForAudioHeapStep1(s32 specId) {
|
||||||
AudioSfx_ResetSfxChannelState();
|
AudioSfx_ResetSfxChannelState();
|
||||||
AudioSeq_ResetActiveSequences();
|
AudioSeq_ResetActiveSequences();
|
||||||
AudioSfx_Reset();
|
AudioSfx_Reset();
|
||||||
func_801A4FD8();
|
AudioVoice_ResetWord();
|
||||||
if (gAudioSpecId == 0xB) {
|
if (gAudioSpecId == 0xB) {
|
||||||
AudioSfx_MuteBanks((1 << BANK_PLAYER) | (1 << BANK_ITEM) | (1 << BANK_ENV) | (1 << BANK_ENEMY) |
|
AudioSfx_MuteBanks((1 << BANK_PLAYER) | (1 << BANK_ITEM) | (1 << BANK_ENV) | (1 << BANK_ENEMY) |
|
||||||
(1 << BANK_OCARINA) | (1 << BANK_VOICE));
|
(1 << BANK_OCARINA) | (1 << BANK_VOICE));
|
||||||
|
@ -6484,5 +6485,5 @@ void Audio_UnusedReset(void) {
|
||||||
Audio_ResetData();
|
Audio_ResetData();
|
||||||
AudioSfx_ResetSfxChannelState();
|
AudioSfx_ResetSfxChannelState();
|
||||||
AudioSfx_Init(1);
|
AudioSfx_Init(1);
|
||||||
func_801A4FD8();
|
AudioVoice_ResetWord();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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) {
|
typedef struct {
|
||||||
switch (arg0) {
|
/* 0x00 */ OSVoiceDictionary* dict;
|
||||||
case 1:
|
/* 0x04 */ s8 mode;
|
||||||
case 4:
|
/* 0x08 */ OSVoiceData* data;
|
||||||
case 5:
|
/* 0x0C */ u16 distance;
|
||||||
case 11:
|
/* 0x0E */ u16 answerNum;
|
||||||
case 13:
|
/* 0x10 */ u16 warning;
|
||||||
case 14:
|
/* 0x12 */ u16 voiceLevel;
|
||||||
case 15:
|
/* 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;
|
return -1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "PR/controller.h"
|
#include "PR/controller.h"
|
||||||
#include "PR/os_motor.h"
|
#include "PR/os_motor.h"
|
||||||
#include "fault.h"
|
#include "fault.h"
|
||||||
|
#include "z64voice.h"
|
||||||
|
|
||||||
extern FaultMgr gFaultMgr;
|
extern FaultMgr gFaultMgr;
|
||||||
|
|
||||||
|
@ -527,7 +528,7 @@ void PadMgr_InitVoice(void) {
|
||||||
} else {
|
} else {
|
||||||
sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_VOICE;
|
sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_VOICE;
|
||||||
sVoiceInitStatus = VOICE_INIT_SUCCESS;
|
sVoiceInitStatus = VOICE_INIT_SUCCESS;
|
||||||
func_801A4EB0();
|
AudioVoice_Noop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "sys_cfb.h"
|
#include "sys_cfb.h"
|
||||||
#include "z64snap.h"
|
#include "z64snap.h"
|
||||||
#include "z64view.h"
|
#include "z64view.h"
|
||||||
|
#include "z64voice.h"
|
||||||
#include "archives/icon_item_static/icon_item_static_yar.h"
|
#include "archives/icon_item_static/icon_item_static_yar.h"
|
||||||
#include "interface/parameter_static/parameter_static.h"
|
#include "interface/parameter_static/parameter_static.h"
|
||||||
#include "interface/do_action_static/do_action_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;
|
interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
|
||||||
restoreHudVisibility = true;
|
restoreHudVisibility = true;
|
||||||
sPictoState = PICTO_BOX_STATE_OFF;
|
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) ||
|
if (!CHECK_EVENTINF(EVENTINF_41) ||
|
||||||
(CHECK_EVENTINF(EVENTINF_41) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE))) {
|
(CHECK_EVENTINF(EVENTINF_41) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE))) {
|
||||||
Audio_PlaySfx(NA_SE_SY_CAMERA_SHUTTER);
|
Audio_PlaySfx(NA_SE_SY_CAMERA_SHUTTER);
|
||||||
|
|
|
@ -33,7 +33,7 @@ s32 osVoiceGetReadData(OSVoiceHandle* hd, OSVoiceData* result) {
|
||||||
|
|
||||||
sHandleStatus = data[0] & 7;
|
sHandleStatus = data[0] & 7;
|
||||||
hd->status = sHandleStatus;
|
hd->status = sHandleStatus;
|
||||||
if ((sHandleStatus != 0) && (sHandleStatus != 7)) {
|
if ((sHandleStatus != VOICE_STATUS_READY) && (sHandleStatus != VOICE_STATUS_END)) {
|
||||||
return CONT_ERR_NOT_READY;
|
return CONT_ERR_NOT_READY;
|
||||||
}
|
}
|
||||||
// fallthrough
|
// fallthrough
|
||||||
|
@ -88,7 +88,7 @@ s32 osVoiceGetReadData(OSVoiceHandle* hd, OSVoiceData* result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
hd->status = data[34] & 7;
|
hd->status = data[34] & 7;
|
||||||
if ((sHandleStatus == 0) || (hd->status == 0)) {
|
if ((sHandleStatus == VOICE_STATUS_READY) || (hd->status == VOICE_STATUS_READY)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// fallthrough
|
// fallthrough
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include "z_en_cow.h"
|
#include "z_en_cow.h"
|
||||||
#include "z64horse.h"
|
#include "z64horse.h"
|
||||||
|
#include "z64voice.h"
|
||||||
|
|
||||||
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
|
#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;
|
this->actor.targetMode = TARGET_MODE_6;
|
||||||
|
|
||||||
gHorsePlayedEponasSong = false;
|
gHorsePlayedEponasSong = false;
|
||||||
func_801A5080(4);
|
AudioVoice_InitWord(VOICE_WORD_ID_MILK);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_COW_TYPE_TAIL:
|
case EN_COW_TYPE_TAIL:
|
||||||
|
@ -158,7 +159,7 @@ void EnCow_Init(Actor* thisx, PlayState* play) {
|
||||||
Actor_SetScale(&this->actor, 0.01f);
|
Actor_SetScale(&this->actor, 0.01f);
|
||||||
this->flags = 0;
|
this->flags = 0;
|
||||||
|
|
||||||
CLEAR_WEEKEVENTREG(WEEKEVENTREG_87_01);
|
CLEAR_WEEKEVENTREG(WEEKEVENTREG_TALKING_TO_COW_WITH_VOICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnCow_Destroy(Actor* thisx, PlayState* play) {
|
void EnCow_Destroy(Actor* thisx, PlayState* play) {
|
||||||
|
@ -291,11 +292,11 @@ void EnCow_Idle(EnCow* this, PlayState* play) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->actor.xzDistToPlayer < 150.0f &&
|
if ((this->actor.xzDistToPlayer < 150.0f) &&
|
||||||
ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) < 25000) {
|
(ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) < 0x61A8)) {
|
||||||
if (func_801A5100() == 4) {
|
if (AudioVoice_GetWord() == VOICE_WORD_ID_MILK) {
|
||||||
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_87_01)) {
|
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKING_TO_COW_WITH_VOICE)) {
|
||||||
SET_WEEKEVENTREG(WEEKEVENTREG_87_01);
|
SET_WEEKEVENTREG(WEEKEVENTREG_TALKING_TO_COW_WITH_VOICE);
|
||||||
if (Inventory_HasEmptyBottle()) {
|
if (Inventory_HasEmptyBottle()) {
|
||||||
this->actor.textId = 0x32C9; // Text to give milk.
|
this->actor.textId = 0x32C9; // Text to give milk.
|
||||||
} else {
|
} else {
|
||||||
|
@ -306,7 +307,7 @@ void EnCow_Idle(EnCow* this, PlayState* play) {
|
||||||
this->actionFunc = EnCow_Talk;
|
this->actionFunc = EnCow_Talk;
|
||||||
}
|
}
|
||||||
} else {
|
} 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);
|
Animation_GetLastFrame(&gCowTailIdleAnim), ANIMMODE_ONCE, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->actor.xzDistToPlayer < 150.0f &&
|
if ((this->actor.xzDistToPlayer < 150.0f) &&
|
||||||
ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) > 25000) {
|
(ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) > 0x61A8)) {
|
||||||
if (!(this->flags & EN_COW_FLAG_PLAYER_HAS_APPROACHED)) {
|
if (!(this->flags & EN_COW_FLAG_PLAYER_HAS_APPROACHED)) {
|
||||||
this->flags |= EN_COW_FLAG_PLAYER_HAS_APPROACHED;
|
this->flags |= EN_COW_FLAG_PLAYER_HAS_APPROACHED;
|
||||||
if (this->skelAnime.animation == &gCowTailIdleAnim) {
|
if (this->skelAnime.animation == &gCowTailIdleAnim) {
|
||||||
|
@ -360,8 +361,8 @@ void EnCow_Update(Actor* thisx, PlayState* play2) {
|
||||||
|
|
||||||
this->actionFunc(this, play);
|
this->actionFunc(this, play);
|
||||||
|
|
||||||
if (this->actor.xzDistToPlayer < 150.0f &&
|
if ((this->actor.xzDistToPlayer < 150.0f) &&
|
||||||
ABS_ALT(Math_Vec3f_Yaw(&thisx->world.pos, &player->actor.world.pos)) < 0xC000) {
|
(ABS_ALT(Math_Vec3f_Yaw(&thisx->world.pos, &player->actor.world.pos)) < 0xC000)) {
|
||||||
targetX = Math_Vec3f_Pitch(&thisx->focus.pos, &player->actor.focus.pos);
|
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;
|
targetY = Math_Vec3f_Yaw(&thisx->focus.pos, &player->actor.focus.pos) - this->actor.shape.rot.y;
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "z_en_gs.h"
|
#include "z_en_gs.h"
|
||||||
|
#include "z64voice.h"
|
||||||
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
|
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
|
||||||
#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
|
#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
|
||||||
#include "objects/object_gs/object_gs.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[0], &gOneVec3f);
|
||||||
Math_Vec3f_Copy(&this->unk_1B0[1], &gOneVec3f);
|
Math_Vec3f_Copy(&this->unk_1B0[1], &gOneVec3f);
|
||||||
SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList));
|
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) {
|
if (this->actor.params == ENGS_1) {
|
||||||
Actor_SetScale(&this->actor, 0.15f);
|
Actor_SetScale(&this->actor, 0.15f);
|
||||||
this->collider.dim.radius *= 1.5f;
|
this->collider.dim.radius *= 1.5f;
|
||||||
|
@ -946,7 +947,7 @@ void func_80999BC8(Actor* thisx, PlayState* play2) {
|
||||||
EnGs* this = THIS;
|
EnGs* this = THIS;
|
||||||
s32 pad;
|
s32 pad;
|
||||||
|
|
||||||
if (this->actor.isLockedOn && !func_801A5100()) {
|
if (this->actor.isLockedOn && (AudioVoice_GetWord() == VOICE_WORD_ID_HOURS)) {
|
||||||
this->unk_19D = 0;
|
this->unk_19D = 0;
|
||||||
this->unk_19A |= 1;
|
this->unk_19A |= 1;
|
||||||
func_80999AC0(this);
|
func_80999AC0(this);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "z_en_hidden_nuts.h"
|
#include "z_en_hidden_nuts.h"
|
||||||
|
#include "z64voice.h"
|
||||||
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
|
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
|
||||||
|
|
||||||
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_2000000)
|
#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->path = SubS_GetPathByIndex(play, this->pathIndex, ENHIDDENNUTS_PATH_INDEX_NONE_ALT);
|
||||||
this->csId = this->actor.csId;
|
this->csId = this->actor.csId;
|
||||||
func_801A5080(2);
|
AudioVoice_InitWord(VOICE_WORD_ID_WAKE_UP);
|
||||||
func_80BDB268(this);
|
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)) {
|
if ((play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) {
|
||||||
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
|
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
|
||||||
func_80BDB788(this);
|
func_80BDB788(this);
|
||||||
} else if (func_801A5100() == 2) {
|
} else if (AudioVoice_GetWord() == VOICE_WORD_ID_WAKE_UP) {
|
||||||
func_80BDB788(this);
|
func_80BDB788(this);
|
||||||
} else {
|
} else {
|
||||||
Actor_OfferTalk(&this->actor, play, BREG(13) + 100.0f);
|
Actor_OfferTalk(&this->actor, play, BREG(13) + 100.0f);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "z_en_horse.h"
|
#include "z_en_horse.h"
|
||||||
#include "z64horse.h"
|
#include "z64horse.h"
|
||||||
#include "z64rumble.h"
|
#include "z64rumble.h"
|
||||||
|
#include "z64voice.h"
|
||||||
#include "overlays/actors/ovl_En_In/z_en_in.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_Obj_Um/z_obj_um.h"
|
||||||
#include "overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.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) ||
|
if (((this->action == ENHORSE_ACTION_MOUNTED_WALK) || (this->action == ENHORSE_ACTION_MOUNTED_TROT) ||
|
||||||
(this->action == ENHORSE_ACTION_MOUNTED_GALLOP)) &&
|
(this->action == ENHORSE_ACTION_MOUNTED_GALLOP)) &&
|
||||||
(CHECK_BTN_ALL(input->press.button, BTN_A) || (func_801A5100() == 5)) && (play->interfaceCtx.unk_212 == 8) &&
|
(CHECK_BTN_ALL(input->press.button, BTN_A) || (AudioVoice_GetWord() == VOICE_WORD_ID_HIYA)) &&
|
||||||
!(this->stateFlags & ENHORSE_BOOST) && !(this->stateFlags & ENHORSE_FLAG_8) &&
|
(play->interfaceCtx.unk_212 == 8) && !(this->stateFlags & ENHORSE_BOOST) &&
|
||||||
!(this->stateFlags & ENHORSE_FLAG_9)) {
|
!(this->stateFlags & ENHORSE_FLAG_8) && !(this->stateFlags & ENHORSE_FLAG_9)) {
|
||||||
if (this->numBoosts > 0) {
|
if (this->numBoosts > 0) {
|
||||||
Rumble_Request(0.0f, 180, 20, 100);
|
Rumble_Request(0.0f, 180, 20, 100);
|
||||||
this->stateFlags |= ENHORSE_BOOST;
|
this->stateFlags |= ENHORSE_BOOST;
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
* Description: Breakable Pot With Grass
|
* Description: Breakable Pot With Grass
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "prevent_bss_reordering.h"
|
|
||||||
#include "z_obj_flowerpot.h"
|
#include "z_obj_flowerpot.h"
|
||||||
#include "objects/object_flowerpot/object_flowerpot.h"
|
#include "objects/object_flowerpot/object_flowerpot.h"
|
||||||
|
|
||||||
|
|
|
@ -4009,24 +4009,24 @@
|
||||||
0x801A4DA4:("Audio_ResetForAudioHeapStep2",),
|
0x801A4DA4:("Audio_ResetForAudioHeapStep2",),
|
||||||
0x801A4DF4:("Audio_ResetForAudioHeapStep1",),
|
0x801A4DF4:("Audio_ResetForAudioHeapStep1",),
|
||||||
0x801A4E64:("Audio_UnusedReset",),
|
0x801A4E64:("Audio_UnusedReset",),
|
||||||
0x801A4EB0:("func_801A4EB0",),
|
0x801A4EB0:("AudioVoice_Noop",),
|
||||||
0x801A4EB8:("func_801A4EB8",),
|
0x801A4EB8:("func_801A4EB8",),
|
||||||
0x801A4FD8:("func_801A4FD8",),
|
0x801A4FD8:("AudioVoice_ResetWord",),
|
||||||
0x801A5080:("func_801A5080",),
|
0x801A5080:("AudioVoice_InitWord",),
|
||||||
0x801A50C0:("func_801A50C0",),
|
0x801A50C0:("AudioVoice_InitWordAlt",),
|
||||||
0x801A5100:("func_801A5100",),
|
0x801A5100:("AudioVoice_GetWord",),
|
||||||
0x801A510C:("func_801A510C",),
|
0x801A510C:("func_801A510C",),
|
||||||
0x801A5118:("func_801A5118",),
|
0x801A5118:("AudioVoice_Update",),
|
||||||
0x801A51F0:("func_801A51F0",),
|
0x801A51F0:("func_801A51F0",),
|
||||||
0x801A5228:("func_801A5228",),
|
0x801A5228:("func_801A5228",),
|
||||||
0x801A5390:("func_801A5390",),
|
0x801A5390:("func_801A5390",),
|
||||||
0x801A53DC:("func_801A53DC",),
|
0x801A53DC:("AudioVoice_GetVoiceDict",),
|
||||||
0x801A53E8:("func_801A53E8",),
|
0x801A53E8:("func_801A53E8",),
|
||||||
0x801A541C:("func_801A541C",),
|
0x801A541C:("func_801A541C",),
|
||||||
0x801A5488:("func_801A5488",),
|
0x801A5488:("func_801A5488",),
|
||||||
0x801A54C4:("func_801A54C4",),
|
0x801A54C4:("AudioVoice_GetVoiceMaskPattern",),
|
||||||
0x801A54D0:("func_801A54D0",),
|
0x801A54D0:("AudioVoice_InitWordImplAlt",),
|
||||||
0x801A5680:("func_801A5680",),
|
0x801A5680:("AudioVoice_InitWordImpl",),
|
||||||
0x801A5808:("func_801A5808",),
|
0x801A5808:("func_801A5808",),
|
||||||
0x801A5A10:("AudioVoice_ResetData",),
|
0x801A5A10:("AudioVoice_ResetData",),
|
||||||
0x801A5A1C:("func_801A5A1C",),
|
0x801A5A1C:("func_801A5A1C",),
|
||||||
|
|
|
@ -2302,10 +2302,10 @@
|
||||||
0x801D8BB0:("sBigBellsVolume","UNK_TYPE1","",0x1),
|
0x801D8BB0:("sBigBellsVolume","UNK_TYPE1","",0x1),
|
||||||
0x801D8BD0:("sBgmPlayers","UNK_TYPE2","",0x2),
|
0x801D8BD0:("sBgmPlayers","UNK_TYPE2","",0x2),
|
||||||
0x801D8BD4:("sSfxOriginalPos","UNK_TYPE4","",0x4),
|
0x801D8BD4:("sSfxOriginalPos","UNK_TYPE4","",0x4),
|
||||||
0x801D8BE0:("D_801D8BE0","UNK_TYPE1","",0x1),
|
0x801D8BE0:("sVoiceDictionary","UNK_TYPE1","",0x1),
|
||||||
0x801D8E3C:("D_801D8E3C","UNK_TYPE1","",0x1),
|
0x801D8E3C:("D_801D8E3C","UNK_TYPE1","",0x1),
|
||||||
0x801D8E40:("D_801D8E40","UNK_TYPE4","",0x4),
|
0x801D8E40:("sVoiceData","UNK_TYPE4","",0x4),
|
||||||
0x801D8E44:("D_801D8E44","UNK_TYPE2","",0x2),
|
0x801D8E44:("sTopScoreWordId","UNK_TYPE2","",0x2),
|
||||||
0x801D8E48:("D_801D8E48","UNK_TYPE1","",0x1),
|
0x801D8E48:("D_801D8E48","UNK_TYPE1","",0x1),
|
||||||
0x801D8E50:("D_801D8E50","UNK_TYPE1","",0x1),
|
0x801D8E50:("D_801D8E50","UNK_TYPE1","",0x1),
|
||||||
0x801D8F70:("D_801D8F70","UNK_TYPE1","",0x1),
|
0x801D8F70:("D_801D8F70","UNK_TYPE1","",0x1),
|
||||||
|
@ -4231,13 +4231,13 @@
|
||||||
0x801FD530:("D_801FD530","u32","[24]",0x60),
|
0x801FD530:("D_801FD530","u32","[24]",0x60),
|
||||||
0x801FD590:("sScarecrowsLongSongSecondNote","UNK_TYPE1","",0x1),
|
0x801FD590:("sScarecrowsLongSongSecondNote","UNK_TYPE1","",0x1),
|
||||||
0x801FD598:("sCustomSequencePc","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),
|
0x801FD5A4:("D_801FD5A4","UNK_TYPE1","",0x1),
|
||||||
0x801FD5B8:("gVoiceHandle","UNK_TYPE1","",0x1),
|
0x801FD5B8:("gVoiceHandle","UNK_TYPE1","",0x1),
|
||||||
0x801FD5C4:("D_801FD5C4","UNK_TYPE1","",0x1),
|
0x801FD5C4:("D_801FD5C4","UNK_TYPE1","",0x1),
|
||||||
0x801FD5C8:("D_801FD5C8","UNK_TYPE1","",0x1),
|
0x801FD5C8:("D_801FD5C8","UNK_TYPE1","",0x1),
|
||||||
0x801FD5E8:("D_801FD5E8","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),
|
0x801FD610:("D_801FD610","UNK_TYPE1","",0x1),
|
||||||
0x801FD710:("sSfxPlayerBank","UNK_TYPE1","",0x1),
|
0x801FD710:("sSfxPlayerBank","UNK_TYPE1","",0x1),
|
||||||
0x801FD8C0:("sSfxItemBank","UNK_TYPE1","",0x1),
|
0x801FD8C0:("sSfxItemBank","UNK_TYPE1","",0x1),
|
||||||
|
|
|
@ -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_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_ResetForAudioHeapStep1.s,Audio_ResetForAudioHeapStep1,0x801A4DF4,0x1C
|
||||||
asm/non_matchings/code/code_8019AF00/Audio_UnusedReset.s,Audio_UnusedReset,0x801A4E64,0x13
|
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_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/AudioVoice_ResetWord.s,AudioVoice_ResetWord,0x801A4FD8,0x2A
|
||||||
asm/non_matchings/code/voice_external/func_801A5080.s,func_801A5080,0x801A5080,0x10
|
asm/non_matchings/code/voice_external/AudioVoice_InitWord.s,AudioVoice_InitWord,0x801A5080,0x10
|
||||||
asm/non_matchings/code/voice_external/func_801A50C0.s,func_801A50C0,0x801A50C0,0x10
|
asm/non_matchings/code/voice_external/AudioVoice_InitWordAlt.s,AudioVoice_InitWordAlt,0x801A50C0,0x10
|
||||||
asm/non_matchings/code/voice_external/func_801A5100.s,func_801A5100,0x801A5100,0x3
|
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_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_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_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_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_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_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_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/AudioVoice_GetVoiceMaskPattern.s,AudioVoice_GetVoiceMaskPattern,0x801A54C4,0x3
|
||||||
asm/non_matchings/code/voice_internal/func_801A54D0.s,func_801A54D0,0x801A54D0,0x6C
|
asm/non_matchings/code/voice_internal/AudioVoice_InitWordImplAlt.s,AudioVoice_InitWordImplAlt,0x801A54D0,0x6C
|
||||||
asm/non_matchings/code/voice_internal/func_801A5680.s,func_801A5680,0x801A5680,0x62
|
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/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/AudioVoice_ResetData.s,AudioVoice_ResetData,0x801A5A10,0x3
|
||||||
asm/non_matchings/code/voice_internal/func_801A5A1C.s,func_801A5A1C,0x801A5A1C,0x69
|
asm/non_matchings/code/voice_internal/func_801A5A1C.s,func_801A5A1C,0x801A5A1C,0x69
|
||||||
|
|
|
|
@ -700,7 +700,7 @@ weekEventReg = {
|
||||||
(86 << 8) | 0x20: "WEEKEVENTREG_86_20",
|
(86 << 8) | 0x20: "WEEKEVENTREG_86_20",
|
||||||
(86 << 8) | 0x40: "WEEKEVENTREG_86_40",
|
(86 << 8) | 0x40: "WEEKEVENTREG_86_40",
|
||||||
(86 << 8) | 0x80: "WEEKEVENTREG_86_80",
|
(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) | 0x02: "WEEKEVENTREG_COUPLES_MASK_CUTSCENE_STARTED",
|
||||||
(87 << 8) | 0x04: "WEEKEVENTREG_87_04",
|
(87 << 8) | 0x04: "WEEKEVENTREG_87_04",
|
||||||
(87 << 8) | 0x08: "WEEKEVENTREG_87_08",
|
(87 << 8) | 0x08: "WEEKEVENTREG_87_08",
|
||||||
|
|
Loading…
Reference in New Issue