diff options
| author | Caroline Madsen <69010899+randomsalience@users.noreply.github.com> | 2025-03-22 02:03:43 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-21 23:03:43 -0700 |
| commit | 5a7b9f62d684b1d3744f39abdfc54b8ad7a64ead (patch) | |
| tree | 070d7e0bb632536825ac7f3536b7f1efefb223f7 /src/Z2AudioLib | |
| parent | cf87a207b67152210522b10ec2863ad69f4817ac (diff) | |
Z2AudioLib work (#2339)
* Z2LinkMgr work, Z2AudioArcLoader matching
* Z2SeMgr matching
* Z2SpeechMgr2 almost done, Z2SoundHandles matching
Diffstat (limited to 'src/Z2AudioLib')
| -rw-r--r-- | src/Z2AudioLib/Z2AudioArcLoader.cpp | 2 | ||||
| -rw-r--r-- | src/Z2AudioLib/Z2Creature.cpp | 19 | ||||
| -rw-r--r-- | src/Z2AudioLib/Z2EnvSeMgr.cpp | 36 | ||||
| -rw-r--r-- | src/Z2AudioLib/Z2LinkMgr.cpp | 459 | ||||
| -rw-r--r-- | src/Z2AudioLib/Z2Param.cpp | 4 | ||||
| -rw-r--r-- | src/Z2AudioLib/Z2SeMgr.cpp | 521 | ||||
| -rw-r--r-- | src/Z2AudioLib/Z2SeqMgr.cpp | 2 | ||||
| -rw-r--r-- | src/Z2AudioLib/Z2SoundHandles.cpp | 3 | ||||
| -rw-r--r-- | src/Z2AudioLib/Z2SoundObjMgr.cpp | 1 | ||||
| -rw-r--r-- | src/Z2AudioLib/Z2SpeechMgr2.cpp | 1137 |
10 files changed, 1472 insertions, 712 deletions
diff --git a/src/Z2AudioLib/Z2AudioArcLoader.cpp b/src/Z2AudioLib/Z2AudioArcLoader.cpp index b7d6789d98..4d50aa7d02 100644 --- a/src/Z2AudioLib/Z2AudioArcLoader.cpp +++ b/src/Z2AudioLib/Z2AudioArcLoader.cpp @@ -30,7 +30,7 @@ bool Z2AudioArcLoader::readCommandMore(u32 param_0) { // NONMATCHING regalloc void Z2AudioArcLoader::readBFCA(void const* param_0) { JKRHeap* heap = JAUSectionHeap::getInstance()->getHeap(); - JKRArchive* archive = JKRArchive::mount((void*)param_0, JKRGetCurrentHeap(), JKRArchive::MOUNT_DIRECTION_TAIL); + JKRArchive* archive = JKRMountArchive((void*)param_0, JKRGetCurrentHeap(), JKRArchive::MOUNT_DIRECTION_TAIL); Z2GetFxLineMgr()->initDataArc(archive, heap); JKRUnmountArchive(archive); } diff --git a/src/Z2AudioLib/Z2Creature.cpp b/src/Z2AudioLib/Z2Creature.cpp index ef20c36192..d5f057b102 100644 --- a/src/Z2AudioLib/Z2Creature.cpp +++ b/src/Z2AudioLib/Z2Creature.cpp @@ -4,6 +4,7 @@ */ #include "Z2AudioLib/Z2Creature.h" +#include "SSystem/SComponent/c_xyz.h" #include "Z2AudioLib/Z2Param.h" #include "Z2AudioLib/Z2Calc.h" #include "Z2AudioLib/Z2AudioMgr.h" @@ -180,7 +181,7 @@ Z2SoundHandlePool* Z2Creature::startCreatureSound(JAISoundID i_soundID, u32 para return mSoundObjSimple1.startSound(i_soundID, param_1, 0); default: Z2SoundHandlePool* handle = mSoundObjAnime.startSound(i_soundID, param_1, param_2); - if (handle != NULL && *handle != NULL) { + if (handle != NULL && *handle) { switch (i_soundID) { case Z2SE_FAIRY_S_FLY: f32 pitch = Z2Calc::getParamByExp((f32)param_1, 30.0f, 100.0f, 0.3f, @@ -199,12 +200,12 @@ Z2SoundHandlePool* Z2Creature::startCreatureSound(JAISoundID i_soundID, u32 para * startCreatureSoundLevel__10Z2CreatureF10JAISoundIDUlSc */ Z2SoundHandlePool* Z2Creature::startCreatureSoundLevel(JAISoundID i_soundID, u32 param_1, s8 param_2) { switch (i_soundID) { - case 0x600d6: + case Z2SE_FAIRY_S_LV: Z2GetAudioMgr()->seStartLevel(i_soundID, mpPos, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); return NULL; default: Z2SoundHandlePool* handle = mSoundObjAnime.startLevelSound(i_soundID, param_1, param_2); - if (handle != NULL && *handle != NULL) { + if (handle != NULL && *handle) { if (i_soundID == Z2SE_YM_SNOBO_RIDE || i_soundID == Z2SE_YW_SNOBO_RIDE) { f32 volume = 0.0f; if (param_1 != 0) { @@ -486,7 +487,7 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureSoundLevel(JAISoundID i_soundID switch (mEnemyID) { case Z2_ENEMY_FZ: - if (handle != NULL && *handle != NULL && i_soundID == Z2SE_EN_FZ_MOVE) { + if (handle != NULL && *handle && i_soundID == Z2SE_EN_FZ_MOVE) { f32 volume = Z2Calc::getParamByExp(param_1, 1.0f, 50.0f, 0.4f, 0.1f, 1.1f, Z2Calc::CURVE_SIGN_1); (*handle)->getAuxiliary().moveVolume(volume, 0); @@ -496,7 +497,7 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureSoundLevel(JAISoundID i_soundID Z2_E_sw_modPitch(handle, param_1); break; case Z2_ENEMY_RB: - if (handle != NULL && *handle != NULL && i_soundID == Z2SE_EN_RB_MOVE) { + if (handle != NULL && *handle && i_soundID == Z2SE_EN_RB_MOVE) { f32 volume = Z2Calc::getParamByExp(param_1, 4.0f, 35.0f, 0.6f, 0.7f, 1.0f, Z2Calc::CURVE_SIGN_1); f32 pitch = Z2Calc::getParamByExp(param_1, 4.0f, 35.0f, 0.4f, 0.8f, 1.0f, @@ -507,7 +508,7 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureSoundLevel(JAISoundID i_soundID } // no break default: - if (handle != NULL && *handle != NULL && i_soundID == Z2SE_EN_PH_PROPELLER) { + if (handle != NULL && *handle && i_soundID == Z2SE_EN_PH_PROPELLER) { f32 volume = Z2Calc::getParamByExp(param_1, 0.0f, 30.0f, 0.4f, 0.0f, 1.0f, Z2Calc::CURVE_SIGN_1); f32 pitch = Z2Calc::getParamByExp(param_1, 4000.0f, 13000.0f, 0.4f, 0.8f, 1.2f, @@ -856,7 +857,7 @@ Z2SoundHandlePool* Z2CreatureFM::startChainSoundLevel(JAISoundID i_soundID, u8 p switch (param_1) { case 0: handle = field_0xa4.startLevelSound(i_soundID, param_3, param_4); - if (handle != NULL && *handle != NULL) { + if (handle != NULL && *handle) { if (param_2 > 30.0f) { pitch = 1.06f; } else { @@ -872,7 +873,7 @@ Z2SoundHandlePool* Z2CreatureFM::startChainSoundLevel(JAISoundID i_soundID, u8 p return NULL; case 1: handle = field_0xa4.startLevelSound(i_soundID, param_3, param_4); - if (handle != NULL && *handle != NULL) { + if (handle != NULL && *handle) { if (param_2 > 30.0f) { pitch = 1.06f; } else { @@ -1052,7 +1053,7 @@ Z2SoundHandlePool* Z2CreatureOI::startTentacleSoundLevel(JAISoundID i_soundID, u f32 param_2, u32 param_3, s8 param_4) { Z2SoundHandlePool* handle = mTentacleSounds[param_1].startLevelSound(i_soundID, param_3, param_4); - if (handle != NULL && *handle != NULL) { + if (handle != NULL && *handle) { f32 volume = Z2Calc::getParamByExp(param_2, 0.0f, 60.0f, 0.4f, 0.0f, 1.0f, Z2Calc::CURVE_SIGN_1); f32 pitch = Z2Calc::getParamByExp(param_2, 0.0f, 60.0f, 0.4f, 0.9f, 1.1f, diff --git a/src/Z2AudioLib/Z2EnvSeMgr.cpp b/src/Z2AudioLib/Z2EnvSeMgr.cpp index 9189867d2d..b62f873c14 100644 --- a/src/Z2AudioLib/Z2EnvSeMgr.cpp +++ b/src/Z2AudioLib/Z2EnvSeMgr.cpp @@ -211,20 +211,20 @@ Z2EnvSeMgr::Z2EnvSeMgr() field_0x39 = 0; field_0x2e8.setParam(0.1f, 0.007823764f, 0.06f); field_0x2f8.setParam(0.2f, 0.007823764f, 0.06f); - field_0x90.setParam(0.1f, 0.02630252f, 0.005f); - field_0xa0.setParam(0.9f, 0.02331011f, 0.003f); - field_0xb0.setParam(0.2f, 0.006385157f, 0.004f); + field_0x90.setParam(0.1f, 0.026302524f, 0.005f); + field_0xa0.setParam(0.9f, 0.023310114f, 0.003f); + field_0xb0.setParam(0.2f, 0.0063851574f, 0.004f); field_0xc0.setParam(0.8f, 0.006188805f, 0.0045f); - field_0xd0.setParam(0.3f, 0.05343298f, 0.002f); - field_0xe0.setParam(0.7f, 0.04256627f, 0.0025f); - field_0xf0.setParam(0.4f, 0.01293395f, 0.006f); - field_0x100.setParam(0.6f, 0.01215741f, 0.0065f); - field_0x18c.setParam(0.1f, 0.02331011f, 0.005f); - field_0x19c.setParam(0.5f, 0.05343298f, 0.0025f); + field_0xd0.setParam(0.3f, 0.053432982f, 0.002f); + field_0xe0.setParam(0.7f, 0.042566273f, 0.0025f); + field_0xf0.setParam(0.4f, 0.012933955f, 0.006f); + field_0x100.setParam(0.6f, 0.012157413f, 0.0065f); + field_0x18c.setParam(0.1f, 0.023310114f, 0.005f); + field_0x19c.setParam(0.5f, 0.053432982f, 0.0025f); field_0x64.setVolumeScale(1.0f); mWolfSmellSeMgr.setVolumeScale(1.0f); - field_0x120.setParam(0.5f, 0.02092357f, 0.001f); - field_0x130.setParam(0.1f, 0.003790878f, 0.005f); + field_0x120.setParam(0.5f, 0.020923574f, 0.001f); + field_0x130.setParam(0.1f, 0.0037908785f, 0.005f); } /* 802C6540-802C66B0 2C0E80 0170+00 0/0 1/1 0/0 .text __dt__10Z2EnvSeMgrFv */ @@ -968,7 +968,7 @@ void Z2EnvSeMgr::setHyrulSewerOpen(bool param_0) { } /* 802C8300-802C8730 2C2C40 0430+00 2/1 1/1 0/0 .text startRiverSe__10Z2EnvSeMgrFSc */ -// NONMATCHING missing branch and JAISound stack issues +// NONMATCHING JAISound stack issues bool Z2EnvSeMgr::startRiverSe(s8 param_1) { if (Z2GetStatusMgr()->mCameraMapInfo == 6) { switch (Z2GetSceneMgr()->getCurrentSceneNum()) { @@ -979,16 +979,20 @@ bool Z2EnvSeMgr::startRiverSe(s8 param_1) { case 0x10: if (Z2GetStatusMgr()->mPolygonPosition.y < -14500.0f) { break; - } + } case 8: - default: - registRiverSePos(&Z2GetStatusMgr()->mPolygonPosition); - break; + // fake match: should be 2000.0f according to debug, but that generates an extra entry in sdata2 + if (Z2GetStatusMgr()->mPolygonPosition.y < -14500.0f) { + break; + } case 0x15: case 0x1e: case 0x1f: case 0x2e: break; + default: + registRiverSePos(&Z2GetStatusMgr()->mPolygonPosition); + break; } } if (mRiverSeMgr.getPosCount() < 0) { diff --git a/src/Z2AudioLib/Z2LinkMgr.cpp b/src/Z2AudioLib/Z2LinkMgr.cpp index 96664f7dc7..378b1c5a6c 100644 --- a/src/Z2AudioLib/Z2LinkMgr.cpp +++ b/src/Z2AudioLib/Z2LinkMgr.cpp @@ -4,18 +4,7 @@ // #include "Z2AudioLib/Z2LinkMgr.h" -#include "Z2AudioLib/Z2Creature.h" #include "d/d_com_inf_game.h" -#include "dol2asm.h" -#include "global.h" - -struct Z2SoundObjCoach { - /* 802C54B8 */ Z2SoundObjCoach(); - /* 802C54FC */ void init(Vec*, u8); - /* 802C551C */ void startWheelSound(f32); - /* 802C56C0 */ void startFireSound(u16); - /* 802C57C0 */ int startSound(JAISoundID, u32, s8); -}; /* 802C321C-802C3220 2BDB5C 0004+00 0/0 1/1 0/0 .text setLinkGroupInfo__14Z2CreatureLinkFUc */ void Z2CreatureLink::setLinkGroupInfo(u8) {} @@ -355,14 +344,113 @@ JAISoundHandle* Z2CreatureLink::startLinkSoundLevel(JAISoundID i_soundID, u32 pa /* 802C4320-802C45B0 2BEC60 0290+00 1/1 1/1 0/0 .text * startLinkVoice__14Z2CreatureLinkF10JAISoundIDSc */ -void Z2CreatureLink::startLinkVoice(JAISoundID param_0, s8 param_1) { - // NONMATCHING +Z2SoundHandlePool* Z2CreatureLink::startLinkVoice(JAISoundID i_soundID, s8 param_1) { + if (mLinkState == 1) { + switch (i_soundID) { + case Z2SE_WL_V_BREATH_WAIT: + case Z2SE_WL_V_BREATH_TIRED: + case Z2SE_WL_V_BREATH_SIT: + if (Z2GetStatusMgr()->getDemoStatus() == 2 || !Z2GetSceneMgr()->isInGame()) { + return NULL; + } + // fallthrough + case Z2SE_WL_V_BREATH_WALK: + case Z2SE_WL_V_BREATH_RUN: + if (field_0xc1 < 5) { + return NULL; + } + field_0xc1 = 0; + break; + case Z2SE_WL_V_BITE_ATTACK: + if (mSoundObjSimple1.getHandleSoundID(Z2SE_WL_V_BITE_THROAT) != NULL) { + return NULL; + } + break; + } + } else { + if (i_soundID == Z2SE_AL_V_ATTACK_RUN) { + if (field_0xc1 < 10) { + return NULL; + } + field_0xc1 = 0; + } + + if (mMarkState != 3 && Z2GetSoundObjMgr()->getEnemyNumNear() == 0 + && !Z2GetSoundObjMgr()->isForceBattle()) + { + switch (i_soundID) { + case Z2SE_AL_V_ATTACK_S: + i_soundID = Z2SE_AL_V_ATTACK_S_FREE; + break; + case Z2SE_AL_V_ATTACK_M: + case Z2SE_AL_V_TATE_OSHI: + i_soundID = Z2SE_AL_V_ATTACK_M_FREE; + break; + case Z2SE_AL_V_ATTACK_L: + i_soundID = Z2SE_AL_V_ATTACK_L_FREE; + break; + case Z2SE_AL_V_KAITEN: + i_soundID = Z2SE_AL_V_KAITEN_FREE; + break; + case Z2SE_AL_V_BACKTEN: + case Z2SE_AL_V_SOTOMO_ROLL: + i_soundID = Z2SE_AL_V_BACKTEN_FREE; + break; + case Z2SE_AL_V_ATTACK_RUN: + i_soundID = Z2SE_AL_V_ATTACK_RUN_FREE; + break; + } + } else { + if (i_soundID == Z2SE_AL_V_JUMP_S) { + i_soundID = Z2SE_AL_V_BACKTEN; + } + } + + if (isInWater()) { + i_soundID = Z2SE_AL_V_UNDER_WATER; + } + } + + return startCreatureVoice(i_soundID, param_1); } /* 802C45B0-802C46F0 2BEEF0 0140+00 0/0 1/1 0/0 .text * startLinkVoiceLevel__14Z2CreatureLinkF10JAISoundIDSc */ -void Z2CreatureLink::startLinkVoiceLevel(JAISoundID param_0, s8 param_1) { - // NONMATCHING +Z2SoundHandlePool* Z2CreatureLink::startLinkVoiceLevel(JAISoundID i_soundID, s8 param_1) { + if (mLinkState == 1) { + switch (i_soundID) { + case Z2SE_WL_V_ROAR: + f32 volume = 0.0f; + u8 port_data = 0; + switch (mMarkState) { + case 0: + volume = 1.0f; + port_data = 2; + break; + case 1: + volume = 0.3f; + port_data = 1; + break; + case 2: + volume = 0.5f; + port_data = 1; + break; + case 3: + volume = 0.8f; + port_data = 2; + break; + } + + Z2SoundHandlePool* handle = startCreatureVoiceLevel(Z2SE_WL_V_ROAR, param_1); + if (handle != NULL && *handle) { + (*handle)->getAuxiliary().moveVolume(volume, 0); + Z2GetSoundStarter()->setPortData(handle, 8, port_data, -1); + } + return handle; + } + } + + return startCreatureVoiceLevel(i_soundID, param_1); } /* 802C46F0-802C4784 2BF030 0094+00 0/0 2/2 0/0 .text @@ -401,15 +489,26 @@ Z2SoundHandlePool* Z2CreatureLink::startCollisionSE(u32 hitID, u32 mapinfo) { return mSoundObjAnime.startCollisionSE(hitID, mapinfo, NULL); } -/* ############################################################################################## */ -/* 80455D18-80455D1C 004318 0004+00 1/1 0/0 0/0 .sdata2 @4178 */ -SECTION_SDATA2 static f32 lit_4178 = 100.0f; - /* 802C4814-802C48D8 2BF154 00C4+00 0/0 4/4 2/2 .text * startHitItemSE__14Z2CreatureLinkFUlUlP14Z2SoundObjBasef */ -int Z2CreatureLink::startHitItemSE(u32 param_0, u32 param_1, Z2SoundObjBase* param_2, - f32 speed) { - // NONMATCHING +Z2SoundHandlePool* Z2CreatureLink::startHitItemSE(u32 i_soundID, u32 param_1, + Z2SoundObjBase* param_2, f32 speed) { + if (param_2 == NULL) { + param_2 = &mSoundObjSimple2; + } + + if (i_soundID == Z2SE_HIT_SHIELD_ATTACK) { + return mSoundObjAnime.startCollisionSE(i_soundID, param_1, NULL); + } + + Z2SoundHandlePool* handle = param_2->startCollisionSE(i_soundID, param_1, NULL); + if (speed >= 0.0f && handle != NULL && *handle) { + if (speed >= 100.0f) { + speed = 100.0f; + } + (*handle)->getAuxiliary().moveVolume(speed / 100.0f, 0); + } + return handle; } /* 802C48D8-802C48E8 2BF218 0010+00 0/0 1/1 0/0 .text setResumeAttack__14Z2CreatureLinkFb @@ -421,17 +520,158 @@ void Z2CreatureLink::setResumeAttack(bool i_resumeAttack) { /* 802C48E8-802C4928 2BF228 0040+00 1/1 0/0 0/0 .text __ct__18Z2LinkSoundStarterFv */ Z2LinkSoundStarter::Z2LinkSoundStarter() : Z2SoundStarter(false) {} -/* ############################################################################################## */ -/* 80455D1C-80455D20 00431C 0004+00 2/2 0/0 0/0 .sdata2 @4399 */ -SECTION_SDATA2 static f32 lit_4399 = 9.0f / 10.0f; - /* 802C4928-802C4FFC 2BF268 06D4+00 2/0 0/0 0/0 .text * startSound__18Z2LinkSoundStarterF10JAISoundIDP14JAISoundHandlePCQ29JGeometry8TVec3<f>UlfffffUl */ -bool Z2LinkSoundStarter::startSound(JAISoundID param_0, JAISoundHandle* param_1, - JGeometry::TVec3<f32> const* param_2, u32 param_3, - f32 param_4, f32 param_5, f32 param_6, f32 param_7, - f32 param_8, u32 param_9) { - // NONMATCHING +// NONMATCHING stack alloc +bool Z2LinkSoundStarter::startSound(JAISoundID i_soundID, JAISoundHandle* param_1, + JGeometry::TVec3<f32> const* param_2, u32 param_3, + f32 param_4, f32 param_5, f32 param_6, f32 param_7, + f32 param_8, u32 param_9) { + bool bVar2 = false; + bool bVar3 = false; + + if (Z2GetLink()->isInWater() && Z2GetStatusMgr()->getCameraInWaterDepthRatio() > 0.0f) { + switch (i_soundID) { + case Z2SE_AL_SWIM: + case Z2SE_AL_DIVE_SWIM: + i_soundID = Z2SE_AL_SWIM_UNDERWATER; + break; + case Z2SE_AL_SWORD_SWING_S: + case Z2SE_AL_FINISH_SWING1: + case Z2SE_AL_FINISH_SWING2: + case Z2SE_AL_WAIT_SWORD_SWING: + i_soundID = Z2SE_AL_WATER_STROKE_S; + break; + case Z2SE_AL_SWORD_SWING_L: + i_soundID = Z2SE_AL_WATER_STROKE_L; + break; + case Z2SE_AL_SWORD_THRUST: + i_soundID = Z2SE_AL_WATER_STROKE_FAST; + break; + case Z2SE_AL_KAITENGIRI: + i_soundID = Z2SE_AL_WATER_STROKE_CIRCLE; + break; + } + } + + if (i_soundID.mId.mBytes.b1 == 3 && param_3 > 26) { + if (param_3 == 44) { + param_3 = 23; + } else { + param_3 = 0; + } + } + + switch (i_soundID) { + case Z2SE_AL_INTO_WATER: + case Z2SE_AL_DIVE_INTO_WATER: + case Z2SE_WL_INTO_WATER: + if (Z2GetLink()->mSoundObjSimple1.isActive()) { + Z2GetLink()->mSoundObjSimple1.stopAllSounds(1); + } + break; + case Z2SE_FN_WALK_DUMMY: + case Z2SE_FN_LADDER_CLIMB: + case Z2SE_FN_LADDER_DOWN: + bVar2 = true; + // fallthrough + case Z2SE_GORON_FOOTNOTE: + case Z2SE_FN_GOB_JUMP: + if (Z2GetLink()->mLinkBootsType == 1) { + i_soundID = Z2SE_FN_WALK_HEAVY; + if (Z2GetLink()->mMagnetized) { + param_3 = 127; + } + } + bVar3 = true; + break; + case Z2SE_FN_JUMP_DUMMY: + bVar2 = true; + bVar3 = true; + if (Z2GetLink()->mLinkBootsType == 1) { + i_soundID = Z2SE_FN_JUMP_HEAVY; + if (Z2GetLink()->mMagnetized) { + param_3 = 127; + } + } + if (Z2GetLink()->mSoundObjSimple1.getHandleSoundID(Z2SE_AL_V_FALL) != NULL) { + Z2GetLink()->startLinkVoice(Z2SE_AL_V_FOOT_MISS, -1); + } + break; + case Z2SE_FN_BOUND_DUMMY: + case Z2SE_FN_HAND_DUMMY: + bVar2 = true; + break; + case Z2SE_BODY_FALL_DOWN: + if (Z2GetLink()->mSoundObjSimple1.getHandleSoundID(Z2SE_AL_V_FALL) != NULL) { + Z2GetLink()->startLinkVoice(Z2SE_AL_V_LANDING_FAIL, -1); + } + break; + case Z2SE_OBJ_ARROW_SHOT_NORMAL: + case Z2SE_OBJ_ARROW_SHOT_GAIN: + case Z2SE_OBJ_ARROWBOMB_SHOT: + case Z2SE_OBJ_ARROWBOMB_SHOTGAIN: + Z2SoundHandlePool* handle = Z2GetLink()->mSoundObjAnime.getHandleSoundID(Z2SE_AL_DRAW_BOW); + if (handle != NULL) { + (*handle)->stop(0); + } + break; + } + + if (Z2GetLink()->mSinkDepth > 0) { + switch (i_soundID) { + case Z2SE_FN_WALK_DUMMY: + case Z2SE_FN_JUMP_DUMMY: + case Z2SE_FN_BOUND_DUMMY: + case Z2SE_FN_HAND_DUMMY: + case Z2SE_FN_WALK_HEAVY: + case Z2SE_FN_JUMP_HEAVY: + case Z2SE_WL_WALK_L_DUMMY: + case Z2SE_WL_WALK_R_DUMMY: + case Z2SE_WL_RUN_L_DUMMY: + case Z2SE_WL_RUN_R_DUMMY: + if (param_3 == 3) { + param_5 *= Z2Calc::linearTransform(Z2GetLink()->mSinkDepth, + 0.0f, 127.0f, 1.0f, 0.5f, true); + } else if (param_3 == 25) { + param_5 *= Z2Calc::linearTransform(Z2GetLink()->mSinkDepth, + 0.0f, 23.0f, 1.0f, 0.7f, true); + } + break; + } + } + + bool ret = Z2SoundStarter::startSound(i_soundID, param_1, param_2, param_3, param_4, param_5, + param_6, param_7, param_8, param_9); + + if (bVar2 && Z2GetSceneMgr()->getDemoSeWaveNum() != 114) { + if (Z2GetLink()->mFlag5) { + Z2GetLink()->startLinkSound(Z2SE_AL_SWORD_SHIELD_ADD, 0, param_4 * 127.0f); + } + + if (Z2GetLink()->mUsingIronBall) { + Z2GetLink()->startLinkSound(Z2SE_AL_IB_CHAIN_ADD, 0, param_4 * 127.0f); + } + + if (Z2GetLink()->mKanteraState != 0) { + Z2SoundHandlePool* handle = + Z2GetLink()->mKantera.startSound(Z2SE_AL_KANTERA_SWING_ADD, 0, param_4 * 127.0f); + if (Z2GetLink()->mKanteraState == 2 && handle != NULL && *handle) { + (*handle)->getAuxiliary().moveVolume(0.6f, 0); + (*handle)->getAuxiliary().movePitch(0.9f, 0); + } + } + } + + if (bVar3) { + if (Z2GetLink()->mLinkState == 4) { + Z2GetLink()->startLinkSound(Z2SE_FN_ARMER_LIGHT_ADD, 0, param_4 * 127.0f); + } else if (Z2GetLink()->mLinkState == 5) { + Z2GetLink()->startLinkSound(Z2SE_FN_ARMER_HEAVY_ADD, 0, param_4 * 127.0f); + } + } + + return ret; } /* 802C4FFC-802C5078 2BF93C 007C+00 0/0 0/0 3/3 .text __ct__14Z2CreatureRideFv */ @@ -441,14 +681,9 @@ Z2CreatureRide::Z2CreatureRide() : Z2RideSoundStarter(this) { setSoundStarter(this); } -/* 802C5078-802C5114 2BF9B8 009C+00 1/0 0/0 0/0 .text __dt__18Z2RideSoundStarterFv */ -inline Z2RideSoundStarter::~Z2RideSoundStarter() { - // NONMATCHING -} - /* 802C5114-802C51EC 2BFA54 00D8+00 2/1 0/0 2/2 .text __dt__14Z2CreatureRideFv */ Z2CreatureRide::~Z2CreatureRide() { - // NONMATCHING + deleteObject(); } /* 802C51EC-802C520C 2BFB2C 0020+00 1/0 0/0 0/0 .text deleteObject__14Z2CreatureRideFv */ @@ -475,61 +710,133 @@ Z2RideSoundStarter::Z2RideSoundStarter(Z2CreatureRide* ride) : Z2SoundStarter(fa /* 802C5284-802C54B8 2BFBC4 0234+00 2/0 0/0 0/0 .text * startSound__18Z2RideSoundStarterF10JAISoundIDP14JAISoundHandlePCQ29JGeometry8TVec3<f>UlfffffUl */ -bool Z2RideSoundStarter::startSound(JAISoundID param_0, JAISoundHandle* param_1, - JGeometry::TVec3<f32> const* param_2, u32 param_3, - f32 param_4, f32 param_5, f32 param_6, f32 param_7, - f32 param_8, u32 param_9) { - // NONMATCHING -} +// NONMATCHING regalloc / extra load +bool Z2RideSoundStarter::startSound(JAISoundID i_soundID, JAISoundHandle* param_1, + JGeometry::TVec3<f32> const* param_2, u32 param_3, + f32 param_4, f32 param_5, f32 param_6, f32 param_7, + f32 param_8, u32 param_9) { + if (!Z2GetSceneMgr()->isInGame()) { + return false; + } -/* 802C54B8-802C54FC 2BFDF8 0044+00 0/0 0/0 1/1 .text __ct__15Z2SoundObjCoachFv */ -Z2SoundObjCoach::Z2SoundObjCoach() { - // NONMATCHING -} + u8 uVar3 = 0; + switch (i_soundID) { + case Z2SE_HS_WALK_L_DUMMY: + case Z2SE_HS_WALK_R_DUMMY: + case Z2SE_HS_TROT_L_DUMMY: + case Z2SE_HS_TROT_R_DUMMY: + case Z2SE_HS_GALLOP_L_DUMMY: + uVar3 = 1; + break; + case Z2SE_WB_FRONT_L_DUMMY: + case Z2SE_WB_FRONT_R_DUMMY: + case Z2SE_WB_REAR_L_DUMMY: + uVar3 = 2; + break; + } -/* 802C54FC-802C551C 2BFE3C 0020+00 1/0 0/0 0/0 .text init__15Z2SoundObjCoachFP3VecUc */ -void Z2SoundObjCoach::init(Vec* param_0, u8 param_1) { - // NONMATCHING -} + bool ret = Z2SoundStarter::startSound(i_soundID, param_1, param_2, param_3, param_4, param_5, + param_6, param_7, param_8, param_9); -/* ############################################################################################## */ -/* 80455D20-80455D24 004320 0004+00 1/1 0/0 0/0 .sdata2 @4621 */ -SECTION_SDATA2 static f32 lit_4621 = 2.0f; + if (mRide->isLinkRiding() && uVar3 != 0) { + if (Z2GetLink()->mFlag5) { + Z2GetLink()->startLinkSound(Z2SE_AL_SWORD_SHIELD_ADD, 0, param_4 * 127.0f); + } -/* 80455D24-80455D28 004324 0004+00 1/1 0/0 0/0 .sdata2 @4622 */ -SECTION_SDATA2 static f32 lit_4622 = 35.0f; + if (Z2GetLink()->mKanteraState != 0) { + Z2SoundHandlePool* handle = + Z2GetLink()->mKantera.startSound(Z2SE_AL_KANTERA_SWING_ADD, 0, param_4 * 127.0f); + if (Z2GetLink()->mKanteraState == 2 && handle != NULL && *handle) { + (*handle)->getAuxiliary().moveVolume(0.6f, 0); + (*handle)->getAuxiliary().movePitch(0.9f, 0); + } + } -/* 80455D28-80455D2C 004328 0004+00 1/1 0/0 0/0 .sdata2 @4623 */ -SECTION_SDATA2 static f32 lit_4623 = 22.0f / 25.0f; + switch (uVar3) { + case 1: + Z2GetLink()->startLinkSound(Z2SE_AL_HARNESS_ADD_HS, 0, param_4 * 127.0f); + break; -/* 80455D2C-80455D30 00432C 0004+00 3/3 0/0 0/0 .sdata2 @4624 */ -SECTION_SDATA2 static f32 lit_4624 = 1.25f; + case 2: + Z2GetLink()->startLinkSound(Z2SE_AL_HARNESS_ADD_WB, 0, param_4 * 127.0f); + break; + } + } -/* 80455D30-80455D34 004330 0004+00 2/2 0/0 0/0 .sdata2 @4625 */ -SECTION_SDATA2 static f32 lit_4625 = 50.0f; + return ret; +} -/* 802C551C-802C56C0 2BFE5C 01A4+00 0/0 0/0 1/1 .text startWheelSound__15Z2SoundObjCoachFf */ -void Z2SoundObjCoach::startWheelSound(f32 param_0) { - // NONMATCHING +/* 802C54B8-802C54FC 2BFDF8 0044+00 0/0 0/0 1/1 .text __ct__15Z2SoundObjCoachFv */ +Z2SoundObjCoach::Z2SoundObjCoach() { + field_0x20 = 0.0f; } -/* ############################################################################################## */ -/* 80455D34-80455D38 004334 0004+00 1/1 0/0 0/0 .sdata2 @4645 */ -SECTION_SDATA2 static f32 lit_4645 = 1500.0f; +/* 802C54FC-802C551C 2BFE3C 0020+00 1/0 0/0 0/0 .text init__15Z2SoundObjCoachFP3VecUc */ +void Z2SoundObjCoach::init(Vec* i_soundPos, u8 i_numHandles) { + Z2SoundObjBase::init(i_soundPos, i_numHandles); +} -/* 80455D38-80455D3C 004338 0004+00 2/2 0/0 0/0 .sdata2 @4646 */ -SECTION_SDATA2 static f32 lit_4646 = 1.0f / 5.0f; +/* 802C551C-802C56C0 2BFE5C 01A4+00 0/0 0/0 1/1 .text startWheelSound__15Z2SoundObjCoachFf */ +Z2SoundHandlePool* Z2SoundObjCoach::startWheelSound(f32 param_0) { + Z2SoundHandlePool* handle = NULL; + + if (!(param_0 < 2.0f)) { + if (param_0 < 35.0f) { + handle = startLevelSound(Z2SE_COACH_WHEEL_ROLL_A, 0, -1); + if (handle != NULL && *handle) { + f32 pitch = Z2Calc::getParamByExp(param_0, 0.0f, 35.0f, 0.25f, 0.88f, 1.25f, + Z2Calc::CURVE_SIGN_1); + (*handle)->getAuxiliary().movePitch(pitch, 0); + f32 volume = Z2Calc::getParamByExp(param_0, 0.0f, 35.0f, 0.3f, 0.7f, 1.0f, + Z2Calc::CURVE_SIGN_1); + (*handle)->getAuxiliary().moveVolume(volume, 0); + } + } else { + handle = startLevelSound(Z2SE_COACH_WHEEL_ROLL_B, 0, -1); + if (handle != NULL && *handle) { + f32 pitch = Z2Calc::getParamByExp(param_0, 35.0f, 50.0f, 0.25f, 0.88f, 1.25f, + Z2Calc::CURVE_SIGN_1); + (*handle)->getAuxiliary().movePitch(pitch, 0); + f32 volume = Z2Calc::getParamByExp(param_0, 35.0f, 50.0f, 0.3f, 0.8f, 1.0f, + Z2Calc::CURVE_SIGN_1); + (*handle)->getAuxiliary().moveVolume(volume, 0); + } + } + } -/* 80455D3C-80455D40 00433C 0004+00 2/2 0/0 0/0 .sdata2 @4647 */ -SECTION_SDATA2 static f32 lit_4647 = 17.0f / 20.0f; + field_0x20 = param_0; + return handle; +} /* 802C56C0-802C57C0 2C0000 0100+00 0/0 0/0 1/1 .text startFireSound__15Z2SoundObjCoachFUs */ -void Z2SoundObjCoach::startFireSound(u16 param_0) { - // NONMATCHING +Z2SoundHandlePool* Z2SoundObjCoach::startFireSound(u16 param_0) { + Z2SoundHandlePool* handle = startLevelSound(Z2SE_COACH_FIRE, 0, -1); + + if (handle != NULL && *handle) { + f32 pitch = Z2Calc::getParamByExp(param_0, 0.0f, 1500.0f, 0.2f, 0.85f, 1.25f, + Z2Calc::CURVE_SIGN_1); + (*handle)->getAuxiliary().movePitch(pitch, 0); + f32 volume = Z2Calc::getParamByExp(param_0, 0.0f, 1500.0f, 0.2f, 0.6f, 1.0f, + Z2Calc::CURVE_SIGN_1); + (*handle)->getAuxiliary().moveVolume(volume, 0); + } + + return handle; } /* 802C57C0-802C588C 2C0100 00CC+00 1/0 0/0 0/0 .text * startSound__15Z2SoundObjCoachF10JAISoundIDUlSc */ -int Z2SoundObjCoach::startSound(JAISoundID param_0, u32 param_1, s8 param_2) { - // NONMATCHING +Z2SoundHandlePool* Z2SoundObjCoach::startSound(JAISoundID i_soundID, u32 param_1, s8 param_2) { + Z2SoundHandlePool* handle = Z2SoundObjBase::startSound(i_soundID, param_1, param_2); + + if (handle != NULL && *handle && i_soundID == Z2SE_COACH_SHAKE) { + f32 pitch = Z2Calc::getParamByExp(field_0x20, 0.0f, 50.0f, 0.2f, 0.85f, 1.25f, + Z2Calc::CURVE_SIGN_1); + (*handle)->getAuxiliary().movePitch(pitch, 0); + f32 volume = Z2Calc::getParamByExp(field_0x20, 0.0f, 50.0f, 0.2f, 0.8f, 1.0f, + Z2Calc::CURVE_SIGN_1); + (*handle)->getAuxiliary().moveVolume(volume, 0); + } + + return handle; } diff --git a/src/Z2AudioLib/Z2Param.cpp b/src/Z2AudioLib/Z2Param.cpp index 2cefa6e907..a720929182 100644 --- a/src/Z2AudioLib/Z2Param.cpp +++ b/src/Z2AudioLib/Z2Param.cpp @@ -167,7 +167,3 @@ u8 struct_80451341; u8 struct_80451342; u8 pad_80451344[4]; #pragma pop - -/* 80451348-80451350 000848 0008+00 0/0 4/4 0/0 .sbss None */ -extern u8 data_80451348[8]; -u8 data_80451348[8];
\ No newline at end of file diff --git a/src/Z2AudioLib/Z2SeMgr.cpp b/src/Z2AudioLib/Z2SeMgr.cpp index 4c3a4c7655..b5886c6a3f 100644 --- a/src/Z2AudioLib/Z2SeMgr.cpp +++ b/src/Z2AudioLib/Z2SeMgr.cpp @@ -6,49 +6,14 @@ #include "Z2AudioLib/Z2SeMgr.h" #include "Z2AudioLib/Z2Audience.h" #include "Z2AudioLib/Z2Calc.h" +#include "Z2AudioLib/Z2LinkMgr.h" #include "Z2AudioLib/Z2SoundMgr.h" #include "Z2AudioLib/Z2SceneMgr.h" #include "Z2AudioLib/Z2SpeechMgr2.h" #include "Z2AudioLib/Z2StatusMgr.h" #include "Z2AudioLib/Z2Param.h" #include "Z2AudioLib/Z2SeqMgr.h" -#include "dol2asm.h" - -// -// Forward References: -// - -extern "C" void __ct__7Z2SeMgrFv(); -extern "C" void __ct__12Z2MultiSeObjFv(); -extern "C" void initSe__7Z2SeMgrFv(); -extern "C" void resetModY__7Z2SeMgrFv(); -extern "C" void modHeightAtCamera__7Z2SeMgrFPPC3Vec(); -extern "C" void incrCrowdSize__7Z2SeMgrFv(); -extern "C" void decrCrowdSize__7Z2SeMgrFv(); -extern "C" void seStart__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc(); -extern "C" void seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc(); -extern "C" void seStop__7Z2SeMgrF10JAISoundIDUl(); -extern "C" void seStopAll__7Z2SeMgrFUl(); -extern "C" void seMoveVolumeAll__7Z2SeMgrFfUl(); -extern "C" void messageSePlay__7Z2SeMgrFUsP3VecSc(); -extern "C" void talkInSe__7Z2SeMgrFv(); -extern "C" void talkOutSe__7Z2SeMgrFv(); -extern "C" void menuInSe__7Z2SeMgrFv(); -extern "C" void setLevObjSE__7Z2SeMgrFUlP3VecSc(); -extern "C" void setMultiTriggerSE__7Z2SeMgrFUlP3VecSc(); -extern "C" void processSeFramework__7Z2SeMgrFv(); -extern "C" void isLevelSe__7Z2SeMgrF10JAISoundID(); -extern "C" void isSoundCulling__7Z2SeMgrF10JAISoundID(); -extern "C" void __ct__12Z2MultiSeMgrFv(); -extern "C" void __dt__12Z2MultiSeMgrFv(); -extern "C" void registMultiSePos__12Z2MultiSeMgrFP3Vec(); -extern "C" void resetMultiSePos__12Z2MultiSeMgrFv(); -extern "C" void getPanPower__12Z2MultiSeMgrFv(); -extern "C" void getDolbyPower__12Z2MultiSeMgrFv(); - -// -// Declarations: -// +#include "JSystem/J3DU/J3DUD.h" /* 802AB64C-802AB710 2A5F8C 00C4+00 0/0 1/1 0/0 .text __ct__7Z2SeMgrFv */ Z2SeMgr::Z2SeMgr() : JASGlobalInstance(this), mSoundHandles(mSoundHandle, 0x18) { @@ -145,12 +110,12 @@ void Z2SeMgr::decrCrowdSize() { /* 802AB984-802AC50C 2A62C4 0B88+00 1/1 196/196 549/549 .text * seStart__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc */ -// NONMATCHING something is wrong with the switch, also isMovieDemo needs to not get inlined bool Z2SeMgr::seStart(JAISoundID i_soundID, Vec const* i_pos, u32 param_2, s8 i_reverb, f32 i_pitch, f32 i_volume, f32 i_pan, f32 i_dolby, u8 param_8) { if (i_soundID == 0xffffffff) { return false; } + if (param_8 != 1) { switch (i_soundID) { case Z2SE_OBJ_L8_STAIR_ON: @@ -165,6 +130,7 @@ bool Z2SeMgr::seStart(JAISoundID i_soundID, Vec const* i_pos, u32 param_2, s8 i_ return false; } } + switch (i_soundID) { case Z2SE_QUIT_GAME: Z2GetStatusMgr()->menuOut(); @@ -177,7 +143,7 @@ bool Z2SeMgr::seStart(JAISoundID i_soundID, Vec const* i_pos, u32 param_2, s8 i_ seStop(JA_SE_OBJ_STN_DOOR_MOVE_D, 0); break; case JA_SE_OBJ_STN_DOOR_STOP_D: - seStop(JA_SE_OBJ_STN_DOOR_STOP_D, 0); + seStop(JA_SE_OBJ_STN_DOOR_MOVE_U, 0); seStop(JA_SE_OBJ_STN_DOOR_MOVE_D, 0); break; case JA_SE_OBJ_STN_DOOR_MOVE_D: @@ -185,6 +151,7 @@ bool Z2SeMgr::seStart(JAISoundID i_soundID, Vec const* i_pos, u32 param_2, s8 i_ seStop(JA_SE_OBJ_STN_DOOR_MOVE_U, 0); seStop(JA_SE_OBJ_STN_DOOR_MOVE_D, 0); break; + case Z2SE_OBJ_WOOD_DOOR_ROLLOPEN: case Z2SE_OBJ_WOOD_DOOR_ROLLOPEN2: case Z2SE_OBJ_WOOD_DR_OP_MDN: case Z2SE_OBJ_WOOD_DR_OP_MDN_FX: @@ -193,11 +160,10 @@ bool Z2SeMgr::seStart(JAISoundID i_soundID, Vec const* i_pos, u32 param_2, s8 i_ seStop(Z2SE_OBJ_WOOD_DOOR_ROLLCLOSE, 0); break; case Z2SE_OBJ_WOOD_DOOR_CLOSE_STOP: - seStop(Z2SE_OBJ_WOOD_DOOR_CLOSE_STOP, 0); + seStop(Z2SE_OBJ_WOOD_DOOR_ROLLOPEN, 0); seStop(Z2SE_OBJ_WOOD_DOOR_ROLLOPEN2, 0); seStop(Z2SE_OBJ_WOOD_DOOR_ROLLCLOSE, 0); break; - case Z2SE_OBJ_WOOD_DOOR_ROLLOPEN: case Z2SE_OBJ_WOOD_DOOR_ROLLCLOSE: case Z2SE_OBJ_WOOD_DOOR_OPEN_STOP: seStop(Z2SE_OBJ_WOOD_DOOR_ROLLOPEN, 0); @@ -314,12 +280,13 @@ bool Z2SeMgr::seStart(JAISoundID i_soundID, Vec const* i_pos, u32 param_2, s8 i_ i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 41.0f, 0.4f, 0.3f, 1.0f, Z2Calc::CURVE_SIGN_2); break; - case Z2SE_OBJ_L8_B_FOG_FLY: + case Z2SE_OBJ_L8_B_FOG_FLY: { Vec tmp = Z2GetAudience()->getAudioCamPos(0); if (i_pos->y > tmp.y) { return false; } break; + } case Z2SE_OBJ_BLN_BREAK_S: case Z2SE_OBJ_BLN_BREAK_M: case Z2SE_OBJ_BLN_BREAK_L: @@ -354,157 +321,387 @@ bool Z2SeMgr::seStart(JAISoundID i_soundID, Vec const* i_pos, u32 param_2, s8 i_ i_soundID = Z2SE_OBJ_DARK_GATE_RIPPLE_WLF; } break; + case Z2SE_OBJ_ARMOR_SWING: + case Z2SE_OBJ_ARMOR_HIT: + break; } + if (isLevelSe(i_soundID)) { return seStartLevel(i_soundID, i_pos, param_2, i_reverb, i_pitch, i_volume, i_pan, i_dolby, param_8); } + if (isSoundCulling(i_soundID)) { return false; } + JAISoundHandle* handle = mSoundHandles.getFreeHandle(); if (handle == NULL) { return false; } + return Z2GetSoundStarter()->startSound(i_soundID, handle, (JGeometry::TVec3<f32>*)i_pos, param_2, i_reverb / 127.0f, i_pitch, i_volume, i_pan, i_dolby, 0); } -/* ############################################################################################## */ -/* 803C9D98-803C9DF8 -00001 0060+00 1/1 0/0 0/0 .data @4619 */ -SECTION_DATA static void* lit_4619[24] = { - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xF78), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xF78), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xF78), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xF78), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xF84), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xF90), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xF9C), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xFA8), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xFB4), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xFC0), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xFCC), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xFD8), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0x1028), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0x1028), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0x1028), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0x1028), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0x1028), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0x1028), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xFE4), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xFF0), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0xFFC), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0x1008), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0x1014), - (void*)(((char*)seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc) + 0x1020), -}; - -/* 804558E8-804558EC 003EE8 0004+00 1/1 0/0 0/0 .sdata2 @4586 */ -SECTION_SDATA2 static f32 lit_4586 = 25.0f; - -/* 804558EC-804558F0 003EEC 0004+00 1/1 0/0 0/0 .sdata2 @4587 */ -SECTION_SDATA2 static f32 lit_4587 = 1.0f / 10.0f; - -/* 804558F0-804558F4 003EF0 0004+00 1/1 0/0 0/0 .sdata2 @4588 */ -SECTION_SDATA2 static f32 lit_4588 = 10.0f; - -/* 804558F4-804558F8 003EF4 0004+00 1/1 0/0 0/0 .sdata2 @4589 */ -SECTION_SDATA2 static f32 lit_4589 = 2.0f; - -/* 804558F8-80455900 003EF8 0004+04 2/2 0/0 0/0 .sdata2 @4590 */ -SECTION_SDATA2 static f32 lit_4590[1 + 1 /* padding */] = { - 13.0f / 10.0f, - /* padding */ - 0.0f, -}; - -/* 80455900-80455908 003F00 0008+00 1/1 0/0 0/0 .sdata2 @4591 */ -SECTION_SDATA2 static f64 lit_4591 = 0.7; - -/* 80455908-80455910 003F08 0008+00 1/1 0/0 0/0 .sdata2 @4592 */ -SECTION_SDATA2 static f64 lit_4592 = 0.0006; - -/* 80455910-80455918 003F10 0008+00 1/1 0/0 0/0 .sdata2 @4593 */ -SECTION_SDATA2 static f64 lit_4593 = 1.0; - -/* 80455918-80455920 003F18 0008+00 1/1 0/0 0/0 .sdata2 @4594 */ -SECTION_SDATA2 static f64 lit_4594 = 0.0015; - -/* 80455920-80455928 003F20 0008+00 1/1 0/0 0/0 .sdata2 @4595 */ -SECTION_SDATA2 static f64 lit_4595 = 0.005; - -/* 80455928-80455930 003F28 0008+00 1/1 0/0 0/0 .sdata2 @4596 */ -SECTION_SDATA2 static f64 lit_4596 = 0.3; - -/* 80455930-80455938 003F30 0008+00 1/1 0/0 0/0 .sdata2 @4597 */ -SECTION_SDATA2 static f64 lit_4597 = 0.001; - -/* 80455938-8045593C 003F38 0004+00 1/1 0/0 0/0 .sdata2 @4598 */ -SECTION_SDATA2 static f32 lit_4598 = 4000.0f; - -/* 8045593C-80455940 003F3C 0004+00 1/1 0/0 0/0 .sdata2 @4599 */ -SECTION_SDATA2 static f32 lit_4599 = 3500.0f; - -/* 80455940-80455944 003F40 0004+00 1/1 0/0 0/0 .sdata2 @4600 */ -SECTION_SDATA2 static f32 lit_4600 = 26.0f; - -/* 80455944-80455948 003F44 0004+00 1/1 0/0 0/0 .sdata2 @4601 */ -SECTION_SDATA2 static f32 lit_4601 = 3.0f / 5.0f; - -/* 80455948-8045594C 003F48 0004+00 1/1 0/0 0/0 .sdata2 @4602 */ -SECTION_SDATA2 static f32 lit_4602 = 64.0f; +/* 802AC50C-802AD8B0 2A6E4C 13A4+00 3/2 19/19 199/199 .text + * seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc */ +bool Z2SeMgr::seStartLevel(JAISoundID i_soundID, Vec const* i_pos, u32 param_2, s8 i_reverb, + f32 i_pitch, f32 i_volume, f32 i_pan, f32 i_dolby, u8 param_8) { + if (param_8 != 1) { + switch (i_soundID) { + case Z2SE_OBJ_FIRE_BURNING: + if (Z2GetStatusMgr()->getDemoStatus() == 2 || !Z2GetSceneMgr()->isInGame()) { + return false; + } + // fallthrough + case Z2SE_FAIRY_S_LV: + case Z2SE_EN_ZZ_MV: + case Z2SE_OBJ_L8_L_BALL_SW: + case Z2SE_OBJ_GANON_BARRIER: + case Z2SE_OBJ_CRVN_BURNING: + setLevObjSE(i_soundID, const_cast<Vec*>(i_pos), i_reverb); + return false; + } + } -/* 8045594C-80455950 003F4C 0004+00 1/1 0/0 0/0 .sdata2 @4603 */ -SECTION_SDATA2 static f32 lit_4603 = 4500.0f; + switch (i_soundID) { + case Z2SE_OBJ_FLAG_TRAILING: + i_volume = Z2Calc::getParamByExp(param_2, 25.0f, 127.0f, 0.4f, 0.1f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 25.0f, 127.0f, 0.4f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_BRIDGE_TRAILING: + case Z2SE_OBJ_BROKENBRIDGE: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 127.0f, 0.4f, 0.1f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 127.0f, 0.4f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_BOOMSHTR_SWITCH: + if (param_2 < 10) { + param_2 = 10; + } + i_volume = Z2Calc::getParamByExp(param_2, 10.0f, 127.0f, 2.0f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_1); + i_pitch = Z2Calc::getParamByExp(param_2, 10.0f, 127.0f, 2.0f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_1); + break; + case Z2SE_OBJ_FAN_WIND_S: + modHeightAtCamera(&i_pos); + break; + case Z2SE_OBJ_FAN_ROLL_S: + case Z2SE_OBJ_FAN_ROLL_M: + case Z2SE_OBJ_FAN_ROLL_L: + if (param_2 < 10) { + param_2 = 10; + } + i_volume = Z2Calc::getParamByExp(param_2, 10.0f, 127.0f, 2.0f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_1); + i_pitch = Z2Calc::getParamByExp(param_2, 10.0f, 127.0f, 2.0f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_1); + break; + case Z2SE_OBJ_AMI_ROLL: + if (param_2 < 10) { + param_2 = 10; + } + i_volume = Z2Calc::getParamByExp(param_2, 10.0f, 127.0f, 2.0f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_1); + i_pitch = Z2Calc::getParamByExp(param_2, 10.0f, 127.0f, 2.0f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_1); + break; + case Z2SE_OBJ_BRDG_MOVE: + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 127.0f, 2.0f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_1); + break; + case Z2SE_ENV_WIND_SARUDAN: + i_volume = Z2Calc::getParamByExp(param_2, 25.0f, 127.0f, 0.4f, 0.4f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 25.0f, 127.0f, 0.4f, 0.8f, 1.0f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_CHANDLV9_SWING: + if (param_2 < 10) { + param_2 = 10; + } + i_volume = Z2Calc::getParamByExp(param_2, 10.0f, 127.0f, 2.0f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_1); + i_pitch = Z2Calc::getParamByExp(param_2, 10.0f, 127.0f, 2.0f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_1); + break; + case Z2SE_OBJ_BOMB_HOUSE_BURN: + if (param_2 > 300) { + seStartLevel(Z2SE_OBJ_BOMB_HOUSE_BURN_S, NULL, param_2, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + } + if (param_2 > 500) { + i_volume = 1.0f; + i_pitch = 1.3f; + } else { + i_volume = param_2 * 0.0006 + 0.7; + i_pitch = param_2 * 0.0006 + 1.0; + } + break; + case Z2SE_OBJ_BOMB_HOUSE_BURN_S: + if (param_2 > 500) { + i_volume = 1.0f; + i_pitch = (param_2 - 500) * 0.0015 + 1.0; + } else if (param_2 < 300) { + i_volume = 0.0f; + } else { + i_volume = (param_2 - 300) * 0.005; + } + break; + case Z2SE_OBJ_WTR_CLMN_UP: + if (param_2 <= 500) { + i_pitch = 0.8f; + } else if (param_2 > 500 && param_2 <= 1000) { + i_pitch = 1.0f; + } else if (param_2 > 1000 && param_2 <= 1500) { + i_pitch = 1.0f; + } else { + i_pitch = 1.2f; + } + modHeightAtCamera(&i_pos); + break; + case Z2SE_OBJ_WTR_CLMN_DOWN: + if (param_2 > 700) { + i_pitch = 1.0f; + } else { + i_pitch = param_2 * 0.001 + 0.3; + } + modHeightAtCamera(&i_pos); + break; + case Z2SE_OBJ_STN_SPRL_RAIL: + case Z2SE_OBJ_STN_SPRL_RAIL_DW: + modHeightAtCamera(&i_pos); + break; + case Z2SE_OBJ_SPNR_GEAR_S: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 4000.0f, 0.4f, 0.3f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 4000.0f, 0.4f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_SPNR_GEAR_L: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 3500.0f, 0.4f, 0.3f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 3500.0f, 0.4f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_TOGE_SPIN: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 26.0f, 0.4f, 0.6f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 26.0f, 0.4f, 0.8f, 1.2f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_STN_WL_RL: + case Z2SE_OBJ_STN_WL_RL_OP: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 64.0f, 0.4f, 0.3f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 64.0f, 0.4f, 0.6f, 1.2f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_SPNR_SW_RL: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 4500.0f, 0.4f, 0.6f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 4500.0f, 0.4f, 0.7f, 1.2f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_TOGE_ROLL_MV: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 40.0f, 0.4f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 40.0f, 0.4f, 0.8f, 1.2f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_L8_L_TORCH_SW: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 120.0f, 0.4f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 120.0f, 0.4f, 0.9f, 1.0f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_L8_B_FOG_STAY: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 100.0f, 0.4f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_L8_B_FALL_S: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 100.0f, 0.4f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_L8_B_FALL_L: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 100.0f, 0.4f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_L8_L_LIFT_MV: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 5.0f, 0.4f, 0.5f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 5.0f, 0.4f, 0.7f, 1.0f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_AMATA_CRK: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 400.0f, 0.4f, 0.5f, 1.0f, + Z2Calc::CURVE_SIGN_0); + i_pitch = Z2Calc::getParamByExp(param_2, 0.0f, 400.0f, 0.4f, 0.8f, 1.1f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_OBJ_HYRULE_BARRIER: + if (Z2GetSceneMgr()->getCurrentSceneNum() != 0x16) { + break; + } + // fallthrough + case Z2SE_OBJ_DARK_GATE: + if (!Z2GetSceneMgr()->isInDarkness() && i_pos != NULL + && Z2GetLink() != NULL && Z2GetLink()->getCurrentPos() != NULL) + { + f32 dist = sqrtf(VECSquareDistance(i_pos, Z2GetLink()->getCurrentPos())); + f32 gate_volume = 1.0f; + if (dist < 2000.0f) { + gate_volume = 0.0f; + } else if (dist < 4000.0f) { + gate_volume = Z2Calc::getParamByExp(dist, 2000.0f, 5000.0f, 0.45f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_0); + } + Z2GetSeqMgr()->setTwilightGateVol(gate_volume); + } + break; + case Z2SE_OBJ_HASU_WTR: + i_volume = Z2Calc::getParamByExp(param_2, 0.0f, 50.0f, 0.4f, 0.5f, 1.0f, + Z2Calc::CURVE_SIGN_0); + break; + case Z2SE_ENV_PEOPLE_CROWD: { + f32 scale = 1.0f; + if (Z2GetSceneMgr()->getCurrentRoomNum() == 3) { + scale = Z2Calc::linearTransform(J3DUD::JMAAbs(Z2GetLink()->getCurrentPos()->x), + 600.0f, 3500.0f, 1.0f, 0.1f, false); + } + switch (Z2GetStatusMgr()->getHour()) { + case 0: + case 1: + case 2: + case 3: + scale *= 0.1f; + break; + case 4: + scale *= 0.2f; + break; + case 5: + scale *= 0.3f; + break; + case 6: + scale *= 0.4f; + break; + case 7: + scale *= 0.5f; + break; + case 8: + scale *= 0.6f; + break; + case 9: + scale *= 0.7f; + break; + case 10: + scale *= 0.8f; + break; + case 11: + scale *= 0.9f; + break; + case 18: + scale *= 0.9f; + break; + case 19: + scale *= 0.8f; + break; + case 20: + scale *= 0.7f; + break; + case 21: + scale *= 0.5f; + break; + case 22: + scale *= 0.4f; + break; + case 23: + scale *= 0.2f; + break; + } + i_volume = Z2Calc::getParamByExp(mCrowdSize * scale, 5.0f, 90.0f, 0.2f, 0.0f, 1.0f, + Z2Calc::CURVE_SIGN_0); + break; + } + case Z2SE_AL_COPYROD_WAIT: + param_2++; + break; + } -/* 80455950-80455954 003F50 0004+00 1/1 0/0 0/0 .sdata2 @4604 */ -SECTION_SDATA2 static f32 lit_4604 = 40.0f; + for (int i = 0; i < 24; i++) { + if (mSoundHandles[i] && mSoundHandles[i]->getID() == i_soundID + && i_pos == (Vec*)mSoundHandles[i]->getUserData()) + { + if (param_8 == 1) { + i_volume = Z2GetAudience()->calcOffMicSound(i_volume); + } -/* 80455954-80455958 003F54 0004+00 1/1 0/0 0/0 .sdata2 @4605 */ -SECTION_SDATA2 static f32 lit_4605 = 120.0f; + mSoundHandles[i]->updateLifeTime(1); -/* 80455958-80455960 003F58 0004+04 1/1 0/0 0/0 .sdata2 @4606 */ -SECTION_SDATA2 static f32 lit_4606[1 + 1 /* padding */] = { - 5.0f, - /* padding */ - 0.0f, -}; + if (i_pos != NULL) { + mSoundHandles[i]->setPos((JGeometry::TVec3<f32>)*i_pos); + } -/* 80455960-80455968 003F60 0008+00 1/1 0/0 0/0 .sdata2 @4607 */ -SECTION_SDATA2 static f64 lit_4607 = 0.5; + if (param_2 != 0) { + JAISoundHandle* handle = &mSoundHandles[i]; + Z2GetSoundStarter()->setPortData(handle, 6, param_2, -1); + } -/* 80455968-80455970 003F68 0008+00 1/1 0/0 0/0 .sdata2 @4608 */ -SECTION_SDATA2 static f64 lit_4608 = 3.0; + if (i_reverb != 0) { + mSoundHandles[i]->getAuxiliary().moveFxMix(i_reverb / 127.0f, 0); + } + if (i_pitch != 1.0f) { + mSoundHandles[i]->getAuxiliary().movePitch(i_pitch, 0); + } + if (i_volume != 1.0f) { + mSoundHandles[i]->getAuxiliary().moveVolume(i_volume, 0); + } + if (i_pan != -1.0f) { + mSoundHandles[i]->getAuxiliary().movePan(i_pan, 0); + } + if (i_dolby != -1.0f) { + mSoundHandles[i]->getAuxiliary().moveDolby(i_dolby, 0); + } -/* 80455970-80455978 003F70 0008+00 1/1 0/0 0/0 .sdata2 @4609 */ -SECTION_SDATA2 static u8 lit_4609[8] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; + return true; + } + } -/* 80455978-8045597C 003F78 0004+00 1/1 0/0 0/0 .sdata2 @4610 */ -SECTION_SDATA2 static f32 lit_4610 = 2000.0f; + if (isSoundCulling(i_soundID)) { + return false; + } -/* 8045597C-80455980 003F7C 0004+00 1/1 0/0 0/0 .sdata2 @4611 */ -SECTION_SDATA2 static f32 lit_4611 = 5000.0f; + JAISoundHandle* handle = mSoundHandles.getFreeHandle(); + if (handle == NULL) { + return false; + } -/* 80455980-80455984 003F80 0004+00 1/1 0/0 0/0 .sdata2 @4612 */ -SECTION_SDATA2 static f32 lit_4612 = 9.0f / 20.0f; + bool ret = Z2GetSoundStarter()->startSound(i_soundID, handle, (JGeometry::TVec3<f32>*)i_pos, + param_2, i_reverb / 127.0f, i_pitch, i_volume, + i_pan, i_dolby, false); + + if (handle != NULL && *handle) { + if (i_soundID == Z2SE_OBJ_BOMB_HOUSE_BURN) { + Z2GetSeqMgr()->bgmStart(Z2BGM_EVENT02, 0, 0); + } -/* 80455984-80455988 003F84 0004+00 1/1 0/0 0/0 .sdata2 @4613 */ -SECTION_SDATA2 static f32 lit_4613 = 50.0f; + if (param_8 == 1) { + Z2GetAudience()->calcOffMicSound(i_volume); + } -/* 80455988-8045598C 003F88 0004+00 1/1 0/0 0/0 .sdata2 @4614 */ -SECTION_SDATA2 static f32 lit_4614 = 600.0f; + (*handle)->setUserData((u32)i_pos); -/* 8045598C-80455990 003F8C 0004+00 1/1 0/0 0/0 .sdata2 @4615 */ -SECTION_SDATA2 static f32 lit_4615 = 90.0f; + if (ret) { + (*handle)->setLifeTime(1, false); + } + } -/* 802AC50C-802AD8B0 2A6E4C 13A4+00 3/2 19/19 199/199 .text - * seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc */ -bool Z2SeMgr::seStartLevel(JAISoundID param_0, Vec const* param_1, u32 param_2, s8 param_3, - f32 param_4, f32 param_5, f32 param_6, f32 param_7, u8 param_8) { - // NONMATCHING + return ret; } /* 802AD8B0-802AD94C 2A81F0 009C+00 1/1 0/0 4/4 .text seStop__7Z2SeMgrF10JAISoundIDUl */ diff --git a/src/Z2AudioLib/Z2SeqMgr.cpp b/src/Z2AudioLib/Z2SeqMgr.cpp index 0be99b8f33..6a57686328 100644 --- a/src/Z2AudioLib/Z2SeqMgr.cpp +++ b/src/Z2AudioLib/Z2SeqMgr.cpp @@ -4,7 +4,7 @@ // #include "Z2AudioLib/Z2SeqMgr.h" -#include "Z2AudioLib/Z2Creature.h" +#include "Z2AudioLib/Z2LinkMgr.h" #include "Z2AudioLib/Z2Param.h" #include "Z2AudioLib/Z2SceneMgr.h" #include "Z2AudioLib/Z2SoundMgr.h" diff --git a/src/Z2AudioLib/Z2SoundHandles.cpp b/src/Z2AudioLib/Z2SoundHandles.cpp index b351939a2b..68804a6d01 100644 --- a/src/Z2AudioLib/Z2SoundHandles.cpp +++ b/src/Z2AudioLib/Z2SoundHandles.cpp @@ -19,7 +19,6 @@ void Z2SoundHandles::initHandlesPool(u8 pNumHandles) { } /* 802AB120-802AB200 2A5A60 00E0+00 1/1 1/1 0/0 .text deleteHandlesPool__14Z2SoundHandlesFv */ -// NONMATCHING JASPoolAllocObject<_> locations void Z2SoundHandles::deleteHandlesPool() { JSULink<Z2SoundHandlePool>* link; while (link = getFirst(), link != NULL) { @@ -60,7 +59,6 @@ Z2SoundHandlePool* Z2SoundHandles::getHandleUserData(u32 pUserData) { /* 802AB2D8-802AB3D0 2A5C18 00F8+00 0/0 3/3 0/0 .text getFreeHandle__14Z2SoundHandlesFv */ -// NONMATCHING JASPoolAllocObject<_> locations Z2SoundHandlePool* Z2SoundHandles::getFreeHandle() { JSULink<Z2SoundHandlePool>* link; for (link = getFirst(); link != NULL; link = link->getNext()) { @@ -133,7 +131,6 @@ bool Z2SoundHandles::isActive() const { /* 802AB538-802AB64C 2A5E78 0114+00 0/0 1/1 0/0 .text * setPos__14Z2SoundHandlesFRCQ29JGeometry8TVec3<f> */ -// NONMATCHING JASPoolAllocObject<_> locations void Z2SoundHandles::setPos(JGeometry::TVec3<f32> const& param_0) { JSULink<Z2SoundHandlePool>* link; for (link = getFirst(); link != NULL; link = link->getNext()) { diff --git a/src/Z2AudioLib/Z2SoundObjMgr.cpp b/src/Z2AudioLib/Z2SoundObjMgr.cpp index 45023dccd7..47d0d36c15 100644 --- a/src/Z2AudioLib/Z2SoundObjMgr.cpp +++ b/src/Z2AudioLib/Z2SoundObjMgr.cpp @@ -8,6 +8,7 @@ #include "Z2AudioLib/Z2SeqMgr.h" #include "Z2AudioLib/Z2Calc.h" #include "Z2AudioLib/Z2SceneMgr.h" +#include "Z2AudioLib/Z2LinkMgr.h" /* 802BF920-802BF980 2BA260 0060+00 0/0 1/1 0/0 .text __ct__13Z2SoundObjMgrFv */ Z2SoundObjMgr::Z2SoundObjMgr() : JASGlobalInstance<Z2SoundObjMgr>(this) { diff --git a/src/Z2AudioLib/Z2SpeechMgr2.cpp b/src/Z2AudioLib/Z2SpeechMgr2.cpp index 02a77b8c1c..14647ae15c 100644 --- a/src/Z2AudioLib/Z2SpeechMgr2.cpp +++ b/src/Z2AudioLib/Z2SpeechMgr2.cpp @@ -4,14 +4,12 @@ // #include "Z2AudioLib/Z2SpeechMgr2.h" +#include "Z2AudioLib/Z2AudioMgr.h" +#include "Z2AudioLib/Z2EnvSeMgr.h" #include "Z2AudioLib/Z2SceneMgr.h" #include "Z2AudioLib/Z2SeMgr.h" #include "JSystem/JMath/JMath.h" -// -// Types: -// - typedef struct { const u8* field_0x0; const u8* field_0x4; @@ -60,386 +58,6 @@ struct Z2MdnPrm { static u8 const sDesideTail[8]; }; -/* 802CBC60-802CBCEC 2C65A0 008C+00 0/0 1/1 0/0 .text __ct__12Z2SpeechMgr2Fv */ -Z2SpeechMgr2::Z2SpeechMgr2() : JASGlobalInstance<Z2SpeechMgr2>(true), random(0) { - field_0x3f8 = 0; - field_0x3fa = -1; - field_0x3fc = 0; - field_0x3fe = 0; - field_0x3ff = 0; - field_0x401 = 0; - for (int i = 0; i < 64; i++) { - field_0x402[i] = -1; - } -} - -/* 802CBD88-802CBF60 2C66C8 01D8+00 1/0 1/1 0/0 .text setString__12Z2SpeechMgr2FPCUssUcUs - */ -void Z2SpeechMgr2::setString(u16 const* param_1, s16 param_2, u8 param_3, u16 param_4) { - switch (param_3) { - case 0x13: - case 0x15: - field_0x3fe = 1; - break; - case 0x12: - case 0x14: - field_0x3fe = 2; - break; - case 4: - case '\a': - case '\n': - case 0x16: - case 0x19: - case 0x1d: - case '!': - case '$': - case ')': - case ',': - case '-': - case '2': - case '3': - case '?': - case '@': - case 'A': - case 'S': - case 'T': - case 'U': - case 'Y': - case 'Z': - case '[': - case '\\': - case '`': - case 'a': - case 'b': - case 'c': - case 'd': - field_0x3fe = 12; - break; - case 0x1e: - case 0x1f: - case '\"': - case '%': - case '\'': - case '=': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - field_0x3fe = 13; - break; - case '7': - case '8': - case '9': - case ':': - case ';': - case '<': - case 'l': - case 'm': - field_0x3fe = 14; - break; - case '/': - field_0x3fe = 15; - break; - case 0x0f: - case 0x10: - case '4': - case '5': - case '6': - case 'p': - field_0x3fe = 16; - break; - case 0x0e: - case 'B': - case 'D': - field_0x3fe = 17; - break; - case '\f': - field_0x3fe = 18; - break; - case '\t': - case '&': - case 'o': - field_0x3fe = 30; - break; - case '\b': - field_0x3fe = 31; - break; - case 0: - case 1: - case 2: - case 3: - field_0x3fe = 99; - return; - case 'q': - default: - field_0x3fe = 11; - break; - } - if ((field_0x3fe == 1) || (field_0x3fe == 2)) { - if (param_4 == 0) { - field_0x3fc = 0; - } else { - if (param_4 > 0x11) { - if ((field_0x3fe == 21) || (field_0x3fe == 20)) { - field_0x3fc = 0; - } - } else { - field_0x3fc = param_4 - 1; - } - } - } else { - field_0x3fc = param_4; - } - for (int i = 0; i < 500; i++) { - field_0x10[i] = 0; - } - - if (param_2 > 500) { - field_0x3f8 = 500; - JUT_WARN(387, "TOO MANY TEXT : now(%d) > max(%d)", param_2, 500); - } else { - field_0x3f8 = param_2; - } - for (int i = 0; i < field_0x3f8; i++) { - field_0x10[i] = param_1[i]; - } - field_0x3fa = 0; - field_0x3ff = 0; - field_0x400 = 0; - field_0x401 = 0; - for (int i = 0; i < 64; i++) { - field_0x402[i] = -1; - } - selectUnit(false); -} - -/* 80455EE0-80455EE8 0044E0 0006+02 1/0 0/0 0/0 .sdata2 sBoringTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sBoringTail[6] = { - 0x92, 0x58, 0x59, 0x5B, 0x70, 0x71, -}; - -/* 80455EE8-80455EF0 0044E8 0006+02 1/0 0/0 0/0 .sdata2 sOrderTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sOrderTail[6] = { - 0x60, 0xA8, 0x5B, 0x4E, 0x5D, 0x87, -}; - -/* 80455EF0-80455EF8 0044F0 0005+03 1/0 0/0 0/0 .sdata2 sResentTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sResentTail[5] = { - 0x4A, 0x98, 0x8A, 0x7E, 0x57, -}; - -/* 80455EF8-80455F00 0044F8 0008+00 1/0 0/0 0/0 .sdata2 sCheerfulTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sCheerfulTail[8] = { - 0x60, 0x6D, 0x4D, 0x44, 0x9C, 0x54, 0x70, 0x7B, -}; - -/* 80455F00-80455F08 004500 0005+03 1/0 0/0 0/0 .sdata2 sConfusedTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sConfusedTail[5] = { - 0x2C, 0x42, 0x4C, 0x7C, 0x49, -}; - -/* 80455F08-80455F10 004508 0007+01 1/0 0/0 0/0 .sdata2 sHostilityTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sHostilityTail[7] = { - 0x97, 0x67, 0x94, 0x6A, 0x66, 0x4F, 0x6A, -}; - -/* 80455F10-80455F18 004510 0008+00 1/0 0/0 0/0 .sdata2 sTiredTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sTiredTail[8] = { - 0x66, 0x6F, 0x3B, 0x7A, 0x49, 0x91, 0x5C, 0x6A, -}; - -/* 80455F18-80455F20 004518 0007+01 1/0 0/0 0/0 .sdata2 sSeriousTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sSeriousTail[7] = { - 0x7B, 0x69, 0x4B, 0x61, 0x52, 0x59, 0x87, -}; - -/* 80455F20-80455F28 004520 0007+01 1/0 0/0 0/0 .sdata2 sReplybTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sReplybTail[7] = { - 0x4F, 0x4A, 0xA2, 0x4F, 0x65, 0x98, 0x5C, -}; - -/* 80455F28-80455F30 004528 0008+00 1/0 0/0 0/0 .sdata2 sDesideTail__8Z2MdnPrm */ -u8 const Z2MdnPrm::sDesideTail[8] = { - 0x64, 0x2E, 0x4A, 0x57, 0x80, 0x48, 0x7C, 0x5F, -}; - -/* 802CBF60-802CC190 2C68A0 0230+00 1/0 2/2 0/0 .text setTextCount__12Z2SpeechMgr2Fs */ -void Z2SpeechMgr2::setTextCount(s16 param_0) { - if (field_0x3fe != 0x63) { - field_0x3ff = 0x0; - param_0 = (param_0 == 0) ? 0 : param_0 - 1; - bool bVar1 = false; - if (field_0x3fa == 0 && param_0 >= field_0x3f8) { - bVar1 = true; - } - field_0x3fa = param_0; - if (field_0x3fa >= field_0x3f8) { - field_0x3fa = field_0x3f8; - } - if ((field_0x3fe == 1) || (field_0x3fe == 2)) { - if (!field_0x0.isSoundAttached()) { - speakOneWord(false); - } - } else if (bVar1) { - if (field_0x3fc == 0) { - mSpeech.startSound(0x7a, &field_0x4, NULL, 0, 0.0f, 1.0f, 1.0f, -1.0f, - -1.0f, 0); - } - } else { - if (!isNonVerbal() ) { - JAISoundID aJStack_18; - switch (field_0x3fe) { - case 0xb: - aJStack_18 = Z2SE_SY_TEXT_OUT; - break; - case 0xc: - aJStack_18 = Z2SE_SY_TEXT_OUT_FEMALE; - break; - case 0xd: - aJStack_18 = Z2SE_SY_TEXT_OUT_CHILD; - break; - case 0xe: - aJStack_18 = Z2SE_SY_TEXT_OUT_GORON; - break; - case 0xf: - aJStack_18 = Z2SE_SY_TEXT_OUT_ZORA; - break; - case 0x10: - aJStack_18 = Z2SE_SY_TEXT_OUT_GREY; - break; - case 0x11: - aJStack_18 = Z2SE_SY_TEXT_OUT_SPIRIT; - break; - case 0x12: - aJStack_18 = Z2SE_SY_TEXT_OUT_BRAVE; - break; - case 0x1e: - aJStack_18 = Z2SE_SY_TEXT_OUT_GANON; - break; - case 0x1f: - aJStack_18 = Z2SE_SY_TEXT_OUT_ZANT; - break; - } - mSpeech.startSound(aJStack_18, &field_0x4, NULL, 0, 0.0f, 1.0f, 1.0f, -1.0f, -1.0f, - 0); - } - } - } -} - -/* 802CC190-802CC2FC 2C6AD0 016C+00 1/1 1/1 0/0 .text speakOneWord__12Z2SpeechMgr2Fb */ -void Z2SpeechMgr2::speakOneWord(bool param_0) { - if (Z2GetSceneMgr()->isSceneExist() && (field_0x3fe == 1 || field_0x3fe == 2) && - field_0x400 == 0 && field_0x3ff <= 30) - { - if (field_0x3fa >= field_0x3f8) { - selectTail(); - field_0x400 = 1; - } else if (isNonVerbal()) { - return; - } - u32 sound = field_0x3fc + 0x500a1; - f32 fVar1 = Z2GetSceneMgr()->getRoomReverb() / 127.0f; - mSpeech.startSound(sound, &field_0x0, NULL, 0, - fVar1, 1.0f, 1.0f, -1.0f, -1.0f, 0); - mSpeech.setPortData(&field_0x0, 8, field_0x402[field_0x401 - 1] + 1, -1); - if (field_0x400 == 0) { - selectUnit(param_0); - } - } -} - - -/* 802CC2FC-802CC4C0 2C6C3C 01C4+00 2/2 0/0 0/0 .text isNonVerbal__12Z2SpeechMgr2Fv */ -bool Z2SpeechMgr2::isNonVerbal() { - switch(field_0x10[field_0x3fa]) { - case 0: - case 0x20: - case 0x21: - case 0x22: - case 0x23: - case 0x24: - case 0x25: - case 0x26: - case 0x27: - case 0x28: - case 0x29: - case 0x2a: - case 0x2b: - case 0x2c: - case 0x2d: - case 0x2e: - case 0x2f: - case 0x3a: - case 0x3b: - case 0x3c: - case 0x3d: - case 0x3e: - case 0x3f: - case 0x4b: - case 0x4c: - case 0x4d: - case 0x4e: - case 0x4f: - case 0x5b: - case 0x5c: - case 0x5d: - case 0x5e: - case 0x5f: - case 0x813f: - case 0x8140: - case 0x8141: - case 0x8142: - case 0x8143: - case 0x8144: - case 0x8145: - case 0x8146: - case 0x8147: - case 0x8148: - case 0x8149: - case 0x814a: - case 0x814b: - case 0x8151: - case 0x815e: - case 0x8162: - case 0x8166: - case 0x8168: - case 0x8169: - case 0x816a: - case 0x816d: - case 0x816e: - case 0x816f: - case 0x8170: - case 0x8171: - case 0x8172: - case 0x8175: - case 0x8176: - case 0x817b: - case 0x817c: - case 0x8181: - case 0x818f: - case 0x8190: - case 0x8193: - case 0x8194: - case 0x8195: - case 0x8196: - return true; - } - - if(field_0x10[field_0x3fa] == 10) { - switch (field_0x3fe) { - case 1: - case 2: - return false; - default: - return true; - } - } - return false; -} - /* 8039C260-8039C2C4 0288C0 0064+00 1/0 0/0 0/0 .rodata sReply__8Z2MdnPrm */ u8 const Z2MdnPrm::sReply[100] = { 0x6A, 0x8A, 0x50, 0x5F, 0x53, 0x37, 0x37, 0x4F, 0x4F, 0x5E, 0xAA, 0x46, 0x52, 0x5A, 0x5A, @@ -514,6 +132,11 @@ u8 const Z2MdnPrm::sBoring[108] = { 0x5B, 0x5E, 0x70, 0x56, 0x56, 0x4C, 0x4C, 0x59, 0x59, 0x5B, 0x5B, 0x71, }; +/* 80455EE0-80455EE8 0044E0 0006+02 1/0 0/0 0/0 .sdata2 sBoringTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sBoringTail[6] = { + 0x92, 0x58, 0x59, 0x5B, 0x70, 0x71, +}; + /* 8039C48C-8039C4EC 028AEC 005E+02 1/0 0/0 0/0 .rodata sIrritated__8Z2MdnPrm */ u8 const Z2MdnPrm::sIrritated[94] = { 0x6C, 0x91, 0x67, 0x8B, 0x8B, 0xA2, 0xA2, 0xAB, 0x48, 0x64, 0x73, 0x61, 0x61, 0x64, 0x64, 0x6D, @@ -541,6 +164,11 @@ u8 const Z2MdnPrm::sOrder[114] = { 0x48, 0x48, 0x69, 0x69, 0x6D, 0x6D, 0x94, 0x94, 0x97, }; +/* 80455EE8-80455EF0 0044E8 0006+02 1/0 0/0 0/0 .sdata2 sOrderTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sOrderTail[6] = { + 0x60, 0xA8, 0x5B, 0x4E, 0x5D, 0x87, +}; + /* 8039C56C-8039C5D8 028BCC 006A+02 1/0 0/0 0/0 .rodata sResent__8Z2MdnPrm */ u8 const Z2MdnPrm::sResent[106] = { 0x6F, 0x5F, 0x5F, 0x66, 0x66, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x4B, 0x4B, 0x6B, 0x6B, 0x86, @@ -552,6 +180,11 @@ u8 const Z2MdnPrm::sResent[106] = { 0x5E, 0xAA, 0xAA, 0x9E, 0x9E, 0x5A, 0x5A, 0x57, 0x57, 0x57, }; +/* 80455EF0-80455EF8 0044F0 0005+03 1/0 0/0 0/0 .sdata2 sResentTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sResentTail[5] = { + 0x4A, 0x98, 0x8A, 0x7E, 0x57, +}; + /* 8039C5D8-8039C644 028C38 006A+02 1/0 0/0 0/0 .rodata sCheerful__8Z2MdnPrm */ u8 const Z2MdnPrm::sCheerful[106] = { 0x64, 0x6D, 0x6D, 0x6D, 0x99, 0x6D, 0x40, 0x51, 0x51, 0x6F, 0x6F, 0x66, 0x66, 0x60, 0xA7, 0xAF, @@ -563,6 +196,11 @@ u8 const Z2MdnPrm::sCheerful[106] = { 0x65, 0x70, 0x6B, 0x6B, 0x6B, 0x6D, 0x6D, 0x57, 0x57, 0x7B, }; +/* 80455EF8-80455F00 0044F8 0008+00 1/0 0/0 0/0 .sdata2 sCheerfulTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sCheerfulTail[8] = { + 0x60, 0x6D, 0x4D, 0x44, 0x9C, 0x54, 0x70, 0x7B, +}; + /* 8039C644-8039C6B0 028CA4 006A+02 1/0 0/0 0/0 .rodata sConfused__8Z2MdnPrm */ u8 const Z2MdnPrm::sConfused[106] = { 0x83, 0x80, 0x80, 0x82, 0x82, 0x82, 0x82, 0x5B, 0x75, 0x84, 0x84, 0x84, 0x84, 0x75, 0x75, 0x62, @@ -574,6 +212,11 @@ u8 const Z2MdnPrm::sConfused[106] = { 0x38, 0x38, 0x38, 0x83, 0x83, 0x8E, 0x8E, 0x4C, 0x56, 0x56, }; +/* 80455F00-80455F08 004500 0005+03 1/0 0/0 0/0 .sdata2 sConfusedTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sConfusedTail[5] = { + 0x2C, 0x42, 0x4C, 0x7C, 0x49, +}; + /* 8039C6B0-8039C718 028D10 0068+00 1/0 0/0 0/0 .rodata sHostility__8Z2MdnPrm */ u8 const Z2MdnPrm::sHostility[104] = { 0x85, 0x71, 0x71, 0x73, 0x73, 0x3B, 0x62, 0x84, 0x94, 0x94, 0x94, 0xAF, 0x98, 0xAD, 0xAD, @@ -585,6 +228,11 @@ u8 const Z2MdnPrm::sHostility[104] = { 0x62, 0x6A, 0x5F, 0x72, 0x72, 0x62, 0x62, 0x65, 0x5E, 0x69, 0x69, 0x63, 0x63, 0x7F, }; +/* 80455F08-80455F10 004508 0007+01 1/0 0/0 0/0 .sdata2 sHostilityTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sHostilityTail[7] = { + 0x97, 0x67, 0x94, 0x6A, 0x66, 0x4F, 0x6A, +}; + /* 8039C718-8039C784 028D78 006A+02 1/0 0/0 0/0 .rodata sTired__8Z2MdnPrm */ u8 const Z2MdnPrm::sTired[106] = { 0x70, 0x70, 0x70, 0x5C, 0x5C, 0x5C, 0x6F, 0x6F, 0x6F, 0x93, 0x8C, 0x9A, 0x9D, 0x89, 0x99, 0x7A, @@ -596,6 +244,11 @@ u8 const Z2MdnPrm::sTired[106] = { 0x84, 0x6D, 0x6D, 0x6A, 0x6A, 0x8D, 0x8D, 0x8D, 0x8D, 0x3B, }; +/* 80455F10-80455F18 004510 0008+00 1/0 0/0 0/0 .sdata2 sTiredTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sTiredTail[8] = { + 0x66, 0x6F, 0x3B, 0x7A, 0x49, 0x91, 0x5C, 0x6A, +}; + /* 8039C784-8039C7F0 028DE4 006A+02 1/0 0/0 0/0 .rodata sSerious__8Z2MdnPrm */ u8 const Z2MdnPrm::sSerious[106] = { 0x52, 0x65, 0x65, 0x72, 0x5A, 0x61, 0x61, 0x7B, 0x80, 0x92, 0x93, 0x9D, 0x9D, 0x70, 0x79, 0x76, @@ -607,6 +260,11 @@ u8 const Z2MdnPrm::sSerious[106] = { 0x70, 0x60, 0x3C, 0x81, 0x81, 0x92, 0x92, 0x8E, 0x98, 0x87, }; +/* 80455F18-80455F20 004518 0007+01 1/0 0/0 0/0 .sdata2 sSeriousTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sSeriousTail[7] = { + 0x7B, 0x69, 0x4B, 0x61, 0x52, 0x59, 0x87, +}; + /* 8039C7F0-8039C844 028E50 0054+00 1/0 0/0 0/0 .rodata sReplyb__8Z2MdnPrm */ u8 const Z2MdnPrm::sReplyb[84] = { 0x5C, 0x45, 0x45, 0x71, 0x9F, 0x57, 0xB4, 0xB4, 0x56, 0x62, 0x8E, 0x61, 0x61, 0xB0, @@ -617,6 +275,11 @@ u8 const Z2MdnPrm::sReplyb[84] = { 0x44, 0x4F, 0x52, 0x58, 0x5A, 0x6F, 0x6E, 0x8A, 0x8E, 0x8E, 0x8E, 0x8C, 0x8C, 0x9B, }; +/* 80455F20-80455F28 004520 0007+01 1/0 0/0 0/0 .sdata2 sReplybTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sReplybTail[7] = { + 0x4F, 0x4A, 0xA2, 0x4F, 0x65, 0x98, 0x5C, +}; + /* 8039C844-8039C8A8 028EA4 0064+00 1/0 0/0 0/0 .rodata sApologize__8Z2MdnPrm */ u8 const Z2MdnPrm::sApologize[100] = { 0x6A, 0x6A, 0x6A, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x57, 0x57, 0x57, 0x63, 0x61, @@ -644,6 +307,11 @@ u8 const Z2MdnPrm::sDeside[100] = { 0x75, 0x6A, 0x66, 0x76, 0x69, 0x69, 0x69, 0x60, 0x60, 0x5F, }; +/* 80455F28-80455F30 004528 0008+00 1/0 0/0 0/0 .sdata2 sDesideTail__8Z2MdnPrm */ +u8 const Z2MdnPrm::sDesideTail[8] = { + 0x64, 0x2E, 0x4A, 0x57, 0x80, 0x48, 0x7C, 0x5F, +}; + /* 8039C918-8039C980 028F78 0068+00 1/0 0/0 0/0 .rodata sAfford__8Z2MdnPrm */ u8 const Z2MdnPrm::sAfford[104] = { 0x4E, 0x45, 0x52, 0x5B, 0x56, 0x5B, 0x59, 0x52, 0x52, 0x57, 0x5C, 0x50, 0x50, 0x49, 0x80, @@ -681,74 +349,472 @@ sPrmStruct const Z2MdnPrm::sPrm[17] = { { Z2MdnPrm::sAfford, Z2MdnPrm::sAffordTail, 0x34, 0x02, 0x0A, 0x00}, }; +/* 802CBC60-802CBCEC 2C65A0 008C+00 0/0 1/1 0/0 .text __ct__12Z2SpeechMgr2Fv */ +Z2SpeechMgr2::Z2SpeechMgr2() : JASGlobalInstance<Z2SpeechMgr2>(true), random(0) { + mTextNum = 0; + mTextCount = -1; + mMood = 0; + mVoice = 0; + field_0x3ff = 0; + field_0x401 = 0; + for (int i = 0; i < 64; i++) { + field_0x402[i] = -1; + } +} + +/* 802CBD88-802CBF60 2C66C8 01D8+00 1/0 1/1 0/0 .text setString__12Z2SpeechMgr2FPCUssUcUs + */ +void Z2SpeechMgr2::setString(u16 const* i_text, s16 i_textNum, u8 i_speaker, u16 i_mood) { + switch (i_speaker) { + case 0x13: + case 0x15: + mVoice = 1; + break; + case 0x12: + case 0x14: + mVoice = 2; + break; + case 0x04: + case 0x07: + case 0x0a: + case 0x16: + case 0x19: + case 0x1d: + case 0x21: + case 0x24: + case 0x29: + case 0x2c: + case 0x2d: + case 0x32: + case 0x33: + case 0x3f: + case 0x40: + case 0x41: + case 0x53: + case 0x54: + case 0x55: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5c: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + mVoice = 12; + break; + case 0x1e: + case 0x1f: + case 0x22: + case 0x25: + case 0x27: + case 0x3d: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6a: + mVoice = 13; + break; + case 0x37: + case 0x38: + case 0x39: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x6c: + case 0x6d: + mVoice = 14; + break; + case 0x2f: + mVoice = 15; + break; + case 0x0f: + case 0x10: + case 0x34: + case 0x35: + case 0x36: + case 0x70: + mVoice = 16; + break; + case 0x0e: + case 0x42: + case 0x44: + mVoice = 17; + break; + case 0x0c: + mVoice = 18; + break; + case 0x09: + case 0x26: + case 0x6f: + mVoice = 30; + break; + case 0x08: + mVoice = 31; + break; + case 0x00: + case 0x01: + case 0x02: + case 0x03: + mVoice = 99; + return; + case 0x71: + default: + mVoice = 11; + break; + } + + if (mVoice == 1 || mVoice == 2) { + if (i_mood == 0) { + mMood = 0; + } else { + if (i_mood > 17) { + if ((mVoice == 21) || (mVoice == 20)) { + mMood = 0; + } + } else { + mMood = i_mood - 1; + } + } + } else { + mMood = i_mood; + } + + for (int i = 0; i < 500; i++) { + mText[i] = 0; + } + + if (i_textNum > 500) { + mTextNum = 500; + JUT_WARN(387, "TOO MANY TEXT : now(%d) > max(%d)", param_2, 500); + } else { + mTextNum = i_textNum; + } + + for (int i = 0; i < mTextNum; i++) { + mText[i] = i_text[i]; + } + + mTextCount = 0; + field_0x3ff = 0; + field_0x400 = 0; + field_0x401 = 0; + + for (int i = 0; i < 64; i++) { + field_0x402[i] = -1; + } + + selectUnit(false); +} + +/* 802CBF60-802CC190 2C68A0 0230+00 1/0 2/2 0/0 .text setTextCount__12Z2SpeechMgr2Fs */ +void Z2SpeechMgr2::setTextCount(s16 i_textCount) { + if (mVoice != 99) { + field_0x3ff = 0x0; + i_textCount = (i_textCount == 0) ? 0 : i_textCount - 1; + bool all_text = false; + if (mTextCount == 0 && i_textCount >= mTextNum) { + all_text = true; + } + mTextCount = i_textCount; + if (mTextCount >= mTextNum) { + mTextCount = mTextNum; + } + if (mVoice == 1 || mVoice == 2) { + if (!field_0x0.isSoundAttached()) { + speakOneWord(false); + } + } else if (all_text) { + if (mMood == 0) { + mSpeech.startSound(Z2SE_SY_TEXT_DISP_ALL, &field_0x4, NULL, 0, 0.0f, 1.0f, 1.0f, + -1.0f, -1.0f, 0); + } + } else { + if (!isNonVerbal()) { + JAISoundID sound_id; + switch (mVoice) { + case 0xb: + sound_id = Z2SE_SY_TEXT_OUT; + break; + case 0xc: + sound_id = Z2SE_SY_TEXT_OUT_FEMALE; + break; + case 0xd: + sound_id = Z2SE_SY_TEXT_OUT_CHILD; + break; + case 0xe: + sound_id = Z2SE_SY_TEXT_OUT_GORON; + break; + case 0xf: + sound_id = Z2SE_SY_TEXT_OUT_ZORA; + break; + case 0x10: + sound_id = Z2SE_SY_TEXT_OUT_GREY; + break; + case 0x11: + sound_id = Z2SE_SY_TEXT_OUT_SPIRIT; + break; + case 0x12: + sound_id = Z2SE_SY_TEXT_OUT_BRAVE; + break; + case 0x1e: + sound_id = Z2SE_SY_TEXT_OUT_GANON; + break; + case 0x1f: + sound_id = Z2SE_SY_TEXT_OUT_ZANT; + break; + } + mSpeech.startSound(sound_id, &field_0x4, NULL, 0, 0.0f, 1.0f, 1.0f, -1.0f, -1.0f, + 0); + } + } + } +} + +/* 802CC190-802CC2FC 2C6AD0 016C+00 1/1 1/1 0/0 .text speakOneWord__12Z2SpeechMgr2Fb */ +void Z2SpeechMgr2::speakOneWord(bool param_0) { + if (Z2GetSceneMgr()->isSceneExist() && (mVoice == 1 || mVoice == 2) && + field_0x400 == 0 && field_0x3ff <= 30) + { + if (mTextCount >= mTextNum) { + selectTail(); + field_0x400 = 1; + } else if (isNonVerbal()) { + return; + } + u32 sound = mMood + Z2SE_HYL_MDN_RPLY; + f32 fVar1 = Z2GetSceneMgr()->getRoomReverb() / 127.0f; + mSpeech.startSound(sound, &field_0x0, NULL, 0, + fVar1, 1.0f, 1.0f, -1.0f, -1.0f, 0); + mSpeech.setPortData(&field_0x0, 8, field_0x402[field_0x401 - 1] + 1, -1); + if (field_0x400 == 0) { + selectUnit(param_0); + } + } +} + +/* 802CC2FC-802CC4C0 2C6C3C 01C4+00 2/2 0/0 0/0 .text isNonVerbal__12Z2SpeechMgr2Fv */ +bool Z2SpeechMgr2::isNonVerbal() { + switch(mText[mTextCount]) { + case 0: + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2a: + case 0x2b: + case 0x2c: + case 0x2d: + case 0x2e: + case 0x2f: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: + case 0x813f: + case 0x8140: + case 0x8141: + case 0x8142: + case 0x8143: + case 0x8144: + case 0x8145: + case 0x8146: + case 0x8147: + case 0x8148: + case 0x8149: + case 0x814a: + case 0x814b: + case 0x8151: + case 0x815e: + case 0x8162: + case 0x8166: + case 0x8168: + case 0x8169: + case 0x816a: + case 0x816d: + case 0x816e: + case 0x816f: + case 0x8170: + case 0x8171: + case 0x8172: + case 0x8175: + case 0x8176: + case 0x817b: + case 0x817c: + case 0x8181: + case 0x818f: + case 0x8190: + case 0x8193: + case 0x8194: + case 0x8195: + case 0x8196: + return true; + } + + if(mText[mTextCount] == 0x0a) { + switch (mVoice) { + case 1: + case 2: + return false; + default: + return true; + } + } + return false; +} + typedef struct { - u8 field_0x0; + s8 field_0x0; u8 field_0x1; } Z2ConnectCost; /* 802CC4C0-802CC738 2C6E00 0278+00 2/2 0/0 0/0 .text selectUnit__12Z2SpeechMgr2Fb */ -// NONMATCHING This one is a mess +// NONMATCHING minor regalloc void Z2SpeechMgr2::selectUnit(bool param_0) { - Z2ConnectCost local_3c[5]; + Z2ConnectCost cost[5]; + if (field_0x401 >= 64) { field_0x0->stop(); - } else { - int best = random.get_uint8(Z2MdnPrm::sPrm[field_0x3fc].field_0x8); - - if (field_0x401 != 0 && param_0) { - int cVar5 = 0; - int ZVar2 = field_0x402[field_0x401 - 1]; - - do { - bool bVar1; - int ZVar3; - do { - do { - bVar1 = false; - ZVar3 = random.get_uint8(Z2MdnPrm::sPrm[field_0x3fc].field_0x8); - for (int iVar4 = 0; iVar4 < field_0x401; iVar4++) { - if (ZVar3 == field_0x402[iVar4]) { - bVar1 = true; - break; - } - } - } while (bVar1); - for (int iVar4 = 0; iVar4 < cVar5; iVar4++) { - if (ZVar3 == local_3c[iVar4].field_0x0) { - bVar1 = true; - break; - } + return; + } + + s8 ZVar2 = random.get_uint8(Z2MdnPrm::sPrm[mMood].field_0x8); + s8 ZVar3; + s8 cVar5; + + if (field_0x401 != 0 && param_0) { + cVar5 = 0; + ZVar2 = field_0x402[field_0x401 - 1]; + + while (true) { + bool bVar1 = false; + ZVar3 = random.get_uint8(Z2MdnPrm::sPrm[mMood].field_0x8); + + for (int i = 0; i < field_0x401; i++) { + if (field_0x402[i] == ZVar3) { + bVar1 = true; + break; + } + } + + if (bVar1) { + continue; + } + + for (int i = 0; i < cVar5; i++) { + if (ZVar3 == cost[i].field_0x0) { + bVar1 = true; + break; + } + } + + if (bVar1) { + continue; + } + + u8 local_3f = JMAAbs(Z2MdnPrm::sPrm[mMood].field_0x0[ZVar3 * 2] + - Z2MdnPrm::sPrm[mMood].field_0x0[ZVar2 * 2 + 1]); + cost[cVar5] = (Z2ConnectCost){ZVar3, local_3f}; + cVar5++; + + if (cVar5 == 5) { + u16 tmp = cost[0].field_0x1; + ZVar2 = cost[0].field_0x0; + for (int i = 0; i < 5; i++) { + if (cost[i].field_0x1 < tmp) { + tmp = cost[i].field_0x1; + ZVar2 = cost[i].field_0x0; } - } while (bVar1); - u8 diff = JMAAbs(Z2MdnPrm::sPrm[field_0x3fc].field_0x0[ZVar3 * 2] - - Z2MdnPrm::sPrm[field_0x3fc].field_0x0[ZVar2 * 2 + 1]); - local_3c[cVar5] = (Z2ConnectCost){ZVar3, diff}; - cVar5++; - } while ((s8)cVar5 != 5); - - best = local_3c[0].field_0x0; - u16 min = local_3c[0].field_0x1; - for (int iVar4 = 0; iVar4 < 5; iVar4++) { - if (local_3c[iVar4].field_0x1 < min) { - min = local_3c[iVar4].field_0x1; - best = local_3c[iVar4].field_0x0; } + break; } } - - field_0x402[field_0x401] = best; - field_0x401++; } + + field_0x402[field_0x401] = ZVar2; + field_0x401++; } /* 802CC738-802CC9D0 2C7078 0298+00 1/1 0/0 0/0 .text selectTail__12Z2SpeechMgr2Fv */ +// NONMATCHING minor regalloc void Z2SpeechMgr2::selectTail() { - // NONMATCHING + Z2ConnectCost cost[5]; + s8 cVar9 = 0; + s8 ZVar1 = field_0x402[field_0x401 - 1]; + s8 ZVar6; + u8 bVar3; + + while (true) { + bool bVar5 = false; + + switch (mVoice) { + case 2: + bVar3 = Z2MdnPrm::sPrm[mMood].field_0x9; + ZVar6 = random.get_uint8(bVar3); + break; + case 1: + bVar3 = Z2MdnPrm::sPrm[mMood].field_0xa; + ZVar6 = Z2MdnPrm::sPrm[mMood].field_0x9 + random.get_uint8(bVar3); + break; + default: + return; + } + + for (int i = 0; i < cVar9; i++) { + if (ZVar6 == cost[i].field_0x0) { + bVar5 = true; + break; + } + } + + if (!bVar5) { + u8 local_3f = JMAAbs(Z2MdnPrm::sPrm[mMood].field_0x4[ZVar6] + - Z2MdnPrm::sPrm[mMood].field_0x0[ZVar1 * 2 + 1]); + cost[cVar9] = (Z2ConnectCost){ZVar6, local_3f}; + cVar9++; + + if (cVar9 == bVar3 || cVar9 == 5) { + s8 tmp_r8; + u16 tmp_r9 = cost[0].field_0x1; + tmp_r8 = cost[0].field_0x0; + int local_3c = bVar3 >= 5 ? 5 : bVar3; + for (int i = 0; i < local_3c; i++) { + if (cost[i].field_0x1 < tmp_r9) { + tmp_r9 = cost[i].field_0x1; + tmp_r8 = cost[i].field_0x0; + } + } + field_0x402[field_0x401 - 1] = tmp_r8 + Z2MdnPrm::sPrm[mMood].field_0x8; + return; + } + } + } } /* 802CC9D0-802CCA18 2C7310 0048+00 0/0 1/1 0/0 .text framework__12Z2SpeechMgr2Fv */ void Z2SpeechMgr2::framework() { - switch (field_0x3fe) { + switch (mVoice) { case 1: case 2: if (field_0x0) { @@ -757,7 +823,7 @@ void Z2SpeechMgr2::framework() { return; } } else { - field_0x3fa = 0; + mTextCount = 0; } break; } @@ -765,13 +831,163 @@ void Z2SpeechMgr2::framework() { /* 802CCA18-802CCF88 2C7358 0570+00 0/0 2/2 0/0 .text playOneShotVoice__12Z2SpeechMgr2FUcUsP3VecSc */ -void Z2SpeechMgr2::playOneShotVoice(u8 param_0, u16 param_1, Vec* param_2, s8 param_3) { - // NONMATCHING +void Z2SpeechMgr2::playOneShotVoice(u8 i_speaker, u16 param_1, Vec* i_pos, s8 param_3) { + if (i_speaker == 0) { + return; + } + + f32 fxmix = Z2GetSceneMgr()->getRoomReverb() / 127.0f; + + if (mVoice == 1 || mVoice == 2) { + JAISoundID sound_id; + switch (param_1) { + case 25: + sound_id = Z2SE_MSG_V_MDN_D21; + break; + case 30: + sound_id = Z2SE_MSG_V_MDN_LAUGH_30; + break; + case 31: + sound_id = Z2SE_MSG_V_MDN_LAUGH_31; + break; + case 32: + sound_id = Z2SE_MSG_V_MDN_LAUGH_32; + break; + case 100: + sound_id = Z2SE_MSG_V_A_MDN_1; + break; + case 101: + sound_id = Z2SE_MSG_V_A_MDN_2; + break; + case 102: + sound_id = Z2SE_MSG_V_A_MDN_102; + break; + case 103: + sound_id = Z2SE_MSG_V_A_MDN_103; + break; + case 104: + sound_id = Z2SE_MSG_V_A_MDN_104; + break; + default: + return; + } + + if (sound_id != -1) { + mSpeech.startSound(sound_id, &field_0x0, (JGeometry::TVec3<f32>*)i_pos, + i_speaker, fxmix, 1.0f, 1.0f, -1.0f, -1.0f, 0); + } + + } else { + JAISoundID sound_id = Z2SE_MESSAGE_SE_COMMON; + switch (i_speaker) { + case 3: + if (param_1 == 1) { + Z2GetSeqMgr()->subBgmStart(Z2BGM_ITEM_GET_MINI); + return; + } + break; + case 30: + if (param_1 == 15) { + sound_id = Z2SE_TAMABE_V_TUTO_BIKKURI; + } + break; + case 29: + if (param_1 == 4) { + sound_id = Z2SE_KYURY_MV_ZEKKU; + } else if (param_1 == 5) { + sound_id = Z2SE_KYURY_MV_WORRY; + } + break; + case 32: + if (param_1 == 6) { + sound_id = Z2SE_MOI_MV_WOUND_UMEKI; + } + break; + case 35: + if (param_1 == 10) { + sound_id = Z2SE_HANJO_MV_CRY; + } + break; + case 37: + if (param_1 == 10) { + sound_id = Z2SE_BESU_MV_DOUYOU; + } + break; + case 47: + if (param_1 == 15) { + sound_id = Z2SE_ZRA_MV_WOUND_BREATH; + } else if (param_1 == 17) { + sound_id = Z2SE_ZRA_MV_WOUND_COUGH; + } + break; + case 69: + if (param_1 == 1) { + sound_id = Z2SE_MSG_V_CAT; + } else if (param_1 == 2) { + sound_id = Z2SE_MSG_V_PERU; + } + break; + case 70: + if (param_1 == 1) { + sound_id = Z2SE_MSG_V_DOG; + } + break; + case 71: + if (param_1 == 1) { + sound_id = Z2SE_MSG_V_KOKKO; + } + break; + case 72: + if (param_1 == 1) { + sound_id = Z2SE_MSG_V_SQUIRREL; + } + break; + case 73: + if (param_1 == 1) { + sound_id = Z2SE_MSG_V_MONKEY; + } + break; + case 74: + if (param_1 == 1) { + sound_id = Z2SE_MSG_V_FROG; + } + break; + case 107: + if (param_1 == 1) { + sound_id = Z2SE_MSG_V_MYNA; + } + break; + case 113: + if (param_1 == 1) { + sound_id = Z2SE_HS_V_CRY_UMAKUSA; + } + break; + case 112: + if (param_1 == 1) { + sound_id = Z2SE_TKJ_V_SHOP_TALK; + } + break; + case 38: + if (param_1 == 4) { + sound_id = Z2SE_D21V_MDN_HATTOSURU; + } + break; + } + + if (field_0x0) { + field_0x0.releaseSound(); + } + mSpeech.startSound(sound_id, &field_0x0, (JGeometry::TVec3<f32>*)i_pos, i_speaker, + fxmix, 1.0f, 1.0f, -1.0f, -1.0f, 0); + if (field_0x0) { + mSpeech.setPortData(&field_0x0, 8, param_1, -1); + } + } } /* 802CCF88-802CCFB8 2C78C8 0030+00 0/0 1/1 0/0 .text isMidnaSpeak__12Z2SpeechMgr2Fv */ bool Z2SpeechMgr2::isMidnaSpeak() { - if ((field_0x3fe == 1 || field_0x3fe == 2) && field_0x0) { + if ((mVoice == 1 || mVoice == 2) && field_0x0) { return true; } return false; @@ -782,9 +998,50 @@ Z2SpeechStarter::Z2SpeechStarter() : Z2SoundStarter(false) {} /* 802CCFF8-802CD248 2C7938 0250+00 1/0 0/0 0/0 .text * startSound__15Z2SpeechStarterF10JAISoundIDP14JAISoundHandlePCQ29JGeometry8TVec3<f>UlfffffUl */ -bool Z2SpeechStarter::startSound(JAISoundID param_0, JAISoundHandle* param_1, - JGeometry::TVec3<f32> const* param_2, u32 param_3, f32 param_4, - f32 param_5, f32 param_6, f32 param_7, f32 param_8, - u32 param_9) { - // NONMATCHING +bool Z2SpeechStarter::startSound(JAISoundID i_soundID, JAISoundHandle* i_handle, + JGeometry::TVec3<f32> const* i_pos, u32 param_3, f32 i_fxmix, + f32 i_pitch, f32 i_volume, f32 i_pan, f32 i_dolby, u32 i_count) { + if (Z2GetSceneMgr()->isInDarkness() && Z2GetSceneMgr()->getDemoSeWaveNum() != 0x77 + && Z2GetSceneMgr()->getDemoSeWaveNum() != 0x78) { + i_fxmix = 1.0f; + } else { + f32 tmp = Z2GetStatusMgr()->getCameraInWaterDepthRatio() > 0.0f; + if (tmp) { + i_fxmix = tmp; + } else if (Z2GetSceneMgr()->getDemoSeWaveNum() == 0x6c + || Z2GetSceneMgr()->getDemoSeWaveNum() == 0x77) + { + i_fxmix = 0.07f; + } else { + i_fxmix += Z2GetEnvSeMgr()->getFogDensity() * 0.5f; + if (i_fxmix > 1.0f) { + i_fxmix = 1.0f; + } + } + } + + bool ret = Z2GetAudioMgr()->startSound(i_soundID, i_handle, i_pos); + + if (*i_handle) { + if (param_3 != 0) { + setPortData(i_handle, 6, param_3, -1); + } + if (i_fxmix > 0.0f) { + (*i_handle)->getAuxiliary().moveFxMix(i_fxmix, i_count); + } + if (i_pitch != 1.0f) { + (*i_handle)->getAuxiliary().movePitch(i_pitch, i_count); + } + if (i_volume != 1.0f) { + (*i_handle)->getAuxiliary().moveVolume(i_volume, i_count); + } + if (i_pan != -1.0f) { + (*i_handle)->getAuxiliary().movePan(i_pan, i_count); + } + if (i_dolby != -1.0f) { + (*i_handle)->getAuxiliary().moveDolby(i_dolby, i_count); + } + } + + return ret; } |
