// // Generated by dtk // Translation Unit: d_camera.cpp // #include "d/d_camera.h" #include "d/d_bg_s_gnd_chk.h" #include "d/d_bg_s_lin_chk.h" #include "d/d_bg_s_sph_chk.h" #include "SSystem/SComponent/c_bg_s.h" #include "d/d_com_inf_game.h" #include "dolphin/types.h" #include "SSystem/SComponent/c_math.h" #include "d/actor/d_a_obj_pirateship.h" #include "m_Do/m_Do_controller_pad.h" #include "f_op/f_op_camera.h" #include "f_op/f_op_camera_mng.h" #include "d/d_com_lib_game.h" #include "m_Do/m_Do_graphic.h" #include "f_ap/f_ap_game.h" #include "d/actor/d_a_npc_md.h" #include "d/actor/d_a_npc_kamome.h" #include "d/d_procname.h" #include "d/d_demo.h" #include "d/actor/d_a_sea.h" #include "m_Do/m_Do_lib.h" #include "m_Do/m_Do_machine.h" #include "f_op/f_op_overlap_mng.h" #include "d/d_a_obj.h" #include "d/actor/d_a_tsubo.h" #include "d/actor/d_a_npc_cb1.h" #include "weak_bss_936_to_1036.h" // IWYU pragma: keep #include "weak_data_1811.h" // IWYU pragma: keep namespace { static f32 limitf(f32 value, f32 min, f32 max) { if (value > max) { return max; } else if (value < min) { return min; } return value; } inline static bool is_player(fopAc_ac_c* actor) { return fopAcM_GetName(actor) == PROC_PLAYER; } inline static bool isPlayerGuarding(u32 param_0) { return dComIfGp_checkPlayerStatus1(param_0, daPyStts1_UNK80000_e) || daNpc_Md_c::isMirror(); } inline static bool isPlayerFlying(u32 param_0) { return dComIfGp_checkPlayerStatus1(param_0, daPyStts1_DEKU_LEAF_FLY_e) || daNpc_Cb1_c::isFlying() || daNpc_Md_c::isFlying(); } inline static fopAc_ac_c* get_boomerang_actor(fopAc_ac_c* actor) { if (is_player(actor)) { daPy_py_c* link = (daPy_py_c*)actor; return fopAcM_SearchByID(link->getThrowBoomerangID()); } else { return NULL; } } inline static bool push_any_key(u32 padId) { if (g_mDoCPd_cpadInfo[padId].mMainStickValue > 0.001f) { return true; } if (g_mDoCPd_cpadInfo[padId].mCStickValue > 0.001f) { return true; } if (*(u16*)&g_mDoCPd_cpadInfo[padId].mButtonHold) { return true; } return false; } inline static int get_camera_id(camera_class* i_camera) { return fopCamM_GetParam(i_camera); } inline static int get_controller_id(camera_class* i_camera) { return dComIfGp_getCameraPlayer1ID(get_camera_id(i_camera)); } inline static dDlst_window_c* get_window(int param_0) { return dComIfGp_getWindow(dComIfGp_getCameraWinID(param_0)); } inline static dDlst_window_c* get_window(camera_class* i_camera) { return dComIfGp_getWindow(dComIfGp_getCameraWinID(get_camera_id(i_camera))); } inline static fopAc_ac_c* get_player_actor(camera_class* i_camera) { return dComIfGp_getPlayer(dComIfGp_getCameraPlayer1ID(get_camera_id(i_camera))); } inline static u32 check_owner_action(u32 param_0, u32 param_1) { return dComIfGp_checkPlayerStatus0(param_0, param_1); } inline static u32 check_owner_action1(u32 param_0, u32 param_1) { return dComIfGp_checkPlayerStatus1(param_0, param_1); } inline static void setComStat(u32 param_0) { dComIfGp_onCameraAttentionStatus(0, param_0); } inline static void clrComStat(u32 param_0) { dComIfGp_offCameraAttentionStatus(0, param_0); } inline static bool getComStat(u32 param_0) { return dComIfGp_getCameraAttentionStatus(0) & param_0; } inline static void setComZoomScale(f32 param_0) { dComIfGp_setCameraZoomScale(0, param_0); } inline static void setComZoomForcus(f32 param_0) { dComIfGp_setCameraZoomForcus(0, param_0); } } // namespace engine_fn dCamera_c::engine_tbl[] = { &dCamera_c::letCamera, &dCamera_c::followCamera, &dCamera_c::lockonCamera, &dCamera_c::talktoCamera, &dCamera_c::subjectCamera, &dCamera_c::fixedPositionCamera, &dCamera_c::fixedFrameCamera, &dCamera_c::towerCamera, &dCamera_c::rideCamera, &dCamera_c::hungCamera, &dCamera_c::manualCamera, &dCamera_c::eventCamera, &dCamera_c::crawlCamera, &dCamera_c::hookshotCamera, &dCamera_c::tornadoCamera, &dCamera_c::vomitCamera, &dCamera_c::shieldCamera, &dCamera_c::nonOwnerCamera, &dCamera_c::followCamera2, &dCamera_c::demoCamera, }; //char* dCamera_c::mvBGTypes[34] = { // "Field", // "Dungeon", // "Plain", // "DungeonDown", // "DungeonUp", // "DungeonCorner", // "Jump", // "DungeonWide", // "Room", // "FieldCushion", // "OverLook", // "Corridor", // "Subject", // "DungeonPassage", // "Cliff", // "Cliff2", // "MajTower", // "Boss01", // "Boss02", // "Gamoss", // "MiniIsland", // "Amoss", // "Cafe", // "P_Ganon1", // "P_Ganon2", // "WindBoss", // "P_Ganon3", // "G_BedRoom", // "G_Roof", // "G_BedRoom2", // "Boss04", // "WindHall", // "BigBird", // "DStairs" //}; /* 80161790-801618B8 .text __ct__9dCamera_cFP12camera_class */ dCamera_c::dCamera_c(camera_class* i_camera) : mCamParam(0) { /* Nonmatching - Code 100%, need to figure out class member at 0x0A4 */ initialize(i_camera, get_player_actor(i_camera), get_camera_id(i_camera), get_controller_id(i_camera)); } /* 801618B8-80161994 .text __dt__9dCamera_cFv */ dCamera_c::~dCamera_c() { /* Nonmatching - Code 100%, issue with class member definitions */ fopAc_ac_c::setStopStatus(0); } /* 80161994-80162128 .text initialize__9dCamera_cFP12camera_classP10fopAc_ac_cUlUl */ void dCamera_c::initialize(camera_class* camera, fopAc_ac_c* playerActor, u32 cameraInfoIdx, u32 padId) { int mapToolType; mpCamera = camera; mActive = 1; mPause = 0; mpPlayerActor = playerActor; mCameraInfoIdx = cameraInfoIdx; mPadId = padId; initMonitor(); initPad(); mForcusLine.Init(); mCamTypeField = GetCameraTypeFromCameraName("Field"); mCamTypeEvent = GetCameraTypeFromCameraName("Event"); mCamTypeWater = GetCameraTypeFromCameraName("Water"); mCamTypeSubject = GetCameraTypeFromCameraName("Subject"); mCamTypeBoat = GetCameraTypeFromCameraName("Boat"); mCamTypeBoatBattle = GetCameraTypeFromCameraName("BoatBattle"); mCamTypeRestrict = GetCameraTypeFromCameraName("Restrict"); mCamTypeKeep = GetCameraTypeFromCameraName("Keep"); mCurType = mMapToolType = mCamTypeField; m524 = 0xFF; m528 = NULL; m258 = 0; m254 = 0; m248[0] = JA_SE_MAN_CAMERA_NG; m248[1] = JA_SE_CAMERA_TO_MANUAL; m248[2] = JA_SE_ATM_PRT_SHIP_CREAK; mCurMode = 0; m144 = 1; m514 = 0; m14C = 0.0f; mEventFlags = 0; m148 = cSAngle::_0; m07C = 0; m080 = cM_rndFX(32767.0f); m064 = 1.0f; m5F4 = 0.0f; mTrimHeight = 0.0f; mTrimSize = 0; mTrimTypeForce = -1; dStage_stageDt_c* stage_dt = &dComIfGp_getStage(); if (stage_dt != NULL) { stage_stag_info_class* stag_info = stage_dt->getStagInfo(); if (stag_info && stag_info->mCameraMapToolID != -1) { // Bug, comparing unsigned value with -1 mapToolType = GetCameraTypeFromMapToolID(stag_info->mCameraMapToolID, -1); if (mapToolType != 0xFF && Chtyp(mapToolType)) { mMapToolType = mapToolType; } } } mCurStyle = types[mCurType].mStyles[0][mCurMode]; mLockOnActorId = fpcM_ERROR_PROCESS_ID_e; mStageMapToolCameraIdx = 0xFF; m0E8 = -1; mEventData.field_0x14 = -1; mEventData.field_0x18 = -1; mEventData.mStaffIdx = -1; mEventData.field_0x0c = -1; mRoomNo = -1; m318 = -1e+09f; mBG.m5C.m58 = C_BG_MIN_HEIGHT; mBG.m00.m58 = C_BG_MIN_HEIGHT; mBG.m00.m04.OffNormalGrp(); mBG.m00.m04.OnWaterGrp(); m31D = 0; m31C = 0; m32C = cXyz::Zero; m320 = m32C; m33C = 0; m33A = cSAngle::_0; m338 = m33A; m350 = 0; m364 = 0; m368 = 0.0f; m354 = C_BG_MIN_HEIGHT; mRoomMapToolCameraIdx = 0xFF; m608 = mCamSetup.mBGChk.WallUpDistance(); if (!strcmp(dComIfGp_getStartStageName(), "sea")) { m780 = 1; } else { m780 = 0; } if (!strcmp(dComIfGp_getStartStageName(), "kaze")) { m788 = 1; } else { m788 = 0; } if (!strcmp(dComIfGp_getStartStageName(), "M_Dai")) { m789 = 1; } else { m789 = 0; } if (!strcmp(dComIfGp_getStartStageName(), "kazeB")) { m78B = 1; } else { m78B = 0; } if (!strcmp(dComIfGp_getStartStageName(), "GanonK")) { m784 = 1; } else { m784 = 0; } if (!strcmp(dComIfGp_getStartStageName(), "GTower")) { m785 = 1; } else { m785 = 0; } if (!(strcmp(dComIfGp_getStartStageName(), "Asoko") && strcmp(dComIfGp_getStartStageName(), "Abship") && strcmp(dComIfGp_getStartStageName(), "PShip"))) { m781 = 1; } else { m781 = 0; } if (!strcmp(dComIfGp_getStartStageName(), "Obshop")) { m782 = 1; } else { m782 = 0; } if (!strcmp(dComIfGp_getStartStageName(), "A_umikz")) { m783 = 1; } else { m783 = 0; } m534 = 0; m536 = 0x180; if (m781) { m530 = 1; m540 = 1.0f; m538 = daObjPirateship::getShipOffsetY(&m534, &m536, 130.0f); m538 *= m540; } else if (m782) { m530 = 2; m540 = 0.12f; m538 = daObjPirateship::getShipOffsetY(&m534, &m536, 130.0f); m538 *= m540; } else if (m783) { m530 = 3; m540 = 1.0f; m538 = daObjPirateship::getShipOffsetY(&m534, &m536, 130.0f); m538 *= m540; } else { m530 = 0; m538 = 0.0f; m540 = 0.0f; } mCamParam.Change(mCurStyle); cXyz attnPos = attentionPos(mpPlayerActor); attnPos.y += mCamParam.CenterHeight(0.0f); m044 = attnPos + cSGlobe(0.0f, cSAngle((s16)0), directionOf(mpPlayerActor)).Xyz(); mCenter = m044; m03C.Val(200.0f, 0, directionOf(mpPlayerActor).Inv()); mDirection = m03C; m050 = m044 + m03C.Xyz(); mEye = m050; mAngleY = cSAngle(mDirection.U().Inv()); mUp.x = 0.0f; mUp.y = 1.0f; mUp.z = 0.0f; mBank = cSAngle::_0; m05C = mBank; m060 = mFovY = mCamParam.Fovy(0.0f); mDMCSystem.field_0x0 = 0; } /* 80162128-80162134 .text Start__9dCamera_cFv */ void dCamera_c::Start() { mActive = 1; } /* 80162134-80162140 .text Stop__9dCamera_cFv */ void dCamera_c::Stop() { mActive = 0; } /* 80162140-8016214C .text Stay__9dCamera_cFv */ void dCamera_c::Stay() { mPause = 1; } /* 8016214C-801621A0 .text ChangeModeOK__9dCamera_cFl */ bool dCamera_c::ChangeModeOK(s32 param_1) { if (dComIfGp_evmng_cameraPlay() || chkFlag(0x20000000)) { return 0; } return !(types[mCurType].mStyles[0][param_1] < 0); } /* 801621A0-801623A0 .text initPad__9dCamera_cFv */ void dCamera_c::initPad() { mStickMainPosXLast = g_mDoCPd_cpadInfo[mPadId].mMainStickPosX; mStickMainPosYLast = g_mDoCPd_cpadInfo[mPadId].mMainStickPosY; mStickMainValueLast = g_mDoCPd_cpadInfo[mPadId].mMainStickValue; mStickMainPosXDelta = 0.0f; mStickMainPosYDelta = 0.0f; mStickMainValueDelta = 0.0f; mStickCPosXLast = g_mDoCPd_cpadInfo[mPadId].mCStickPosX; mStickCPosYLast = g_mDoCPd_cpadInfo[mPadId].mCStickPosY; mStickCValueLast = g_mDoCPd_cpadInfo[mPadId].mCStickValue; mStickCPosXDelta = 0.0f; mStickCPosYDelta = 0.0f; mStickCValueDelta = 0.0f; m18C = 0; m188 = 0; m184 = 0; mTriggerLeftLast = g_mDoCPd_cpadInfo[mPadId].mTriggerLeft; mTriggerLeftDelta = 0.0f; mHoldLockL = FALSE; mTrigLockL = FALSE; m19A = 0; m19B = 0; mTriggerRightLast = g_mDoCPd_cpadInfo[mPadId].mTriggerRight; mTriggerRightDelta = 0.0f; mHoldLockR = 0; mTrigLockR = 0; m1A6 = 0; m1A7 = 0; mHoldX = (bool)CPad_CHECK_HOLD_X(mPadId); mTrigX = (bool)CPad_CHECK_TRIG_X(mPadId); mHoldY = (bool)CPad_CHECK_HOLD_Y(mPadId); mTrigY = (bool)CPad_CHECK_TRIG_Y(mPadId); mHoldY = (bool)CPad_CHECK_HOLD_Y(mPadId); mTrigY = (bool)CPad_CHECK_TRIG_Y(mPadId); mHoldZ = (bool)CPad_CHECK_HOLD_Z(mPadId); mTrigZ = (bool)CPad_CHECK_TRIG_Z(mPadId); m1AE = 0; } /* 801623A0-80162710 .text updatePad__9dCamera_cFv */ void dCamera_c::updatePad() { float fVar1; float fVar2; float fVar3; cSAngle local_48; if (chkFlag(0x1000000)) { fVar1 = 0.0f; fVar2 = 0.0f; fVar3 = 0.0f; } else { fVar1 = g_mDoCPd_cpadInfo[mPadId].mMainStickPosX; fVar2 = g_mDoCPd_cpadInfo[mPadId].mMainStickPosY; fVar3 = g_mDoCPd_cpadInfo[mPadId].mMainStickValue; } cSAngle unused(g_mDoCPd_cpadInfo[mPadId].mMainStickAngle); // Unused object? Code matches so perhaps a developer oversight mStickMainPosXDelta = fVar1 - mStickMainPosXLast; mStickMainPosYDelta = fVar2 - mStickMainPosYLast; mStickMainValueDelta = fVar3 - mStickMainValueLast; mStickMainPosXLast = fVar1; mStickMainPosYLast = fVar2; mStickMainValueLast = fVar3; if (chkFlag(0x800000)) { fVar1 = 0.0f; fVar2 = 0.0f; fVar3 = 0.0f; } else { fVar1 = g_mDoCPd_cpadInfo[mPadId].mCStickPosX; fVar2 = g_mDoCPd_cpadInfo[mPadId].mCStickPosY; fVar3 = g_mDoCPd_cpadInfo[mPadId].mCStickValue; } mStickCPosXDelta = fVar1 - mStickCPosXLast; mStickCPosYDelta = fVar2 - mStickCPosYLast; mStickCValueDelta = fVar3 - mStickCValueLast; mStickCPosXLast = fVar1; mStickCPosYLast = fVar2; mStickCValueLast = fVar3; fVar1 = g_mDoCPd_cpadInfo[mPadId].mTriggerLeft; mTriggerLeftDelta = mTriggerLeftLast - fVar1; mTriggerLeftLast = fVar1; mHoldLockL = mDoCPd_L_LOCK_BUTTON(mPadId); mTrigLockL = mDoCPd_L_LOCK_TRIGGER(mPadId); if (mTriggerLeftLast > mCamSetup.m0A0) { if (m19A == 0) { m19B = 1; } else { m19B = 0; } m19A = 1; } else { m19B = 0; m19A = 0; } fVar1 = g_mDoCPd_cpadInfo[mPadId].mTriggerRight; mTriggerRightDelta = mTriggerRightLast - fVar1; mTriggerRightLast = fVar1; mHoldLockR = mDoCPd_R_LOCK_BUTTON(mPadId); mTrigLockR = mDoCPd_R_LOCK_TRIGGER(mPadId); if (mTriggerRightLast > mCamSetup.m0A0) { if (m1A6 == 0) { m1A7 = 1; } else { m1A7 = 0; } m1A6 = 1; } else { m1A7 = 0; m1A6 = 0; } mHoldX = (bool)CPad_CHECK_HOLD_X(mPadId); mTrigX = (bool)CPad_CHECK_TRIG_X(mPadId); mHoldY = (bool)CPad_CHECK_HOLD_Y(mPadId); mTrigY = (bool)CPad_CHECK_TRIG_Y(mPadId); mHoldZ = (bool)CPad_CHECK_HOLD_B(mPadId); // mHoldZ might not be the appropriate name for this? mTrigZ = (bool)CPad_CHECK_TRIG_B(mPadId); // likewise for mTrigZ m1AE = 0; } /* 80162710-801627A4 .text initMonitor__9dCamera_cFv */ void dCamera_c::initMonitor() { if (mpPlayerActor) { mMonitor.mPos = positionOf(mpPlayerActor); } else { mMonitor.mPos = cXyz::Zero; } mMonitor.field_0x0C.z = 0.0f; mMonitor.field_0x0C.y = 0.0f; mMonitor.field_0x0C.x = 0.0f; mMonitor.field_0x10 = 0; mMonitor.field_0x14 = 0.0f; } /* 801627A4-801628DC .text updateMonitor__9dCamera_cFv */ void dCamera_c::updateMonitor() { float playerMonitorHorizontalDist; cXyz playerPos; if (mpPlayerActor != NULL) { playerPos = positionOf(mpPlayerActor); if (m31D != 0) { dComIfG_Bgsp()->MoveBgMatrixCrrPos(mBG.m5C.m04, TRUE, &mMonitor.mPos, NULL, NULL); } playerMonitorHorizontalDist = dCamMath::xyzHorizontalDistance(playerPos, mMonitor.mPos); mMonitor.field_0x0C.z = playerMonitorHorizontalDist - mMonitor.field_0x0C.x; mMonitor.field_0x0C.y += (playerMonitorHorizontalDist - mMonitor.field_0x0C.y) * 0.075f; mMonitor.field_0x0C.x = playerMonitorHorizontalDist; mMonitor.mPos = playerPos; if (!m144 && *(u16*)&g_mDoCPd_cpadInfo[0].mButtonHold == 0 && mStickMainValueLast < 0.05f && mStickCValueLast < 0.05f) { // Possible union between u16 and bitfield rather than *(u16*) cast mMonitor.field_0x10++; } else { mMonitor.field_0x10 = 0; } mMonitor.field_0x14 = mDirection.R() - mMonitor.field_0x14; } } /* 801628DC-80163020 .text calcPeepAngle__9dCamera_cFv */ cSAngle dCamera_c::calcPeepAngle() { cSAngle res(cSAngle::_0); if (check_owner_action(mPadId, daPyStts0_UNK20_e)) { f32 temp_30 = 30.0f; cXyz local_b8(0.0f, 0.0f, -temp_30); f32 temp_50 = 50.0f; cXyz local_ac(-temp_50, 0.0f, -temp_30); cXyz local_a0(relationalPos(mpPlayerActor, &local_b8)); cXyz local_94(relationalPos(mpPlayerActor, &local_ac)); dBgS_CamLinChk_NorWtr lin_chk; if (lineBGCheck(&local_94, &local_a0, &lin_chk, 0x7f)) { cM3dGPla* plane = dComIfG_Bgsp()->GetTriPla(lin_chk); res = cSAngle::_90 + (cSGlobe(plane->mNormal).U() - directionOf(mpPlayerActor)); // GetNP() doesn't work? } } else if (check_owner_action(mPadId, daPyStts0_UNK40_e)) { f32 temp_30 = 30.0f; cXyz local_88(0.0f, 0.0f, -temp_30); cXyz local_7c(50.0f, 0.0f, -temp_30); cXyz local_70(relationalPos(mpPlayerActor, &local_88)); cXyz local_64(relationalPos(mpPlayerActor, &local_7c)); dBgS_CamLinChk_NorWtr lin_chk; if (lineBGCheck(&local_64, &local_70, &lin_chk, 0x7f)) { cM3dGPla* plane = dComIfG_Bgsp()->GetTriPla(lin_chk); res = cSAngle::_270 + (cSGlobe(plane->mNormal).U() - directionOf(mpPlayerActor)); } } return cSAngle(res); } /* 801632F0-8016336C .text Att__9dCamera_cFv */ void dCamera_c::Att() { fopAc_ac_c* target; if (mpPlayerActor && !chkFlag(0x2000000)) { if (dComIfGp_getAttention().LockonTruth()) { target = dComIfGp_getAttention().LockonTarget(0); } else { target = NULL; } mpLockonTarget = target; } } /* 8016336C-80163514 .text checkForceLockTarget__9dCamera_cFv */ bool dCamera_c::checkForceLockTarget() { bool res = TRUE; if (mLockOnActorId != fpcM_ERROR_PROCESS_ID_e) { mpLockonActor = GetForceLockOnActor(); if (mpLockonActor) { if (dComIfGp_getAttention().Lockon() || mForceLockTimer > mCamSetup.ForceLockOffTimer() || cXyz(positionOf(mpLockonActor) - positionOf(mpPlayerActor)).abs() > mCamSetup.ForceLockOffDist()) { res = FALSE; } } else { res = FALSE; } } else { res = FALSE; } return res; } /* 80163514-80163EF4 .text Run__9dCamera_cFv */ bool dCamera_c::Run() { /* Nonmatching */ float fVar1; float fVar2; float fVar3; long next; dCamera_c* camera; cSAngle local_40; bool res = FALSE; camera = NULL; mForcusLine.Off(); clrFlag(0x10149C01); checkSpecialArea(); checkGroundInfo(); if (m530 && !chkFlag(0x200000)) { if (!(dComIfGp_evmng_cameraPlay() || chkFlag(0x20000000))) { fVar1 = daObjPirateship::getShipOffsetY(&m534, &m536, 130.0f); fVar2 = fVar1 * m540; fVar3 = fVar2 - m538; if (((m530 == 1) && (m53C < 0.0f)) && (fVar3 > 0.0f)) { m254 |= 4; } m53C = fVar3; m538 = fVar2; m044.y -= m53C * mCamSetup.mManualStartCThreshold; } } updateMonitor(); Att(); dComIfGp_offCameraAttentionStatus(mCameraInfoIdx, 0x3400); if (!(dComIfGp_evmng_cameraPlay() || chkFlag(0x20000000))) { updatePad(); mCamSetup.mCstick.Shift(mPadId); } if (dComIfGp_getMiniGameType() == 8) { updatePad(); mCamSetup.mCstick.Shift(mPadId); } if (dComIfGp_getAttention().Lockon()) { setFlag(0x1000); } if (!checkForceLockTarget()) { mLockOnActorId = fpcM_ERROR_PROCESS_ID_e; } else { mForceLockTimer++; } mNextType = nextType(mCurType); if (mNextType != mCurType && onTypeChange(mCurType, mNextType)) { mCurType = mNextType; } mNextMode = nextMode(mCurMode); next = mNextMode; if (next != mCurMode) { if (types[mCurType].mStyles[0][next] >= 0 && onModeChange(mCurMode, next)) { mCurMode = mNextMode; } } if (types[mCurType].mStyles[0][mCurMode] < 0) { mCurMode = 0; } const s16 curStyle = types[mCurType].mStyles[0][mCurMode]; if (curStyle >= 0) { if (mCurStyle != curStyle && onStyleChange(mCurStyle, curStyle)) { mCurStyle = types[mCurType].mStyles[0][mCurMode]; mCamParam.Change(mCurStyle); } } clrFlag(0x20); if (mCurMode == 0xc) { setFlag(0x20); } clrFlag(0x80000000); dComIfGp_offCameraAttentionStatus(mCameraInfoIdx, 0x80); if (mCamParam.CheckFlag(dCamParam_UNK004) && !check_owner_action(mPadId, daPyStts0_UNK4000000_e) && !check_owner_action1(mPadId, daPyStts1_UNK40000_e)) { m148 += (forwardCheckAngle() - m148) * mCamSetup.mBGChk.FwdCushion(); } else { m148 = cSAngle::_0; } defaultTriming(); mTrimTypeForce = -1; m068 = 9; if (chkFlag(0x200000) && mCamParam.Algorythmn(mCurStyle) != 11) { if (push_any_key(mPadId) || mMonitor.field_0x0C.x > 10.0f || !m360 || m31C) { clrFlag(0x200000); } } else if (dComIfGp_demo_getCamera() && mCamParam.Algorythmn() != 11) { res = demoCamera(0); } else { // Issues here res = (this->*engine_tbl[mCamParam.Algorythmn(mCurStyle)])(mCurStyle); m07C++; m080++; m118++; m108++; m11C++; } if (!res) { m514 = 0; } if (!chkFlag(0x400)) { m05C -= m05C * 0.05f; } shakeCamera(); clrFlag(0x90080); if (mCamParam.CheckFlag(dCamParam_UNK001)) { m068 = 0x3F; } else if (mCamParam.CheckFlag(dCamParam_UNK002)) { m068 = 0xF; } if (mCamParam.CheckFlag(dCamParam_UNK400)) { m068 |= 0x40; } fVar1 = m354 + mCamSetup.mBGChk.FloorMargin(); if (m044.y < fVar1) { mCenter.x = m044.x; mCenter.z = m044.z; if ((mCamParam.Algorythmn(mCurStyle) == 4) && chkFlag(0x10000800)) { m068 &= ~8; mCenter.y = m044.y; } else { mCenter.y = fVar1; } } else { mCenter = m044; } mFovY = m060; mBank = m05C; bumpCheck(m068); cSAngle angle(cSAngle(g_mDoCPd_cpadInfo[mPadId].mMainStickAngle) - mDMCSystem.field_0x4); if (mStickMainValueLast < mCamSetup.DMCValue() || angle > cSAngle(mCamSetup.DMCAngle()) || angle < cSAngle(-mCamSetup.DMCAngle())) { mDMCSystem.field_0x0 = 0; } if (mDMCSystem.field_0x0) { mAngleY = getDMCAngle(g_mDoCPd_cpadInfo[mPadId].mMainStickAngle); } else { mAngleY = mDirection.U().Inv(); } if (mCenter.x == mEye.x && mCenter.z == mEye.z) { mUp.x = 0.01f; mUp.y = 1.0f; mUp.z = 0.0f; } else if (mDirection.V().Val() > cSAngle(-90.0f) && mDirection.V() < cSAngle(90.0f)) { mUp.x = 0.0f; mUp.y = 1.0f; mUp.z = 0.0f; } else { mUp.x = 0.0f; mUp.y = -1.0f; mUp.z = 0.0f; } for (u32 i = 0; i < 3; i++) { bool playSound = FALSE; if ((m254 & (1 << i)) != 0 && (m258 & (1 << i)) == 0) { playSound = TRUE; } if (playSound) { mDoAud_seStart(m248[i]); } } m258 = m254; bool r3 = FALSE; m254 = r3; if (m100 && m101 && m102) { // Also Inline? r3 = TRUE; } if (r3) { dComIfGp_onCameraAttentionStatus(mCameraInfoIdx, 0x10); } else { dComIfGp_offCameraAttentionStatus(mCameraInfoIdx, 0x10); } if (chkFlag(0x40000)) { dComIfGp_onCameraAttentionStatus(mCameraInfoIdx, 2); } else if (mDirection.R() < mCamSetup.m048) { if (chkFlag(0x800)) { dComIfGp_onCameraAttentionStatus(mCameraInfoIdx, 2); } if (chkFlag(0x10000000)) { dComIfGp_onCameraAttentionStatus(mCameraInfoIdx, 0x20); } } return res; } /* 80163EF4-801640A8 .text NotRun__9dCamera_cFv */ bool dCamera_c::NotRun() { clrFlag(0x90149C21); checkGroundInfo(); dComIfGp_offCameraAttentionStatus(mCameraInfoIdx, 0x80); if (dComIfGp_evmng_cameraPlay() || chkFlag(0x20000000)) { if (mCurType != mCamTypeEvent) { pushPos(); mEventData.field_0x0c = mCurType; } mCurType = mCamTypeEvent; eventCamera(types[mCurType].mStyles[0][3]); m07C++; m118++; m108++; m11C++; } if (dComIfGp_event_runCheck()) { dComIfGp_offCameraAttentionStatus(mCameraInfoIdx, 0x48); } dComIfGp_onCameraAttentionStatus(mCameraInfoIdx, 0x14); clrFlag(0x90080); mForcusLine.Off(); shakeCamera(); mPause = 0; if (dComIfGp_checkCameraAttentionStatus(mCameraInfoIdx, 8)) { if (chkFlag(0x400000)) { setView(160.0f, 35.0f, 320.0f, 320.0f); } else { setView(0.0f, 0.0f, 640.0f, 480.0f); } } return TRUE; } /* 801640A8-801640B4 .text SetTrimSize__9dCamera_cFl */ bool dCamera_c::SetTrimSize(s32 size) { mTrimSize = size; return TRUE; } /* 801640B4-801640C0 .text SetTrimTypeForce__9dCamera_cFl */ bool dCamera_c::SetTrimTypeForce(s32 force) { mTrimTypeForce = force; return TRUE; } /* 801640C0-80164164 .text CalcTrimSize__9dCamera_cFv */ void dCamera_c::CalcTrimSize() { switch (mTrimSize) { case 0: mTrimHeight += -mTrimHeight * 0.25f; break; case 2: mTrimHeight += (mCamSetup.CinemaScopeTrimHeight() - mTrimHeight) * 0.25f; break; case 1: mTrimHeight += (mCamSetup.VistaTrimHeight() - mTrimHeight) * 0.25f; break; case 3: mTrimHeight = mCamSetup.CinemaScopeTrimHeight(); break; case 4: mTrimHeight = 0.0f; break; } } /* 80164164-8016418C .text Draw__9dCamera_cFv */ bool dCamera_c::Draw() { mForcusLine.Draw(); return TRUE; } /* 8016418C-80164898 .text nextMode__9dCamera_cFl */ int dCamera_c::nextMode(s32 i_curMode) { /* Nonmatching - regswap */ dAttention_c& attn = dComIfGp_getAttention(); s32 next_mode = i_curMode; cXyz player_pos = positionOf(mpPlayerActor); if (!dComIfGp_evmng_cameraPlay()) { if (mBG.m00.m58 > player_pos.y) { m1AE = 0; } switch(i_curMode) { case 4: case 10: case 11: case 13: case 14: m144 = 1; m184 = 0; break; case 5: case 6: m144 = 1; m184 = 0; case 1: mpLockonTarget = NULL; default: if (m19B) { m144 = 1; m184 = 0; } else { if (mStickCPosYLast <= 0.0f && mStickCValueLast > mCamSetup.m09C) { m144 = 0; } else { if (i_curMode == 0 || i_curMode == 0x13) { positionOf(mpPlayerActor); if ( !( mStickMainValueLast >= 0.5f || attn.LockonTruth() || check_owner_action(mPadId, daPyStts0_SWIM_e)) ) { if (m184 == 1) { if (mStickCPosYLast < mCamSetup.mCstick.m00) { m184 = 0; } } else if (mStickCPosYLast > mCamSetup.mCstick.m04) { dComIfGp_onCameraAttentionStatus(mCameraInfoIdx, 0x1000); m184 = 1; dComIfGp_onCameraAttentionStatus(mCameraInfoIdx, 0x400); } else { dComIfGp_onCameraAttentionStatus(mCameraInfoIdx, 0x400); } } } } } break; case 12: if ((mStickCValueLast < 0.01f && mDirection.R() < mCamSetup.m098) || chkFlag(0x80000000)) { m144 = 1; m184 = 0; } else if (m19B != 0) { m144 = 1; m184 = 0; } break; } if (chkFlag(0x4000000)) { if (m144 == 0) { m254 |= 1; } if (check_owner_action(mPadId, daPyStts0_UNK80000000_e)) { setFlag(0x8000); } m144 = 1; clrFlag(0x4000000); } if (mLockOnActorId != fpcM_ERROR_PROCESS_ID_e && mpLockonActor && fopAcM_GetName(mpLockonActor) == PROC_NPC_MD) { m144 = 1; i_curMode = 0; } if (i_curMode == 12 && m144 != 0) { next_mode = 0; } else if (check_owner_action(mPadId, daPyStts0_TELESCOPE_LOOK_e) || check_owner_action1(mPadId, daPyStts1_PICTO_BOX_AIM_e)) { next_mode = 0xe; } else if (check_owner_action1(mPadId, daPyStts1_UNK80000000_e | daPyStts1_UNK80_e)) { next_mode = 0x11; } else if (check_owner_action1(mPadId, daPyStts1_UNK800000_e)) { if (m144 == 0) { next_mode = 0xc; } else { next_mode = 0x12; } } else if (check_owner_action(mPadId, daPyStts0_UNK10_e)) { next_mode = 0xf; } else if (check_owner_action1(mPadId, daPyStts1_UNK2000_e)) { next_mode = 4; } else if (check_owner_action1(mPadId, daPyStts1_UNK20000_e | daPyStts1_UNK4000_e | daPyStts1_UNK1000_e) && !attn.Lockon()) { next_mode = 10; } else if (check_owner_action(mPadId, daPyStts0_BOOMERANG_AIM_e) && !attn.Lockon()) { next_mode = 11; } else if (m144 == 0) { next_mode = 12; } else if (check_owner_action1(mPadId, daPyStts1_UNK2_e)) { next_mode = 5; } else if (check_owner_action1(mPadId, daPyStts1_UNK4_e)) { next_mode = 6; } else if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK40_e | daPyStts0_UNK20_e))) { next_mode = 6; } else if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e))) { next_mode = 5; } else if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK400_e | daPyStts0_UNK4_e | daPyStts0_UNK2_e)) && i_curMode != 12) { if (mpLockonTarget) { next_mode = 8; } } else if (attn.LockonTruth() && !check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK800000_e | daPyStts0_BOOMERANG_WAIT_e))) { next_mode = 2; } else if (attn.Lockon()) { next_mode = 1; } else if (check_owner_action(mPadId, daPyStts0_BOOMERANG_WAIT_e) && !check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK37a02371_e & ~daPyStts0_UNK1000000_e)) && !check_owner_action1(mPadId, daPyStts1_UNK10_e | daPyStts1_WIND_WAKER_CONDUCT_e)) { mpLockonTarget = get_boomerang_actor(mpPlayerActor); next_mode = 2; mLockOnActorId = fpcM_ERROR_PROCESS_ID_e; } else if (isPlayerGuarding(mPadId)) { next_mode = 19; } else if (mLockOnActorId != fpcM_ERROR_PROCESS_ID_e) { if (mpLockonActor) { next_mode = 2; mpLockonTarget = mpLockonActor; } else { next_mode = 0; mLockOnActorId = fpcM_ERROR_PROCESS_ID_e; } } else { switch (i_curMode) { case 12: if (m144 != 0) { next_mode = 0; } break; default: next_mode = 0; } } } if (next_mode != 2) { mLockOnActorId = fpcM_ERROR_PROCESS_ID_e; } if (next_mode == 12 && types[mCurType].mStyles[0][next_mode] < 0) { next_mode = i_curMode; if (mCurType != mCamTypeEvent && mCurType != mCamTypeBoat && mCurType != mCamTypeBoatBattle && mCurType != mCamTypeRestrict) { m254 |= 1; } m144 = 1; } if (types[mCurType].mStyles[0][next_mode] >= 0) { if (next_mode == 1) { setFlag(0x100000); } return next_mode; } return i_curMode; } /* 80164898-80164A48 .text onModeChange__9dCamera_cFll */ bool dCamera_c::onModeChange(s32 i_curMode, s32 i_nextMode) { if (i_curMode == 0xe && mCamParam.CheckFlag(dCamParam_UNK010)) { setView(0.0f, 0.0f, 640.0f, 480.0f); } m108 = 0; m100 = 0; m101 = 0; m102 = 0; m10C = 0; m110 = 1; m14C = 0.0f; clrFlag(0x11E); clrFlag(0x2000); switch (i_curMode) { case 3: dComIfGp_offCameraAttentionStatus(mCameraInfoIdx, 4); break; case 4: case 10: case 11: case 13: case 14: break; } switch(i_nextMode) { case 7: setFlag(0x10); break; case 0: if (i_curMode == 1 && types[mCurType].mStyles[0][0] == types[mCurType].mStyles[0][1]) { m110 = 0; } break; case 1: if (i_curMode == 0 && types[mCurType].mStyles[0][0] == types[mCurType].mStyles[0][1]) { m110 = 0; } break; case 12: if (i_curMode != i_nextMode) { m254 |= 2; } break; case 4: break; } return TRUE; } /* 80164A48-80164CEC .text nextType__9dCamera_cFl */ int dCamera_c::nextType(s32 curType) { int idx; int roomNo; s32 nextType = curType; if (dComIfGp_evmng_cameraPlay() || chkFlag(0x20000000)) { nextType = mCamTypeEvent; if (curType != nextType) { clrFlag(0x200000); if (curType != mCamTypeEvent) { pushPos(); mEventData.field_0x0c = curType; } } } else { if (mpPlayerActor && m514 != 1) { if (curType == mCamTypeEvent) { nextType = mEventData.field_0x0c; mEventData.field_0x0c = -1; } if (daNpc_kam_c::m_hyoi_kamome) { nextType = GetCameraTypeFromCameraName("Seagal"); } else if ((check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK1000000_e | daPyStts0_SHIP_RIDE_e)) || check_owner_action1(mPadId, daPyStts1_UNK80_e)) && m524 == 0xFF) { nextType = mCamTypeBoat; } else { roomNo = -1; if (mStageMapToolCameraIdx != 0xff) { idx = mStageMapToolCameraIdx; } else { if (mRoomNo != -1) { roomNo = mRoomNo; } idx = mRoomMapToolCameraIdx; } if (m524 != 0xff) { nextType = m524; if (m528) { mpLockonTarget = m528; } } else if (idx == 0xff) { idx = m350; if (idx > 0) { if (idx < mvBGType_num) { int cameraTypeFromCameraName = GetCameraTypeFromCameraName(mvBGTypes[idx]); if (cameraTypeFromCameraName != mCamTypeKeep) { nextType = cameraTypeFromCameraName; } if (m350 == 0x11) { roomNo = fopAcM_GetRoomNo(mpPlayerActor); GetCameraTypeFromMapToolID(0, roomNo); } } } else { if (check_owner_action(mPadId, daPyStts0_SWIM_e)) { nextType = mCamTypeWater; } else { nextType = mMapToolType; } } } else if (idx == 0x1ff) { if (check_owner_action1(mPadId, daPyStts1_DEKU_LEAF_FLY_e)) { nextType = mMapToolType; } else if (check_owner_action(mPadId, daPyStts0_SWIM_e)) { nextType = mCamTypeWater; } if (curType == mCamTypeBoat || curType == GetCameraTypeFromCameraName("BoatBattle")) { nextType = mCamTypeWater; } } else { int cameraTypeFromMapToolId = GetCameraTypeFromMapToolID(idx, roomNo); if (cameraTypeFromMapToolId == mCamTypeKeep) { nextType = curType; } else if (cameraTypeFromMapToolId != 0xff) { nextType = cameraTypeFromMapToolId; } else { nextType = mMapToolType; } } } } } m524 = 0xFF; m528 = NULL; return nextType; } /* 80164CEC-80164DB4 .text onTypeChange__9dCamera_cFll */ bool dCamera_c::onTypeChange(s32 i_curType, s32 i_nextType) { s32 mode; m118 = 0; m114 = 0; mode = mCurMode; if (m144 == 0) { s32 style = types[i_nextType].mStyles[0][0]; if (style >= 0) { switch (mCamParam.Algorythmn(style)) { case 5: case 6: case 11: case 12: case 13: mode = 0; m144 = 1; break; default: break; } } } if (onModeChange(mCurMode, mode)) { m11C = 0; } return TRUE; } /* 80164DB4-80164DFC .text SetTypeForce__9dCamera_cFPcP10fopAc_ac_c */ void dCamera_c::SetTypeForce(char* param_0, fopAc_ac_c* param_1) { SetTypeForce(GetCameraTypeFromCameraName(param_0), param_1); } /* 80164DFC-80164E2C .text SetTypeForce__9dCamera_cFlP10fopAc_ac_c */ bool dCamera_c::SetTypeForce(s32 param_0, fopAc_ac_c* param_1) { if (m524 != 0xFF) { return false; } m524 = param_0; m528 = param_1; return m524 != 0xFF; } /* 80164E2C-80164F5C .text onStyleChange__9dCamera_cFll */ bool dCamera_c::onStyleChange(s32 i_style1, s32 i_style2) { m11C = 0; bool bVar1 = false; switch (mCamParam.Algorythmn(i_style1)) { case 5: case 6: if (mDMCSystem.field_0x0 == 0) { setDMCAngle(); } bVar1 = true; break; case 4: dComIfGp_setCameraZoomScale(mCameraInfoIdx, 1.0f); dComIfGp_offCameraAttentionStatus(mCameraInfoIdx, 0x48); break; } switch(mCamParam.Algorythmn(i_style2)) { case 1: case 8: if (mCamParam.Algorythmn(i_style1) == mCamParam.Algorythmn(i_style2)) { setFlag(0x8000); } break; case 5: case 6: if (mDMCSystem.field_0x0 == 0 || bVar1) { setDMCAngle(); } case 4: case 12: case 13: if (m144 == 0) { m144 = 1; } } return TRUE; } /* 80164F5C-8016513C .text GetCameraTypeFromMapToolID__9dCamera_cFll */ int dCamera_c::GetCameraTypeFromMapToolID(s32 r27, s32 i_roomNo) { dStage_stageDt_c& stage_dt = *(dStage_stageDt_c*)&dComIfGp_getStage(); int cam_type_num; int arrowIdx; stage_camera_class* camera; stage_arrow_class* arrow; if (i_roomNo == -1) { camera = stage_dt.getCamera(); arrow = stage_dt.getArrow(); } else { camera = dComIfGp_getRoomCamera(i_roomNo); arrow = dComIfGp_getRoomArrow(i_roomNo); if (camera == NULL ) { return 0xFF; } } if (r27 < 0 || camera == NULL || (camera != NULL && r27 >= camera->num)) { return 0xFF; } cam_type_num = 0; while (cam_type_num < type_num) { if (strcmp(camera->m_entries[r27].m_cam_type, types[cam_type_num].name) == 0) { break; } cam_type_num++; } if (cam_type_num == type_num) { return 0xFF; } mCurRoomCamEntry = camera->m_entries[r27]; arrowIdx = mCurRoomCamEntry.m_arrow_idx; if (arrowIdx != -1 && arrowIdx < arrow->num) { mCurArrowIdx = arrowIdx; mCurRoomArrowEntry = arrow->m_entries[arrowIdx]; } else { mCurArrowIdx = 0xFF; } return cam_type_num; } /* 8016513C-801651F0 .text GetCameraTypeFromCameraName__9dCamera_cFPCc */ int dCamera_c::GetCameraTypeFromCameraName(const char* i_name) { if (strcmp(i_name, types[mCurType].name) == 0) { return mCurType; } int cam_type_num = 0; while (cam_type_num < type_num) { if (strcmp(i_name, types[cam_type_num].name) == 0) { break; } cam_type_num++; } if (cam_type_num == type_num) { return 0xFF; } return cam_type_num; } /* 801651F0-80165234 .text pushPos__9dCamera_cFv */ void dCamera_c::pushPos() { m084 = m044; m090 = m050; m09C = m060; m0A0 = m05C; return; } /* 80165234-8016528C .text limited_range_addition__FPffff */ bool limited_range_addition(f32* param_1, f32 param_2, f32 param_3, f32 param_4) { float fVar1 = param_3; float fVar2 = param_4; if (param_3 > param_4) { param_2 = -param_2; fVar1 = param_4; fVar2 = param_3; } *param_1 += param_2; if (*param_1 < fVar1) { *param_1 = fVar1; return false; } if (*param_1 > fVar2) { *param_1 = fVar2; return false; } return true; } /* 8016528C-801652B0 .text directionOf__9dCamera_cFP10fopAc_ac_c */ cSAngle dCamera_c::directionOf(fopAc_ac_c* i_this) { return cSAngle(i_this->shape_angle.y); } /* 801652B0-801652CC .text positionOf__9dCamera_cFP10fopAc_ac_c */ cXyz dCamera_c::positionOf(fopAc_ac_c* i_this) { return i_this->current.pos; } /* 801652CC-801652E8 .text attentionPos__9dCamera_cFP10fopAc_ac_c */ cXyz dCamera_c::attentionPos(fopAc_ac_c* i_this) { return i_this->attention_info.position; } /* 801652E8-801653B0 .text relationalPos__9dCamera_cFP10fopAc_ac_cP4cXyz */ cXyz dCamera_c::relationalPos(fopAc_ac_c* i_actor, cXyz* i_offset) { if (i_actor == NULL) { return cXyz::Zero; } cSGlobe offset_globe(*i_offset); offset_globe.V(directionOf(i_actor) + offset_globe.U()); return attentionPos(i_actor) + offset_globe.Xyz(); } /* 801653B0-8016548C .text relationalPos__9dCamera_cFP10fopAc_ac_cP4cXyz7cSAngle */ cXyz dCamera_c::relationalPos(fopAc_ac_c* i_actor, cXyz* i_offset, cSAngle param_2) { if (i_actor == NULL) { return cXyz::Zero; } cSGlobe offset_globe(*i_offset); offset_globe.V(directionOf(i_actor) + offset_globe.U() + param_2); return attentionPos(i_actor) + offset_globe.Xyz(); } /* 8016548C-801656AC .text relationalPos__9dCamera_cFP10fopAc_ac_cP10fopAc_ac_cP4cXyzf */ cXyz dCamera_c::relationalPos(fopAc_ac_c* i_actor1, fopAc_ac_c* i_actor2, cXyz* i_offset, f32 param_3) { if (i_actor1 == NULL) { return cXyz::Zero; } if (i_actor2 == NULL) { return relationalPos(i_actor1, i_offset); } cXyz pos1 = attentionPos(i_actor1); cXyz pos2 = attentionPos(i_actor2); cXyz mid = pos1 + (pos2 - pos1) * 0.5f; cSGlobe delta_globe(pos2 - pos1); cSGlobe offset_globe(*i_offset); offset_globe.V(directionOf(i_actor1) + offset_globe.U()); cSAngle acStack_104 = m03C.U() - delta_globe.U(); delta_globe.R(0.5f * delta_globe.R() * acStack_104.Cos() * param_3); cXyz ret = mid + delta_globe.Xyz() + offset_globe.Xyz(); return ret; } /* 801656AC-80165720 .text setDMCAngle__9dCamera_cFv */ void dCamera_c::setDMCAngle() { mDMCSystem.field_0x0 = 1; mDMCSystem.field_0x2 = mDirection.U().Inv(); mDMCSystem.field_0x4 = cSAngle(g_mDoCPd_cpadInfo[mPadId].mMainStickAngle); } /* 80165720-80165744 .text getDMCAngle__9dCamera_cF7cSAngle */ cSAngle dCamera_c::getDMCAngle(cSAngle param_0) { return mDMCSystem.field_0x2; } /* 80165744-80165800 .text pointInSight__9dCamera_cFP4cXyz */ bool dCamera_c::pointInSight(cXyz* i_point) { cXyz proj; dDlst_window_c* window = get_window(mpCamera); scissor_class* scissor = window->getScissor(); f32 scissor_width = scissor->mWidth; f32 scissor_height = scissor->mHeight; mDoLib_project(i_point, &proj); return (proj.x > 0.0f && proj.x < scissor_width) && (proj.y > 0.0f && proj.y < scissor_height); } /* 80165800-80165830 .text radiusActorInSight__9dCamera_cFP10fopAc_ac_cP10fopAc_ac_c */ f32 dCamera_c::radiusActorInSight(fopAc_ac_c* i_actor1, fopAc_ac_c* i_actor2) { return radiusActorInSight(i_actor1, i_actor2, &m044, &m050 , mFovY, mBank.Val()); } /* 80165830-80165CC4 .text radiusActorInSight__9dCamera_cFP10fopAc_ac_cP10fopAc_ac_cP4cXyzP4cXyzfs */ f32 dCamera_c::radiusActorInSight(fopAc_ac_c* i_actor1, fopAc_ac_c* i_actor2, cXyz* i_center, cXyz* i_eye, f32 i_fovY, s16 i_bank) { f32 radius; cSGlobe globe_delta(*i_eye - *i_center); cXyz pos1 = attentionPos(i_actor1); cXyz pos2 = attentionPos(i_actor2); cXyz delta = pos1 - pos2; delta.normalize(); pos1 += delta * 50.0f; pos2 -= delta * 50.0f; dDlst_window_c* window = get_window(mpCamera); scissor_class* scissor = window->getScissor(); cSAngle local_130(i_fovY * 0.5f * (scissor->mHeight / 480.f) * 0.95f); cSAngle local_134((scissor->mWidth / 640.0f) * (i_fovY * mWindowAspectRatio * 0.5f) * 0.95f); cSGlobe cStack_12c(*i_eye - pos1); cSGlobe cStack_124(*i_eye - pos2); int uVar4 = 0; cSAngle local_13c; local_13c = cStack_12c.U() - globe_delta.U(); if (local_13c < -local_134 || local_13c > local_134) { uVar4 |= 1; } local_13c = cStack_12c.V() - globe_delta.V(); if (local_13c < -local_130 || local_13c > local_130) { uVar4 |= 2; } local_13c = cStack_124.U() - globe_delta.U(); if (local_13c < -local_134 || local_13c > local_134) { uVar4 |= 4; } local_13c = cStack_124.V() - globe_delta.V(); if (local_13c < -local_130 || local_13c > local_130) { uVar4 |= 8; } if (uVar4 == 0) { return 0.0f; } radius = 0.0f; Mtx look_mtx; cXyz local_a8; f32 fVar3; mDoMtx_lookAt(look_mtx, i_eye, i_center, &mUp, i_bank); if ((uVar4 & 3) != 0) { MTXMultVec(look_mtx, &pos1, &local_a8); if ((uVar4 & 1) != 0) { fVar3 = local_a8.z + (std::fabsf(local_a8.x) / local_134.Tan()); if (0.0f < fVar3) { radius = fVar3; } } if ((uVar4 & 2) != 0) { fVar3 = local_a8.z + (std::fabsf(local_a8.y) / local_130.Tan()); if (radius < fVar3) { radius = fVar3; } } } if ((uVar4 & 0xc) != 0) { MTXMultVec(look_mtx, &pos2, &local_a8); if ((uVar4 & 4) != 0) { fVar3 = local_a8.z + (std::fabsf(local_a8.x) / local_134.Tan()); if (radius < fVar3) { radius = fVar3; } } if ((uVar4 & 8) != 0) { fVar3 = local_a8.z + (std::fabsf(local_a8.y) / local_130.Tan()); if (radius < fVar3) { radius = fVar3; } } } return radius; } /* 80165CC4-801660C8 .text groundHeight__9dCamera_cFP4cXyz */ f32 dCamera_c::groundHeight(cXyz* param_0) { dBgS_GndChk gndchk; gndchk.SetPos(param_0); f32 gnd_y = dComIfG_Bgsp()->GroundCross(&gndchk); dBgS_CamGndChk_Wtr gndchk_wtr; gndchk_wtr.SetPos(param_0); f32 wtr_y = dComIfG_Bgsp()->GroundCross(&gndchk_wtr); if (gnd_y >= wtr_y) { wtr_y = gnd_y; } if (wtr_y == C_BG_MIN_HEIGHT) { gnd_y = param_0->y; } else { gnd_y = wtr_y; } return gnd_y; } /* 80166230-80166354 .text lineBGCheck__9dCamera_cFP4cXyzP4cXyzP11dBgS_LinChkUl */ bool dCamera_c::lineBGCheck(cXyz* i_start, cXyz* i_end, dBgS_LinChk* i_linChk, u32 i_flags) { if (i_flags & 0x80) { i_linChk->ClrCam(); i_linChk->SetObj(); } else { i_linChk->ClrObj(); i_linChk->SetCam(); } i_linChk->Set(i_start, i_end, NULL); if (i_flags & 4) { i_linChk->ClrSttsRoofOff(); } else { i_linChk->SetSttsRoofOff(); } if (i_flags & 2) { i_linChk->ClrSttsWallOff(); } else { i_linChk->SetSttsWallOff(); } if (i_flags & 1) { i_linChk->ClrSttsGroundOff(); } else { i_linChk->SetSttsGroundOff(); } if (i_flags & 8) { i_linChk->OnWaterGrp(); } else { i_linChk->OffWaterGrp(); } if (dComIfG_Bgsp()->LineCross(i_linChk)) { return true; } else { return false; } } /* 80166354-80166740 .text lineBGCheck__9dCamera_cFP4cXyzP4cXyzP4cXyzUl */ bool dCamera_c::lineBGCheck(cXyz* i_start, cXyz* i_end, cXyz* o_cross, u32 i_flags) { dBgS_CamLinChk_NorWtr lin_chk; if (lineBGCheck(i_start, i_end, &lin_chk, i_flags)) { *o_cross = lin_chk.GetCross(); return true; } else { *o_cross = *i_end; return false; } } /* 80166740-80166A04 .text lineBGCheck__9dCamera_cFP4cXyzP4cXyzUl */ bool dCamera_c::lineBGCheck(cXyz* i_start, cXyz* i_end, u32 i_flags) { dBgS_CamLinChk_NorWtr lin_chk; return lineBGCheck(i_start, i_end, &lin_chk, i_flags); } /* 80166A04-80166CD4 .text lineBGCheckBack__9dCamera_cFP4cXyzP4cXyzUl */ bool dCamera_c::lineBGCheckBack(cXyz* i_start, cXyz* i_end, u32 i_flags) { dBgS_CamLinChk_NorWtr lin_chk; lin_chk.OnBackFlag(); lin_chk.OffFrontFlag(); return lineBGCheck(i_start, i_end, &lin_chk, i_flags); } /* 80166CD4-80166D00 .text lineBGCheckBoth__9dCamera_cFP4cXyzP4cXyzP11dBgS_LinChkUl */ bool dCamera_c::lineBGCheckBoth(cXyz* i_start, cXyz* i_end, dBgS_LinChk* i_linChk, u32 i_flags) { i_linChk->OnBackFlag(); i_linChk->OnFrontFlag(); return lineBGCheck(i_start, i_end, i_linChk, i_flags); } /* 80166D00-80166DE8 .text lineCollisionCheckBush__9dCamera_cFP4cXyzP4cXyz */ u32 dCamera_c::lineCollisionCheckBush(cXyz* i_start, cXyz* i_end) { u32 ret = 0; // Fakematch u32 result = g_dComIfG_gameInfo.play.mCcS.GetMassResultCam(); if (result & 2) { ret |= 1; } if (result & 4) { ret |= 2; } if (result & 8) { ret |= 4; } cM3dGCps cps; cps.Set(*i_start, *i_end, 30.0f); // Fakematch g_dComIfG_gameInfo.play.mCcS.SetMassCam(cps); return ret; } /* 80166DE8-80166EA4 .text sph_chk_callback__FP11dBgS_SphChkP10cBgD_Vtx_tiiiP8cM3dGPlaPv */ void sph_chk_callback(dBgS_SphChk* i_sphChk, cBgD_Vtx_t* i_vtxTbl, int i_vtxIdx0, int i_vtxIdx1, int i_vtxIdx2, cM3dGPla* i_plane, void* i_data) { /* Nonmatching - Code 100% */ camSphChkdata* sph_chk_data = (camSphChkdata*)i_data; f32 len = cM3d_SignedLenPlaAndPos(i_plane, &sph_chk_data->field_0x8); if (i_plane->getPlaneFunc(&sph_chk_data->field_0x14) >= -0.0001f && len < sph_chk_data->field_0x4) { cXyz normal = *i_plane->GetNP(); sph_chk_data->field_0x8 += normal * (sph_chk_data->field_0x4 - len); } } /* 80166EA4-80167294 .text compWallMargin__9dCamera_cFP4cXyzf */ cXyz dCamera_c::compWallMargin(cXyz* i_center, f32 i_radius) { dBgS_CamSphChk sph_chk; camSphChkdata sph_chk_data(i_center, i_radius); sph_chk_data.field_0x14 = m044; sph_chk.SetCallback(&sph_chk_callback); sph_chk.Set(*i_center, i_radius); if (dComIfG_Bgsp()->SphChk(&sph_chk, &sph_chk_data)) { return sph_chk_data.field_0x8; } else { return *i_center; } } /* 801674F4-801675E8 .text defaultTriming__9dCamera_cFv */ int dCamera_c::defaultTriming() { if (mTrimTypeForce >= 0) { mTrimSize = mTrimTypeForce; } else if (!is_player(mpPlayerActor)) { mTrimSize = 1; } else { switch (mCurMode) { case 12: if (chkFlag(0x1000)) { mTrimSize = 1; } else { mTrimSize = 0; } break; case 1: case 2: case 8: mTrimSize = 2; break; case 3: mTrimSize = 1; break; case 4: mTrimSize = 0; break; case 10: case 11: if (check_owner_action(mPadId, daPyStts0_UNK40000_e)) { mTrimSize = 2; } else if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_BOOMERANG_AIM_e | daPyStts0_ROPE_AIM_e | daPyStts0_HOOKSHOT_AIM_e | daPyStts0_BOW_AIM_e))) { mTrimSize = 1; } break; default: mTrimSize = 0; break; } } return mTrimSize; } /* 801675E8-801676C0 .text setView__9dCamera_cFffff */ void dCamera_c::setView(f32 i_xOrig, f32 i_yOrig, f32 i_width, f32 i_height) { dDlst_window_c* window = get_window(mpCamera); view_port_class* view_port = window->getViewPort(); window->setViewPort(i_xOrig, i_yOrig, i_width, i_height, view_port->mNearZ, view_port->mFarZ); window->setScissor(i_xOrig, i_yOrig, i_width, i_height); } /* 801676C0-80167F08 .text forwardCheckAngle__9dCamera_cFv */ cSAngle dCamera_c::forwardCheckAngle() { /* Nonmatching - regswap */ dBgS_CamLinChk_NorWtr lin_chk; cSAngle ret = cSAngle::_0; cSAngle local_1b8; cSAngle local_1bc; cXyz player_pos = positionOf(mpPlayerActor); f32 player_height; // suprisingly the `heightOf` function wasn't used here if (is_player(mpPlayerActor)) { player_height = ((daPy_py_c*)mpPlayerActor)->getHeight(); } else { player_height = (mpPlayerActor->eyePos.y - mpPlayerActor->current.pos.y) * 1.1f; } player_pos.y += player_height; cXyz cross; cSAngle local_1c0(mCamSetup.mBGChk.FwdChkAngle(0)); cSGlobe local_198(player_height * mCamSetup.mBGChk.FwdDistance(0), local_1c0.Val(), mDirection.U().Inv()); cXyz local_f4 = player_pos + local_198.Xyz(); if (lineBGCheck(&player_pos, &local_f4, &cross, 0x7f)) { cXyz local_100 = local_f4 - player_pos; if (local_100.abs() < 1.0f) { local_f4 = cross; } else { local_f4 = cross - local_100.norm() * mCamSetup.mBGChk.FwdBackMargin(); } } cross = local_f4; cross.y = player_height + groundHeight(&local_f4); cSGlobe local_1a0(cross - player_pos); if (local_1a0.V() >= cSAngle::_0) { local_1b8 = local_1a0.V() * mCamSetup.mBGChk.FwdWeightH(0); } else { local_1b8 = local_1a0.V() * mCamSetup.mBGChk.FwdWeightL(0); } cSAngle local_1c4(mCamSetup.mBGChk.FwdChkAngle(1)); cSGlobe local_1a8(player_height * mCamSetup.mBGChk.FwdDistance(1), local_1c4.Val(), mDirection.U().Inv()); cXyz local_10c = player_pos + local_1a8.Xyz(); if (lineBGCheck(&player_pos, &local_10c, &cross, 0x7f)) { cXyz local_100 = local_10c - player_pos; if (local_100.abs() < 1.0f) { local_10c = cross; } else { local_10c = cross - local_100.norm() * mCamSetup.mBGChk.FwdBackMargin(); } } cross = local_10c; cross.y = player_height + groundHeight(&local_10c); cSGlobe local_1b0(cross - player_pos); if (local_1b0.V() >= cSAngle::_0) { local_1bc = local_1b0.V() * mCamSetup.mBGChk.FwdWeightH(1); } else { local_1bc = local_1b0.V() * mCamSetup.mBGChk.FwdWeightL(1); } if (local_1b8 >= cSAngle::_0 && local_1bc >= cSAngle::_0) { // regswap here ret = local_1b8 >= local_1bc ? -local_1b8 : -local_1bc; } else if (local_1b8 <= cSAngle::_0 && local_1bc <= cSAngle::_0) { // and here ret = local_1b8 <= local_1bc ? -local_1b8 : -local_1bc; } else { ret = -local_1b8; } if (ret <= cSAngle::_0) { ret *= 0.75f; } return ret; } /* 80167F08-80168D44 .text bumpCheck__9dCamera_cFUl */ bool dCamera_c::bumpCheck(u32 i_flags) { /* Nonmatching - Code 100% */ static int prev_hit_type = 0; static int prev_plat1 = 0; static int prev_plat2 = 0; int curr_hit_type; int res = 0; f32 gaze_back_margin = mCamSetup.mBGChk.GazeBackMargin(); f32 corner_cushion = mCamSetup.mBGChk.CornerCushion(); f32 corner_angle_max_cos = cDegree(mCamSetup.mBGChk.CornerAngleMax()).Cos(); f32 wall_up_distance = mCamSetup.mBGChk.WallUpDistance(); if (is_player(mpPlayerActor)) { u32 grab_actor_id = static_cast(mpPlayerActor)->getGrabActorID(); if (grab_actor_id != -1) { fopAc_ac_c* grab_actor = fopAcM_SearchByID(grab_actor_id); if (grab_actor != NULL) { s16 proc_name = fopAcM_GetName(grab_actor); if (proc_name == PROC_TSUBO) { switch (daObj::PrmAbstract(grab_actor, daTsubo::Act_c::PRM_TYPE_W, daTsubo::Act_c::PRM_TYPE_S)) { case 1: case 2: case 3: case 4: case 7: case 8: case 13: case 14: case 15: wall_up_distance = 150.0f; break; default: wall_up_distance = 110.0f; break; } } else if (proc_name == PROC_NPC_MD) { wall_up_distance = 130.0f; } else if (proc_name == PROC_Obj_Try) { wall_up_distance = 200.0f; } else { wall_up_distance = 110.0f; } } } } cXyz eye = m050; cSGlobe direction = m03C; if (chkFlag(0x2000) && mpLockonTarget) { f32 sight_radius = radiusActorInSight(mpPlayerActor, mpLockonTarget); if (sight_radius > 0.0f) { if (sight_radius >= 3500.0f) { sight_radius = 3500.0f; } m14C += (sight_radius - m14C) * 0.33f; res |= 0x40; } else { m14C -= m14C * 0.08f; } f32 fVar15 = 1.0f; if (m108 < 10) { fVar15 = m108 / 10.0f; } direction.R(m14C * fVar15 + direction.R()); eye = m044 + direction.Xyz(); } if ((i_flags & 0x40) && m364 != 0) { cSGlobe cStack_3e4 = m36C - m044; if (direction.V() < cStack_3e4.V()) { cSAngle local_408 = mDirection.V(); local_408 += (cStack_3e4.V() - local_408) * 0.05f; direction.U(local_408); eye = m044 + direction.Xyz(); res |= 0x20; } } dBgS_CamLinChk_NorWtr lin_chk1; dBgS_CamLinChk_NorWtr lin_chk2; float fVar2; cXyz local_2fc; /* 0x2FC */ cXyz mid; /* 0x2F0 */ cXyz local_2e4; /* 0x2E4 */ cXyz cross_prod; /* 0x2D8 */ cXyz cross1; /* 0x2CC */ cXyz cross2; /* 0x2C0 */ cXyz local_2b4; /* 0x2B4 */ cXyz local_2a8; /* 0x2A8 */ cXyz local_29c; /* 0x29C */ cXyz local_290; /* 0x290 */ cXyz local_284; /* 0x284 */ cXyz local_278; /* 0x278 */ if (lineBGCheck(&mCenter, &eye, &lin_chk1, i_flags)) { cM3dGPla* plane1 = dComIfG_Bgsp()->GetTriPla(lin_chk1); cM3dGPla* plane2 = NULL; if ((i_flags & 0x20) == 0) { curr_hit_type = 2; } else { if (lineBGCheck(&eye, &mCenter, &lin_chk2, i_flags)) { plane2 = dComIfG_Bgsp()->GetTriPla(lin_chk2); float dot_prod = VECDotProduct(plane1->GetNP(), plane2->GetNP()); VECCrossProduct(plane1->GetNP(), plane2->GetNP(), &cross_prod); if (dot_prod > corner_angle_max_cos && std::fabsf(cross_prod.y) > 0.5f) { curr_hit_type = 3; } else if (prev_hit_type != 3) { curr_hit_type = 4; } else { curr_hit_type = 5; } } else if (prev_hit_type == 3 || prev_hit_type == 5) { curr_hit_type = 5; } else { curr_hit_type = 2; } } switch (curr_hit_type) { case 3: { res |= 2; cross1 = lin_chk1.GetCross(); cross2 = lin_chk2.GetCross(); mid = cross1 + (cross2 - cross1) * 0.5f; if (cM3d_2PlaneLinePosNearPos(*plane1, *plane2, &mid, &local_2fc)) { local_2e4 = *plane1->GetNP() + *plane2->GetNP(); m070 = local_2fc + local_2e4 * 2.0f; cSGlobe globe; globe.Val(m070 - mCenter); mDirection.R(direction.R()); mDirection.U(mDirection.V() + (globe.V() - mDirection.V()) * 0.05f); mDirection.V(mDirection.U() + (globe.U() - mDirection.U()) * corner_cushion); local_2b4 = mCenter + mDirection.Xyz(); globe.R(globe.R() + 50.0f); local_2a8 = mCenter + globe.Xyz(); if (!lineBGCheck(&mCenter, &local_2a8, 0x7f)) { if (lineBGCheck(&m070, &local_2b4, &lin_chk1, 0x7f)) { local_29c = lin_chk1.GetLinP()->GetEnd(); local_2b4 = compWallMargin(&local_29c, gaze_back_margin); } lineBGCheck(&mCenter, &local_2b4, &lin_chk1, i_flags); mEye = local_2b4; setFlag(0x80000); break; } curr_hit_type = 2; } // Fall-through } case 2: case 4: case 5: { setFlag(0x80); setFlag(0x80); local_290 = lin_chk1.GetLinP()->GetEnd(); local_284 = compWallMargin(&local_290, 0.5f + gaze_back_margin); local_278 = local_284; if (chkFlag(8) && (i_flags & 0x10) && curr_hit_type != 4) { float xyzDist = dCamMath::xyzHorizontalDistance(local_290, mCenter); float dVar14 = wall_up_distance - (mCenter.y - attentionPos(mpPlayerActor).y); if (!(xyzDist < 20.0f)) { if (xyzDist > 320.0f) { dVar14 = 0.0f; } else { dVar14 *= 1.0f - (xyzDist - 20.0f) / 300.0f; } } if (local_284.y - mCenter.y < dVar14) { local_2e4 = *plane1->GetNP(); cSGlobe globe(local_2e4); globe.U(globe.V() + cSAngle::_90); globe.R(dVar14 * globe.V().Sin()); local_284 += globe.Xyz(); if (lineBGCheck(&local_278, &local_284, &lin_chk1, i_flags)) { cXyz cross = lin_chk1.GetCross(); local_284 = compWallMargin(&cross, gaze_back_margin); mEye += (local_284 - mEye) * mCamSetup.mBGChk.WallCushion(); } else { mEye += (local_284 - mEye) * mCamSetup.mBGChk.WallCushion(); } setFlag(0x4000); } else { if (lineBGCheck(&local_278, &local_284, &lin_chk1, i_flags)) { cXyz cross = lin_chk1.GetCross(); local_284 = compWallMargin(&cross, gaze_back_margin); } mEye += (local_284 - mEye) * mCamSetup.mBGChk.WallBackCushion(); } } else { mEye = local_284; } int engine_idx = mCamParam.Algorythmn(); if ((engine_idx == 1) || (engine_idx == 10)) { cXyz attn_pos = attentionPos(mpPlayerActor); cSGlobe globe(mEye - attn_pos); if (globe.R() < 40.0f) { globe.R(40.0f); mEye = attn_pos + globe.Xyz(); } } mDirection.Val(mEye - mCenter); res |= 1; break; } default: mEye = eye; mDirection = direction; break; } } else { curr_hit_type = 0; if (chkFlag(0x4000)) { if (i_flags & 0x10) { fVar2 = mCamSetup.mBGChk.WallBackCushion(); } else { fVar2 = 0.2f; } mDirection.R(mDirection.R() + (m03C.R() - mDirection.R()) * fVar2); mDirection.U(mDirection.V() + (m03C.V() - mDirection.V()) * fVar2); mDirection.V(m03C.U()); mEye = mCenter + mDirection.Xyz(); if (lineBGCheck(&mCenter, &mEye, &lin_chk1, i_flags)) { cXyz cross = lin_chk1.GetCross(); mEye = compWallMargin(&cross, 0.5f + gaze_back_margin); } cSAngle acStack_440 = mDirection.V() - m03C.V(); corner_angle_max_cos = acStack_440.Degree(); if (std::fabsf(corner_angle_max_cos) < 0.2f) { clrFlag(0x4000); } } else { mEye = eye; mDirection = direction; } } if ((i_flags & 8) != 0) { float water_surface_height = getWaterSurfaceHeight(&mEye); if (water_surface_height > mEye.y) { mEye.y = water_surface_height; mDirection.Val(mEye - mCenter); res |= 8; } } prev_hit_type = curr_hit_type; if (m78B && (mCamParam.Algorythmn(mCurStyle) != 4 || !chkFlag(0x10000800))) { mEye.y += 25.0f; } return res != 0; } /* 80168EF0-801693AC .text getWaterSurfaceHeight__9dCamera_cFP4cXyz */ f32 dCamera_c::getWaterSurfaceHeight(cXyz* param_0) { /* Nonmatching - Code 100% */ f32 var_f31 = -1000000000.0f; cXyz spF8(*param_0); dBgS_RoofChk roofchk; roofchk.SetPos(spF8); f32 roof_y = dComIfG_Bgsp()->RoofChk(&roofchk); if (spF8.y < roof_y) { spF8.y = roof_y; } dBgS_CamGndChk_Wtr gndchk; gndchk.SetPos(&spF8); f32 gnd_y = dComIfG_Bgsp()->GroundCross(&gndchk) ; if (gnd_y + 5.0f > param_0->y) { var_f31 = gnd_y + 5.0f; } if (daSea_ChkArea(param_0->x, param_0->z)) { float waveHeight = daSea_calcWave(param_0->x, param_0->z) + 20.0f; if (waveHeight > param_0->y && waveHeight > var_f31) { var_f31 = waveHeight; } } if (var_f31 == -1000000000.0f) { var_f31 = param_0->y; } return var_f31; } /* 801693AC-80169528 .text checkSpecialArea__9dCamera_cFv */ void dCamera_c::checkSpecialArea() { /* Nonmatching - Code 100% */ static cXyz ofan(0.0f, -3650.0f, 0.0f); static f32 dfan = 1500.0f; static cXyz opixy(-180000.0f, 750.0f, -200000.0); static f32 dpixy = 2500.0f; cXyz player_pos = positionOf(mpPlayerActor); m787 = 0; if (m788 != 0 && dCamMath::xyzHorizontalDistance(ofan, player_pos) < dfan) { m787 = 1; } m786 = 0; if (m780 != 0 && dCamMath::xyzHorizontalDistance(opixy, player_pos) < dpixy) { m786 = 1; } } /* 80169528-8016A0F0 .text checkGroundInfo__9dCamera_cFv */ void dCamera_c::checkGroundInfo() { cXyz player_pos = positionOf(mpPlayerActor); cXyz gnd_chk_pos = player_pos; f32 player_height; // suprisingly the `heightOf` function wasn't used here if (is_player(mpPlayerActor)) { player_height = ((daPy_py_c*)mpPlayerActor)->getHeight(); } else { player_height = (mpPlayerActor->eyePos.y - mpPlayerActor->current.pos.y) * 1.1f; } player_pos.y += player_height; dBgS_RoofChk roof_chk; roof_chk.SetPos(gnd_chk_pos); f32 roof_y = dComIfG_Bgsp()->RoofChk(&roof_chk); if (gnd_chk_pos.y < roof_y) { gnd_chk_pos.y = roof_y; } dBgS_CamGndChk gnd_chk; gnd_chk.ClrCam(); gnd_chk.SetObj(); gnd_chk.SetPos(&player_pos); f32 ground_y = dComIfG_Bgsp()->GroundCross(&gnd_chk); mBG.m5C.m04.SetCam(); mBG.m5C.m04.ClrObj(); mBG.m5C.m04.SetPos(&player_pos); mBG.m5C.m58 = dComIfG_Bgsp()->GroundCross(&mBG.m5C.m04); if (mBG.m5C.m58 < ground_y) { mBG.m5C.m58 = ground_y; mBG.m5C.m04 = gnd_chk; } mBG.m5C.m00 = mBG.m5C.m58 != C_BG_MIN_HEIGHT; mBG.m00.m04.SetPos(&gnd_chk_pos); mBG.m00.m58 = dComIfG_Bgsp()->GroundCross(&mBG.m00.m04); mBG.m00.m00 = mBG.m00.m58 != C_BG_MIN_HEIGHT; m354 = mBG.m00.m58; if (mpPlayerActor->current.pos.y - mBG.m5C.m58 > mCamSetup.mBGChk.FloorMargin()) { m360 = 0; } else { m360 = 1; } m31D = 0; m33C = 0; if (dComIfG_Bgsp()->ChkMoveBG(mBG.m5C.m04)) { m33C = dComIfG_Bgsp()->GetActorPointer(mBG.m5C.m04.GetBgIndex()); if (m33C) { cXyz pos = positionOf(m33C); cSAngle angle = directionOf(m33C); if (m31C) { m320 = m32C - pos; m338 = m33A - angle; if (fopAcM_GetName(m33C) == PROC_Obj_Pirateship) { m044.y += m320.y * mCamSetup.mManualStartCThreshold; } } m31C = 1; if (!dComIfGp_evmng_cameraPlay() && !chkFlag(0x20000000) && m360) { m31D = 1; } if (m31D) { dComIfG_Bgsp()->MoveBgMatrixCrrPos(mBG.m5C.m04, true, &m044, NULL, NULL); dComIfG_Bgsp()->MoveBgMatrixCrrPos(mBG.m5C.m04, true, &m050, NULL, NULL); m03C.Val(m050 - m044); } m32C = pos; m33A = angle; } } else { m31C = 0; } if (mBG.m5C.m00) { m350 = dComIfG_Bgsp()->GetCamMoveBG(mBG.m5C.m04); } else { m350 = 0; } mRoomNo = -1; if (mBG.m00.m00 && check_owner_action(mPadId, daPyStts0_SWIM_e)) { mRoomMapToolCameraIdx = dComIfG_Bgsp()->GetPolyCamId(mBG.m00.m04.GetBgIndex(), mBG.m00.m04.GetPolyIndex()); } else if (m360 == 0) { mRoomMapToolCameraIdx = 0x1ff; } else if (mBG.m5C.m00) { mRoomMapToolCameraIdx = dComIfG_Bgsp()->GetRoomCamId(mBG.m5C.m04); if (mRoomMapToolCameraIdx == 0xff) { mRoomMapToolCameraIdx = dComIfG_Bgsp()->GetPolyCamId(mBG.m5C.m04.GetBgIndex(), mBG.m5C.m04.GetPolyIndex()); } else { mRoomNo = dComIfG_Bgsp()->GetRoomId(mBG.m5C.m04);; } } else { mRoomMapToolCameraIdx = 0xff; } if (daSea_ChkArea(player_pos.x, player_pos.z)) { m318 = daSea_calcWave(player_pos.x, player_pos.z); m314 = 1; } else { m318 = -1e+09; m314 = 0; } if (m354 < m318) { m354 = m318; } dBgS_GndChk gnd_chk_2; gnd_chk_2.SetPos(&mEye); cXyz pos1; cXyz pos2; if (dComIfG_Bgsp()->GroundCross(&gnd_chk_2) < mBG.m5C.m58 + 40.0f) { pos1 = mEye; pos2 = attentionPos(mpPlayerActor); pos2 += (pos1 - pos2) * 0.5f; } else { pos2 = mEye; pos1 = attentionPos(mpPlayerActor); pos1 += (pos2 - pos1) * 0.5f; } if (m360) { m364 = lineCollisionCheckBush(&pos1, &pos2) & 5; if (m364 & 4) { m368 = mCamSetup.m0C0; } if (m364 & 1) { m368 = mCamSetup.LockonChangeCushion(); } if (m364) { dComIfG_Ccsp()->GetMassCamTopPos(&m36C); } } else { m364 = 0; m368 = 0.0f; } } /* 8016A0F0-8016A110 .text followCamera2__9dCamera_cFl */ bool dCamera_c::followCamera2(s32 param_0) { return followCamera(param_0); } /* 8016A110-8016C4F8 .text followCamera__9dCamera_cFl */ bool dCamera_c::followCamera(s32 param_1) { bool bVar1; bool bVar2; bool bVar3; bool bVar4; int iVar5; float fVar37; f32 fVar40 = 0.9f; cSAngle acStack_490 = cSAngle(mCamSetup.m0A4); int iVar17 = mCamSetup.m0A8; f32 fVar38 = mCamSetup.mChargeLatitude; cSAngle local_494(80.0f); f32 dVar19 = mCamParam.Val(param_1, 1); f32 dVar20 = mCamParam.Val(param_1, 5); f32 dVar21 = mCamParam.Val(param_1, 0); f32 dVar22 = mCamParam.Val(param_1, 4); f32 dVar23 = mCamParam.Val(param_1, 3); f32 dVar24 = mCamParam.Val(param_1, 10); f32 dVar25 = mCamParam.Val(param_1, 0xb); f32 dVar26 = mCamParam.Val(param_1, 0xd); f32 dVar27 = mCamParam.Val(param_1, 0xe); f32 dVar28 = mCamParam.Val(param_1, 0xf); cSAngle local_498(mCamParam.Val(param_1, 0x10)); cSAngle local_49c(mCamParam.Val(param_1, 0x11)); f32 dVar29 = mCamParam.Val(param_1, 0x13); f32 dVar30 = mCamParam.Val(param_1, 0x12); f32 dVar31 = mCamParam.Val(param_1, 0x19); f32 dVar32 = mCamParam.Val(param_1, 0x1d); f32 dVar33 = mCamParam.Val(param_1, 0x17); f32 dVar34 = mCamParam.Val(param_1, 0x18); f32 dVar35 = mCamParam.Val(param_1, 0x14); dAttention_c& attention = dComIfGp_getAttention(); bVar2 = false; if (m108 == 0) { m3AC = 0; m3B0 = 0.0f; m3D9 = 0; } bVar1 = false; if (daNpc_Cb1_c::isFlying() || daNpc_Md_c::isFlying()) { bVar1 = true; } if (bVar1) { fVar40 = 0.66f; static f32 SA_FLY = 35.0f; if (dVar28 < SA_FLY) { dVar28 = SA_FLY; } m148 *= 0.33f; if (dVar24 < 420.0f) { dVar24 = 420.0f; } if (dVar25 < 350.0f) { dVar25 = 350.0f; } local_49c.Val(80.0f); if (daNpc_Cb1_c::isFlying() && m788) { if (m787) { if (local_498 < cSAngle(30.0f)) { local_498.Val(30.0f); } if (dVar28 < 50.0f) { dVar28 = 50.0f; } dVar24 = 800.0f; dVar25 = 600.0f; } else { if (local_498 < cSAngle(10.0f)) { local_498.Val(10.0f); } } } } if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_CRAWL_e | daPyStts0_SWIM_e))) { if (local_498 < cSAngle(4.0f)) { local_498.Val(4.0f); } if (dVar20 < -10.0f) { dVar20 = -10.0f; } } if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK200_e | daPyStts0_UNK100_e)) && !check_owner_action(mPadId, daPyStts0_UNK2000000_e)) { if (dVar21 > -10.0f) { m3B0 = -10.0f; } } else { m3B0 += ((dVar21 - m3B0) * 0.06f); } if (check_owner_action1(mPadId, daPyStts1_UNK40000_e)) { m148 = cSAngle::_0; dVar28 = -24.0f; dVar24 = dVar25 = 420.0f; dVar31 = 80.0f; dVar20 = 140.0f; bVar2 = true; } cSAngle acStack_4a0 = cSAngle::_0; if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK40_e | daPyStts0_UNK20_e))) { acStack_4a0 = calcPeepAngle(); if (check_owner_action(mPadId, daPyStts0_UNK20_e)) { dVar19 = -dVar19; } } if (mCamParam.Flag(param_1, dCamParam_UNK200)) { bVar2 = true; } if (!chkFlag(daPyStts0_SWIM_e) || !check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_BOOMERANG_AIM_e | daPyStts0_ROPE_AIM_e | daPyStts0_HOOKSHOT_AIM_e | daPyStts0_BOW_AIM_e))) { bVar3 = false; if (daNpc_Cb1_c::isFlying() || daNpc_Md_c::isFlying()) { bVar3 = true; } if (bVar3) { if (mStickMainPosXLast < -0.2f) { m3D9 = 1; } if (mStickMainPosXLast > 0.2f) { m3D9 = 0; } f32 temp_004 = 0.04f; if (m3D9) { fVar37 = -45.0f; } else { fVar37 = 45.0f; } m3AC += (fVar37 - m3AC) * temp_004; } else { m3AC += (dVar19 - m3AC) * 0.06f; } } cXyz local_314(m3AC, dVar20, m3B0); cXyz local_158; if (m108 == 0) { m03C.Val(m050 - m044); m378 = 'FLLW'; m394 = fVar40; m388 = 0x50; m398 = dVar25; m39C = dVar24; m38C = m392 = m390 = 0; m3A0 = m3BC = mDirection.V().Degree(); m3C0 = m044; m3CC = m050; m3E8 = m3E0 = m3E4 = 0.01f; m3DC = 0.75f; m3EC = dVar23; m3F0 = dVar22; m3B4 = 0; m3D8 = 1; m3A8 = m060; m3B8 = 0.0f; m3DA = 0; m3A4 = positionOf(mpPlayerActor).y; if (chkFlag(0x8000) || !m110) { m102 = 1; m101 = 1; m100 = 1; m37C = 1; } else { cXyz cStack_248 = relationalPos(mpPlayerActor, &local_314); cSAngle acStack_4a4; if (chkFlag(0x100000)) { acStack_4a4.Val(directionOf(mpPlayerActor).Inv()); } else { acStack_4a4.Val(m03C.V()); } cSGlobe cStack_46c(dVar24, cSAngle(dVar28), acStack_4a4); cXyz cStack_2fc = cStack_248 + cStack_46c.Xyz(); cXyz cStack_2e0 = mEye - cStack_2fc; dVar20 = cStack_2e0.abs(); cXyz cStack_314 = mCenter - cStack_2e0; dVar19 = cStack_314.abs() * 4.0f; if (dVar20 > dVar19) { dVar20 = dVar19; } else { dVar20 = 4.0f; } fVar37 = std::fabsf(dVar20); f32 playerHeight = heightOf(mpPlayerActor); if (fVar37 > 10.0f) { dVar20 = fVar37; } else { dVar20 = 10.0f; } m37C = (std::sqrtf(playerHeight / dVar20) * 3.8f) + 1; } m398 = m39C = mDirection.R(); m3A8 = mFovY; m380 = m37C * (m37C + 1) >> 1; m384 = 0.0f; } cXyz cStack_260 = relationalPos(mpPlayerActor, &local_314); cSAngle acStack_4a8 = directionOf(mpPlayerActor); cSAngle local_4ac = acStack_4a8 - m03C.V(); cStack_260.y = getWaterSurfaceHeight(&cStack_260); cM3dGPla* plane; cXyz cross; if (m100 == 0) { if (m31D != 0) { dComIfG_Bgsp()->MoveBgMatrixCrrPos(mBG.m5C.m04, true, &m3C0, NULL, NULL); } m384 = m37C - m108; f32 temp = (m384 / m380); m3C0 += (cStack_260 - m3C0) * temp; m044 += (m3C0 - m044) * dVar23; f32 xyzDist = dCamMath::xyzHorizontalDistance(cStack_260, m3C0); if (local_314.x > local_314.z) { local_314.z = local_314.x; } if (xyzDist < std::fabsf(local_314.z) + 20.0f) { cXyz cStack_26c = attentionPos(mpPlayerActor); cStack_26c.y -= 15.0f; dBgS_CamLinChk_NorWtr lin_chk; if (lineBGCheck(&cStack_26c, &m044, &lin_chk, 0x7f)) { plane = dComIfG_Bgsp()->GetTriPla(lin_chk); m044 = lin_chk.GetCross(); m044 += plane->mNormal; } } dVar29 = limitf(m03C.R(), dVar25, dVar24); cSAngle local_4b0 = m03C.U(); if (local_4b0 < local_498) { local_4b0 = local_498; } if (local_49c > local_4b0) { local_4b0 = local_49c; } cSGlobe local_474(dVar29, local_4b0, cSAngle(mAngleY.Inv())); m03C.R(m03C.R() + fVar40 * (local_474.R() - m03C.R())); m03C.V(m03C.U() + ((local_474.U() - m03C.U()) * fVar40)); if (chkFlag(0x100000)) { m03C.U(m03C.U() + ((acStack_4a8.Inv() - m03C.U()) * fVar40)); } m3CC = m050 = m044 + m03C.Xyz(); if (m37C <= m108) { m102 = 1; m101 = 1; m100 = 1; } m3A0 = m03C.V().Degree(); m39C = m03C.R(); //m398 = pfVar14; m060 += (fVar40 * (dVar31 - m060)); m380 -= m384; return true; } cXyz player_pos = positionOf(mpPlayerActor); player_pos.y += 10.0f; fVar37 = mpPlayerActor->current.pos.y; fVar37 -= groundHeight(&player_pos); if (m360 && (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_SWIM_e)) || daNpc_kam_c::m_hyoi_kamome == 0 || check_owner_action(mPadId, 0x200))) { if (m388 < 0x50) { m388++; local_158.x = 176.0f; local_158.y = m388; m394 += (fVar40 - m394) * dCamMath::rationalBezierRatio(m388 / 80.0f, 1.25f); } } else { m394 = 0.0F; m388 = 0; } if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK4000000_e | daPyStts0_UNK2000000_e | daPyStts0_UNK800000_e | daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e)) || (check_owner_action1(mPadId, daPyStts1_UNK10000_e) && mDMCSystem.field_0x0 == 0)) { setDMCAngle(); } if ((check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK2000000_e | daPyStts0_UNK100_e | daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e)) && check_owner_action1(mPadId, daPyStts1_UNK10000_e)) || (cSAngle::_270 < local_4ac && local_4ac < cSAngle::_90)) { m3EC = dVar23; } else { m3EC = 0.1f; } if (m388 == 0) { m3F0 = dVar22; } else { m3F0 = dVar22 * 0.1f + (1.0f - (dVar22 * 0.1f)) * m394; if (chkFlag(0x100000) || m3EC <= 0.25f) { bVar3 = false; if (daNpc_Cb1_c::isFlying() || daNpc_Md_c::isFlying()) { bVar3 = true; } if (!bVar3 && check_owner_action1(mPadId, daPyStts1_UNK40000_e)) goto LAB_8016b24c; } m3EC = m394 * 0.75f + 0.25f; } LAB_8016b24c: cXyz cStack_284(m3EC, m3F0, m3EC); bVar4 = true; bVar3 = false; if (chkFlag(0x80) && (mDirection.R() < dVar25)) { bVar3 = true; } if (chkFlag(0x100000) || check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK4000000_e | daPyStts0_UNK2000000_e | daPyStts0_UNK800000_e | daPyStts0_TELESCOPE_LOOK_e | daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e)) || check_owner_action1(mPadId, daPyStts1_UNK10000_e | daPyStts1_DEKU_LEAF_FAN_e) || m388) { bVar4 = false; } if (mCurMode == 1) { if (cStack_260.y < attentionPos(mpPlayerActor).y + 50.0f) { cSGlobe cStack_47c(dVar25, 0, directionOf(mpPlayerActor).Inv()); cXyz cStack_290 = attentionPos(mpPlayerActor); cXyz cStack_29c = cStack_290 + cStack_47c.Xyz(); if (lineBGCheck(&cStack_290, &cStack_29c, 0x7f)) { cStack_260.y = cStack_290.y + 50.0f; } } } cXyz cStack_3c8 = cStack_260 - m044; m044 += cStack_3c8 * cStack_3c8; if (m780) { cXyz attn_pos = attentionPos(mpPlayerActor); if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_CRAWL_e | daPyStts0_SWIM_e | daPyStts0_UNK100_e))) { attn_pos.y = eyePos(mpPlayerActor).y + 30.0f; } else { attn_pos.y -= 15.0f; } dBgS_CamLinChk_NorWtr lin_chk; if (lineBGCheck(&attn_pos, &m044, &lin_chk, 0x7f)) { plane = dComIfG_Bgsp()->GetTriPla(lin_chk); m044 = lin_chk.GetCross(); m044 += plane->mNormal; } } cSGlobe local_484(m050 - m044); if (m392 <= 0 || iVar17 <= m392) { dVar20 = dCamMath::rationalBezierRatio((float) iVar5 / (float)iVar17, fVar38); m3D8 = 1; m3B8 = (1.0f - m3B8.Val()) * dVar20; } else if (chkFlag(0x100000) || daNpc_Cb1_c::isFlying()) { if (m3D8) { m3B8 = 0.05f; } m3D8 = 0; m3B8 += (1.0f - m3B8.Val()) * 0.2f; } else if (daNpc_Md_c::isFlying() || daNpc_kam_c::m_hyoi_kamome) { m3D8 = 1; } else if (check_owner_action1(mPadId, check_owner_action1(mPadId, daPyStts1_UNK40000_e | daPyStts1_DEKU_LEAF_FAN_e))) { if (m3D8) { m3B8 = 0.05f; } m3D8 = 0; m3B8 += (0.5f - m3B8.Val()) * 0.05f; } else { m3D8 = 1; if (mDMCSystem.field_0x0) { m3B8 = 0.0f; } else if (mStickMainPosYLast >= 0.0f) { m3B8 = 1.0f - ((cSAngle(dCamMath::rationalBezierRatio(mStickMainPosXLast, dVar33) * 180.0f).Cos() * 0.5f) + 0.5f); } else { m3B8 = 1.0f - ((cSAngle(dCamMath::rationalBezierRatio(mStickMainPosXLast, dVar34) * 180.0f).Cos() * 0.25f) + 0.75f); } m3B8 *= mStickMainValueLast; if (chkFlag(0x80000)) { m3B8 *= 0.5f; } else { m3B8 *= 0.1f; } if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK2000000_e | daPyStts0_UNK100_e)) || check_owner_action1(mPadId, check_owner_action1(mPadId, daPyStts1_UNK10000_e))) { if (m38C == 0) { if (local_4ac > cSAngle::_270 && local_4ac < cSAngle::_90) { m38C = 1; } else { m38C = -1; } } else if (m38C < 0) { m38C--; if (m38C <= -0x20) { m38C = 0x10; } } else if (m38C < 0xf) { m3B8 = m38C * 0.033333335f; m38C++; } else if (!check_owner_action(mPadId, daPyStts0_UNK2000000_e)) { if (mStickMainValueLast < 0.1f) { m3B8 = 0.05f; } else { m3B8 = dCamMath::rationalBezierRatio(std::fabsf(local_4ac.Sin()), 12.0f); } } } else if (bVar1) { if (m38C == 0 && (local_4ac <= cSAngle::_270 || local_4ac >= cSAngle::_90)) { m38C = 1; } else if (m38C < 0xf) { m3B8 = iVar5 * 0.033333335f; m38C++; } else if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK40_e | daPyStts0_UNK20_e))) { m3B8 = 0.15f; } else if (mStickMainValueLast < 0.1f) { m3B8 = 0.05f; } else { m3B8 = dCamMath::rationalBezierRatio(std::fabsf(local_4ac.Sin()), 12.0f); } } else { m3B8 *= dVar35; m38C = 0; } } cSAngle acStack_4b4; if (chkFlag(0x80) && !chkFlag(0x80000) && mCurMode == 0 && m38C == 0) { acStack_4b4 = cSAngle(mDirection.U().Val()); } else if (bVar1) { acStack_4b4 = acStack_4a8; if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK40_e | daPyStts0_UNK20_e))) { acStack_4b4 += acStack_4a0; } } else { acStack_4b4 = acStack_4a8.Inv(); } cSAngle acStack_4b8 = cSAngle((s16)0); cSAngle acStack_51c = (acStack_4b4 - local_484.V()) * m3B8.Degree() * local_484.U().Cos(); m03C.U(local_484.V() + acStack_51c + acStack_4b8); cSAngle local_4bc; if (check_owner_action1(mPadId, daPyStts1_UNK20000_e)) { if (m392 <= iVar17) { local_4bc = acStack_490; m3E0 = dCamMath::rationalBezierRatio((float)m392 / (float)iVar17, fVar38); setFlag(0x4000000); m392++; } else { local_4bc = acStack_490; m3E0 = 1.0f; } m3BC = m3A0 = local_4bc.Degree(); } else { if (m392 != 0) { m3E0 = 0.0f; } m392 = 0; if (mCurMode == 1) { m3E0 = 0.5f; m3BC = m3A0 = m3A0 + (m3B8.Val() * (dVar28 - m3A0)); local_4bc = cAngle::d2s(m3A0); m3E0 += (fVar40 - m3E0) * 0.5f; } else if (m388 == 0) { m3BC += dVar27 * (dVar28 - m3BC); dVar20 = 0.01f; if (m3B4 != 0) { dVar20 = 0.25f; dVar29 = dVar20; } m3A0 += dVar29 * ((m3BC + m148.Degree()) - m3A0); local_4bc = cAngle::d2s(m3A0); if (chkFlag(0x80000)) { m3E0 = 0.0f; } else if (m3B4) { m3E0 += dVar20 * (fVar40 - m3E0); } else if (mMonitor.mPos.y < 0.01f && mCurMode == 0) { m3E0 += (0.1f - m3E0) * 0.05f; } else { m3E0 += dVar20 * (fVar40 - m3E0); } } else { if (check_owner_action(mPadId, daPyStts0_UNK2000000_e) || check_owner_action1(mPadId, daPyStts1_UNK10000_e)) { local_4bc = acStack_51c; m3BC = m3A0 = local_4bc.Degree(); m3E0 = 0.95f; } else if (isPlayerFlying(mPadId) || daNpc_kam_c::m_hyoi_kamome) { local_4bc = acStack_51c; if (m3A4 < positionOf(mpPlayerActor).y) { m3E0 = dCamMath::rationalBezierRatio(m394, dVar30); } else { m3E0 += (0.75f - m3E0) * 0.15f; } m3BC = m3A0 = local_4bc.Degree(); } else { local_4bc = acStack_51c; m3BC = m3A0 = local_4bc.Degree(); m3E0 = dCamMath::rationalBezierRatio(m394, dVar30); } } } m3A4 = positionOf(mpPlayerActor).y; if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK2000000_e | daPyStts0_UNK100_e | daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e) || check_owner_action1(mPadId, daPyStts1_UNK10000_e))) { m3B4 = 1; } else { m3B4 = 0; } if (local_4bc < local_498) { local_4bc.Val(local_498); } else if (local_4bc > local_49c) { local_4bc.Val(local_49c); } m03C.V(m03C.U() + ((local_4bc - m03C.U()) * m3E0)); if (local_494 > m03C.U()) { m03C.V(local_494); } m398 += dVar27 * (dVar25 - m398); m39C += dVar27 * (dVar24 - m39C); if (m398 < local_484.R()) { m3DC += (dVar26 - m3DC) * 0.01f; local_484.R(m398); } else if (local_484.R() > m39C) { m3DC += (dVar26 - m3DC) * 0.01f; local_484.R(m39C); } else { m3DC = 1.0f; } m03C.R(m03C.R() + m3DC * (local_484.R() - m03C.R())); m3CC = m044 + m03C.Xyz(); if (bVar3 && bVar4 && mCamParam.Flag(param_1, dCamParam_UNK001)) { cSGlobe cStack_48c(m03C); cStack_48c.V(cSAngle(dVar28)); cXyz cStack_2b4 = m044 + cStack_48c.Xyz(); if (lineBGCheck(&m044, &cStack_2b4, 0x7f)) { setFlag(8); } } m050 += (m3CC - m050) * 0.75f; m03C.Val(m050 - m044); if (chkFlag(8)) { m3DA = 1; } m3E8 += (dVar32 - m3E8) * 0.01f; m060 += m3E8 * (dVar31 - m060); if (check_owner_action1(mPadId, daPyStts1_DEKU_LEAF_FAN_e)) { m060 += cM_rndFX(mCamSetup.m078); } if (isPlayerFlying(mPadId) || daNpc_kam_c::m_hyoi_kamome) { if (fVar37 < 200.0f) { fVar37 = fVar37 / 200.0f; fVar40 = mStickMainPosXLast * fVar37; fVar38 = 1.0f - fVar37 * 0.96f; } else { fVar40 = mStickMainPosXLast; fVar38 = 0.04f; } m060 += mCamSetup.m07C * cSAngle((s16)(m07C << 7)).Sin(); m05C += (cSAngle(fVar40 * mCamSetup.FanBank()) - m05C) * fVar38; setFlag(0x400); } return 1; } /* 8016C55C-8016C578 .text eyePos__9dCamera_cFP10fopAc_ac_c */ cXyz dCamera_c::eyePos(fopAc_ac_c* i_actor) { return i_actor->eyePos; } /* 8016C5A4-8016C5D0 .text heightOf__9dCamera_cFP10fopAc_ac_c */ f32 dCamera_c::heightOf(fopAc_ac_c* i_actor) { /* Nonmatching - Code 100% */ if (is_player(i_actor)) { return ((daPy_py_c*)i_actor)->getHeight(); } else { return (i_actor->eyePos.y - i_actor->current.pos.y) * 1.1f; } } /* 8016C618-8016D824 .text lockonCamera__9dCamera_cFl */ bool dCamera_c::lockonCamera(s32 param_1) { /* Nonmatching - Lots of conficts between the asm produced by this function and `followCamera` regarding class member types */ int iVar15 = mCamSetup.ChargeTimer(); f32 fVar22 = mCamSetup.ChargeBRatio(); cSAngle local_250 = cSAngle(mCamSetup.m0A4); int iVar16 = mCamSetup.m0A8; f32 fVar1 = mCamSetup.ChargeLatitude(); f32 fVar2 = mCamParam.Val(param_1 ,dCamStyleParam_UNK4); f32 fVar21 = mCamParam.Val(param_1 ,dCamStyleParam_UNK3); if (m108 == 0) { m100 = 1; m101 = 1; m102 = 1; m378 = 'LOCK'; m380 = 0; m384 = 1.0f; m38C = 0; m588 = 0; m390 = m044.x; m394 = m044.y; m398 = m044.z; cXyz cStack_150 = m044 - attentionPos(mpPlayerActor); //m3A8.Val() //cSGlobe::Val((cSGlobe *)&this->field304_0x3a8,&cStack_150); m3A0 = m39C = 0.0f; m3B8 = mCamSetup.Cushion4Base(); m388 = 0; m3A0 = 0; m3A4 = 0; if (mpLockonTarget) { radiusActorInSight(mpPlayerActor, mpLockonTarget); } } if (m31D != 0) { dComIfG_Bgsp()->MoveBgMatrixCrrPos(mBG.m5C.m04, true, &m36C, NULL, NULL); } if (dComIfGp_getAttention().LockonTruth() && check_owner_action(mPadId, daPyStts0_BOOMERANG_WAIT_e)) { m38C = 1; } else { m38C = 0; } if (check_owner_action(mPadId, daPyStts0_UNK400_e)) { m38C = 0; } else { if (m38C) { dComIfGp_getVibration().StartShock(2, 0x10, cXyz(0.0f, 1.0f, 0.0f)); } m38C = 1; } bool bVar6 = true; if (dComIfGp_getAttention().chkFlag(1 << 3) >> 3 && dComIfGp_getAttention().chkFlag(20)) { bVar6 = false; } if (bVar6) { m11C = 0; m108 = 0; clrFlag(0x100); } f32 fVar3 = mCamSetup.CurveWeight(); f32 fVar4; f32 dVar17 = dComIfGp_getAttention().LockonReleaseDistanse(); f32 dVar20 = 10000.0f; cSGlobe local_230; if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e))) { if (mpLockonTarget) { local_230.Val(mCamSetup.ParallelDist(), cSAngle::_0, directionOf(mpPlayerActor)); fVar4 = 1.0f; } else { cXyz local_f0 = attentionPos(mpLockonTarget); cXyz local_fc = attentionPos(mpPlayerActor); if (fopAcM_GetName(mpLockonTarget) == PROC_BDK) { local_f0.x = positionOf(mpLockonTarget).x; local_f0.z = positionOf(mpLockonTarget).z; } local_230.Val(local_f0 - local_fc); fVar4 = local_230.R() / dVar17; if (fVar4 > 1.0f) { fVar4 = 1.0f; } dVar20 = dCamMath::xyzHorizontalDistance(local_f0, local_fc); } } else { local_230.Val(mCamSetup.ParallelDist(), 0, directionOf(mpPlayerActor).Inv()); fVar4 = 1.0f; mpLockonTarget = NULL; } cSAngle acStack_254 = local_230.U(); cSAngle local_258 = mCamParam.LockonLongitude(fVar4); if (m11C < iVar15 && chkFlag(0x100)) { local_258 *= (float)m108 / (float)iVar15; } else if (iVar15 <= m11C) { setFlag(0x100); } cSAngle local_25c = m03C.U().Inv() - acStack_254; if (local_25c < cSAngle::_0) { m38C = 0; acStack_254 -= local_258; local_25c = -acStack_254; } else { m38C = 1; acStack_254 += local_258; } cXyz local_108 = attentionPos(mpPlayerActor); bVar6 = false; if (chkFlag(0x80080)) { cXyz local_114 = attentionPos(mpPlayerActor); if (pointInSight(&local_114)) { if (m388 == 0) { int iVar10 = -m38C + 1; m390 = iVar10 - (-m38C + (iVar10 == 0)); } bVar6 = true; m388 = 0x3c; } } if (lineBGCheckBack(&m044, &local_108, 0x7f) && lineBGCheck(&m050, &m044, 0x7f)) { bVar6 = true; m388 = 0x3c; } if (m388) { m388--; if (m388 && mStickMainValueLast <= 0.1f) { m388 = 1; } bVar6 = true; } f32 fVar5 = mStickCPosYLast; dCamMath::customRBRatio(mCamParam.RadiusRatio(m03C.R()), fVar3); if (chkFlag(0x10)) { fVar3 = 0.01f; m3B8 = 0.01f; } else if (m360) { fVar3 = mCamSetup.Cushion4Base(); } else { fVar3 = mCamSetup.Cushion4Jump(); } m3B8 += (fVar3 - m3B8.Val()) * mCamSetup.CusCus(); m390 = local_108.x; m398 = local_108.z; if (bVar6) { dVar17 = mCamParam.LockonCenterHeight(fVar4); } else { dVar17 = mCamParam.LockonCenterHeight(fVar4) + 25.0f; } m398 += m3B8 * ((local_108.y + dVar17) - m398); dVar17 = local_230.R(); f32 dVar19; if (mpLockonTarget) { f32 dVar18 = local_25c.Cos(); dVar19 = (local_230.U() * 1.3f).Cos(); if (std::fabsf(dVar18) < std::fabsf(dVar19)) { dVar19 = dVar18; } dVar19 = (local_230.R() - dVar17 * 0.05f * 2.0f) * std::fabsf(dVar19 * -0.5f + 0.5f); } else { dVar19 = local_230.R() * std::fabsf(local_25c.Cos() * -0.5f + 0.5f); } cSAngle acStack_260 = local_230.U(); m3E8 += (fVar21 - m3E8) * mCamSetup.CusCus(); m3E0 += (fVar2 - m3E0) * mCamSetup.CusCus(); cSAngle temp(m3E0 + 2); cSAngle acStack_264 = temp + (acStack_260 - temp) * m3E8; cSAngle acStack_268; if (bVar6) { fVar2 = m3A8 * 0.75f; acStack_268.Val(m534 + (local_230.U() - m534) * 0.05f); } else { fVar2 = m3A8 + m3E4 * (m384 * (dVar19 + dVar17 * 0.05f) - m3A8); acStack_268.Val(m534 + m3E8 * (local_230.U() - m534)); } //m3A8.Val(fVar2, acStack_268, acStack_264); //m044 = m390 + m3A8.Xyz(); if (mpLockonTarget && mLockOnActorId != -1) { cXyz local_120 = attentionPos(mpPlayerActor); if (lineBGCheck(&local_120, &m044, 0x7f)) { ForceLockOff(mLockOnActorId); } } cSGlobe cStack_238(mEye - m044); cSGlobe local_240(m050 - m044); cSAngle acStack_26c(m03C.V()); cSAngle local_270(m03C.U()); fVar2 = m03C.R(); cSAngle local_274 = local_25c - local_258; fVar21 = mCamSetup.m044; if (bVar6) { cSAngle acStack_278; if (m514 == 1) { acStack_278.Val(15.0f); } else { acStack_278.Val(-15.0f); } acStack_26c += (m03C.U().Inv() + acStack_278 - acStack_26c) * 0.05f; } else { if (!mpLockonTarget) { dVar17 = mCamSetup.m028; } else if (!chkFlag(0x100)) { int iVar10 = local_258.Val(); if (local_258 == cSAngle::_0) { dVar17 = 0.15f; } else { f32 fVar7 = m11C; fVar3 = mCamParam.Val(param_1, dCamStyleParam_UNK15); fVar3 *= dCamMath::customRBRatio(-((float)local_274.Val() / (float)iVar10), fVar21); dVar17 = (fVar3 + (1.0f - fVar7 / (float)iVar15) * (fVar22 - fVar3)); } } else { iVar15 = local_258.Val(); if (local_25c.Val() < iVar15) { fVar22 = mCamParam.Val(param_1, dCamStyleParam_UNK15); fVar21 = dCamMath::customRBRatio(-((float)local_274.Val() / (float)iVar15), fVar21); dVar17 = fVar22 * fVar21; } else { cSAngle local_27c(45.0f); cSAngle local_2d8(135.0f); if (local_258 < local_2d8) { local_27c = cSAngle::_180 - local_258; } dVar17 = mCamParam.Val(param_1, dCamStyleParam_UNK20) * dCamMath::rationalBezierRatio((float)local_274.Val() / (float)local_27c.Val(), fVar21); if (dVar20 < 100.0f) { dVar17 *= dCamMath::rationalBezierRatio(dVar20 / 100.0f, 1.0f); } } } local_274 = acStack_254.Inv() - m03C.U(); local_274.Degree(); acStack_26c += local_274 * dVar17; } if (check_owner_action1(mPadId, daPyStts1_UNK20000_e)) { iVar15 = m380; if (iVar15 <= iVar16) { f32 bezier_ratio = dCamMath::rationalBezierRatio((float)iVar15 / (float)iVar16, fVar1); local_270 += (local_250 - local_270) * bezier_ratio; setFlag(0x4000000); m380++; } else { local_270 = local_250; } } else { if (bVar6) { local_270 -= (local_230.U() * 0.7f + local_270) * 0.1f; } else { m380 = 0; if (chkFlag(0x10)) { local_270 += (mCamParam.LockonLatitude(fVar4) - local_270) * 0.05f; } else if (!m360 && !check_owner_action(mPadId, daPyStts0_UNK400_e)) { //dVar17 = m3A8.V().Cos(); local_270 += (local_240.U() - local_270) * (1.0f - std::fabsf(fVar5)) * std::fabsf(dVar17); } else { fopAc_ac_c* playerActor; if (is_player(mpPlayerActor)) { playerActor = fopAcM_SearchByID(fopAcM_GetID(mpPlayerActor)); } else { playerActor = NULL; } if (mpLockonTarget == playerActor && m784) { local_270 -= local_270 * mCamSetup.m028; } else { local_270 += (mCamParam.LockonLatitude(fVar4) - local_270) * mCamSetup.m028; } if (mpLockonTarget && check_owner_action(mPadId, daPyStts0_UNK400_e)) { cXyz local_12c = attentionPos(mpLockonTarget); cXyz local_138 = attentionPos(mpPlayerActor); local_138.y = 0.0f; local_12c.y = 0.0f; local_12c = local_12c - local_138; fVar22 = local_12c.abs(); } } if (check_owner_action(mPadId, daPy__PlayerStatus0(daPyStts0_UNK1000000_e | daPyStts0_SHIP_RIDE_e))) { dVar17 = local_270.Degree(); if (dVar17 < mCamParam.Val(param_1, dCamStyleParam_UNK16)) { local_270.Val(mCamParam.Val(param_1, dCamStyleParam_UNK16)); } if (dVar17 > mCamParam.Val(param_1, dCamStyleParam_UNK17)) { local_270.Val(mCamParam.Val(param_1, dCamStyleParam_UNK17)); } } else { s16 local_284 = local_270; if (!mCamSetup.CheckLatitudeRange(&local_284)) { local_270.Val(local_284); } } } } if (bVar6) { fVar22 = fVar2 + (280.0f - fVar2) * 0.05f; } else { f32 local_244 = local_240.R(); if (mCamParam.DefaultRadius(&local_244)) { fVar22 = fVar2 + (fVar22 - fVar2) * 0.05f; } } m03C.Val(fVar22, local_270, acStack_26c); m044 = m044 + m03C.Xyz(); m060 += (mCamParam.LockonFovy(fVar4) - m060) * mCamSetup.m028; setFlag(0x2000); return true; } /* 8016D824-8016D880 .text getMsgCmdSpeaker__9dCamera_cFv */ fopAc_ac_c* dCamera_c::getMsgCmdSpeaker() { dComIfG_MesgCamInfo_c* info = dComIfGp_getMesgCameraInfo(); fopAc_ac_c* actor = NULL; int idx; if (info->mBasicID >= 1 && info->mBasicID <= 10) { idx = info->mBasicID - 1; actor = info->mActor[idx]; } if (info->mID >= 1 && info->mID <= 10) { idx = info->mID - 1; actor = info->mActor[idx]; } return actor; } /* 8016D880-8016D8D0 .text getMsgCmdCut__9dCamera_cFv */ int dCamera_c::getMsgCmdCut() { dComIfG_MesgCamInfo_c* info = dComIfGp_getMesgCameraInfo(); int res = 0; if (!(info->mBasicID >= 1 && info->mBasicID <= 10) && info->mBasicID > 0) { res = info->mBasicID; } if (!(info->mID >= 1 && info->mID <= 10) && info->mID > 0) { res = info->mID; } return res; } /* 8016D8D0-80170434 .text talktoCamera__9dCamera_cFl */ bool dCamera_c::talktoCamera(s32) { /* Nonmatching */ } namespace { static void hideActor(fopAc_ac_c* actor) { fopAcM_OnStatus(actor, fopAcStts_NODRAW_e); } static bool lineCollisionCheck(cXyz param_1, cXyz param_2, fopAc_ac_c* param_3, fopAc_ac_c* param_4) { return dComIfG_Ccsp()->ChkCamera(param_1, param_2, 15.0f, param_3, param_4); } } /* 80170490-801708E0 .text CalcSubjectAngle__9dCamera_cFPsPs */ bool dCamera_c::CalcSubjectAngle(s16* param_1, s16* param_2) { f32 fVar1; f32 fVar2; f32 fVar3; f32 fVar4; f32 fVar5; f32 fVar6; f32 dVar11; f32 dVar12; bool bVar9 = true; if (dComIfGp_evmng_cameraPlay() && dComIfGp_getMiniGameType() != 8) { return false; } if (m378 != 'SUBJ') { return false; } if (!m100) { return false; } if (!m37C) { bVar9 = false; } fVar1 = mCamParam.Val(m380, 19); fVar2 = mCamParam.Val(m380, 24); fVar3 = mCamParam.Val(m380, 21); fVar4 = mCamSetup.m030; if (!bVar9) { cSAngle local_88(fVar2 * m384); cSAngle local_8c(fVar1 * m388); s16 local_98 = local_88.Val() + m3BA; *param_2 = local_98; *param_1 = local_8c.Val(); } fVar6 = g_mDoCPd_cpadInfo[mPadId].mMainStickPosX; fVar5 = g_mDoCPd_cpadInfo[mPadId].mMainStickPosY; if (is_player(mpPlayerActor)) { m3B8 = ((daPy_py_c*)mpPlayerActor)->getBodyAngleX(); } else { m3B8 = mpPlayerActor->shape_angle.x; } m3BA = mpPlayerActor->shape_angle.y; f32 f1; if (fVar6 > 0.7f) { f1 = 1.0f; } else if (fVar6 < -0.7f) { f1 = -1.0f; } else { f1 = fVar6 / 0.7f; } f32 f3; if (fVar5 > 0.7f) { f3 = 1.0f; } else if (fVar5 < -0.7f) { f3 = -1.0f; } else { f3 = fVar5 / 0.7f; } fVar5 = f3; f32 f2 = 5.0f; if ((mEye.y <= m354 + f2 || mEye.y <= mBG.m5C.m58 + f2) && ((m388 >= 0.0f && f3 > 0.0f) || (m388 < 0.0f && f3 <= 0.0f))) { fVar5 = 0.0f; } if (check_owner_action(mPadId, daPyStts0_CRAWL_e)) { fVar5 = 0.0f; } if (!check_owner_action(mPadId, daPyStts0_UNK40000_e)) { if (mCamParam.Flag(m380, dCamParam_UNK020)) { m384 = -f1; m388 = fVar5; } else { dVar11 = dCamMath::rationalBezierRatio(f1, mCamSetup.CurveWeight()); dVar12 = dCamMath::rationalBezierRatio(fVar5, mCamSetup.CurveWeight()); if (check_owner_action(mPadId, daPyStts0_UNK2000_e)) { m384 = -dVar11 * fVar3; m388 += dVar12 * fVar3; } else { if (mCamParam.Flag(m380, dCamParam_UNK010)) { f32 temp = fVar3 - (m38C * (fVar3 * fVar4)); m384 = -dVar11 * temp; m388 += dVar12 * temp; } else { m384 = -dVar11 * fVar3; m388 += dVar12 * fVar3; } } if (m384 > 1.0f) { m384 = 1.0f; } if (m384 < -1.0f) { m384 = -1.0f; } if (m388 > 1.0f) { m388 = 1.0f; } if (m388 < -1.0f) { m388 = -1.0f; } } } else { m384 = 0.0f; } cSAngle local_90(fVar2 * m384); cSAngle local_94(fVar1 * m388); s16 local_a8 = local_90.Val() + m3BA; *param_2 = local_a8; *param_1 = local_94.Val(); m37D = 0; return bVar9; } /* 801708E0-801719C4 .text subjectCamera__9dCamera_cFl */ bool dCamera_c::subjectCamera(s32) { /* Nonmatching */ } /* 801719C4-80172C20 .text towerCamera__9dCamera_cFl */ bool dCamera_c::towerCamera(s32) { /* Nonmatching */ } /* 80172C20-8017346C .text crawlCamera__9dCamera_cFl */ bool dCamera_c::crawlCamera(s32) { /* Nonmatching */ } /* 8017346C-80173E40 .text hookshotCamera__9dCamera_cFl */ bool dCamera_c::hookshotCamera(s32) { /* Nonmatching */ } /* 80173E40-80174E98 .text tornadoCamera__9dCamera_cFl */ bool dCamera_c::tornadoCamera(s32) { /* Nonmatching */ } /* 80174E98-8017623C .text rideCamera__9dCamera_cFl */ bool dCamera_c::rideCamera(s32) { /* Nonmatching */ } /* 8017623C-80176F54 .text hungCamera__9dCamera_cFl */ bool dCamera_c::hungCamera(s32) { /* Nonmatching */ } /* 80176F54-8017793C .text vomitCamera__9dCamera_cFl */ bool dCamera_c::vomitCamera(s32) { /* Nonmatching */ } /* 8017793C-801787B8 .text shieldCamera__9dCamera_cFl */ bool dCamera_c::shieldCamera(s32) { /* Nonmatching */ } /* 801787B8-801795C8 .text manualCamera__9dCamera_cFl */ bool dCamera_c::manualCamera(s32) { /* Nonmatching */ } /* 801795C8-801799C0 .text nonOwnerCamera__9dCamera_cFl */ bool dCamera_c::nonOwnerCamera(s32) { /* Nonmatching */ } /* 801799C0-80179F8C .text fixedFrameCamera__9dCamera_cFl */ bool dCamera_c::fixedFrameCamera(s32) { /* Nonmatching */ } /* 80179F8C-8017A80C .text fixedPositionCamera__9dCamera_cFl */ bool dCamera_c::fixedPositionCamera(s32) { /* Nonmatching */ } /* 8017A80C-8017B144 .text eventCamera__9dCamera_cFl */ bool dCamera_c::eventCamera(s32) { /* Nonmatching */ typedef bool (dCamera_c::*func)(); func l_func[] = { &dCamera_c::pauseEvCamera, &dCamera_c::pauseEvCamera, &dCamera_c::talktoEvCamera, &dCamera_c::fixedPositionEvCamera, &dCamera_c::fixedFrameEvCamera, &dCamera_c::uniformTransEvCamera, &dCamera_c::watchActorEvCamera, &dCamera_c::restorePosEvCamera, &dCamera_c::getItemEvCamera, &dCamera_c::gameOverEvCamera, &dCamera_c::turnToActorEvCamera, &dCamera_c::rollingEvCamera, &dCamera_c::tactEvCamera, &dCamera_c::windDirectionEvCamera, &dCamera_c::tornadoWarpEvCamera, &dCamera_c::styleEvCamera, &dCamera_c::saveEvCamera, &dCamera_c::loadEvCamera, &dCamera_c::useItem0EvCamera, &dCamera_c::useItem1EvCamera, &dCamera_c::fixedFramesEvCamera, &dCamera_c::bSplineEvCamera, &dCamera_c::possessedEvCamera, &dCamera_c::twoActor0EvCamera, &dCamera_c::stokerEvCamera, &dCamera_c::uniformBrakeEvCamera, &dCamera_c::uniformAcceleEvCamera, &dCamera_c::maptoolIdEvCamera, }; static char* ActionNames[28] = { "PAUSE", "WAIT", "TALK", "FIXEDPOS", "FIXEDFRM", "UNITRANS", "WATCHACTOR", "RESTOREPOS", "GETITEM", "GAMEOVER", "TURNTOACTOR", "ROLLING", "TACT", "WINDDIR", "TORNADO", "STYLE", "SAVE", "LOAD", "USEITEM0", "USEITEM1", "FIXEDFRMS", "BSPLINE", "POSSESSED", "TWOACTOR0", "STOKER", "UNIBRAKE", "UNIACCELE", "MAPTOOL" }; if (m118 == 0) { m0A4[1].m00.mCenter = mCenter; m0A4[0].m00.mCenter = m0A4[1].m00.mCenter; m0A4[1].m00.mEye = mEye; m0A4[0].m00.mEye = m0A4[1].m00.mEye; m0A4[0].m00.mFovY = m0A4[1].m00.mFovY = mFovY; m0A4[1].m00.mBank = mBank; m0A4[0].m00.mBank = m0A4[1].m00.mBank; m0A4[0].m00.m1E = m0A4[1].m00.m1E = 0; } long lVar12; if (!chkFlag(0x20000000)) { if (!dComIfGp_evmng_cameraPlay()) { return 0; } int staff_id = dComIfGp_evmng_getMyStaffId("CAMERA"); if (staff_id < 0) { return 0; } if (mEventData.mStaffIdx != staff_id) { clrFlag(0x200000); m11C = 0; m108 = 0; m118 = 0; } mEventData.mStaffIdx = staff_id; if (dComIfGp_evmng_getIsAddvance(mEventData.mStaffIdx)) { m102 = 0; m101 = 0; m100 = 0; m11C = 0; } lVar12 = dComIfGp_evmng_getMyActIdx(mEventData.mStaffIdx, ActionNames, 0x1C, 0, 0); } else { mEventData.mStaffIdx = -1; if (m118 == 0) { m11C = 0; } lVar12 = mEventData.field_0x18; } if (lVar12 < 0 || lVar12 >= 0x1c) { dComIfGp_evmng_cutEnd(mEventData.mStaffIdx); return 0; } if (m11C == 0) { if (m118 == 0) { clrFlag(0x200000); mEventData.field_0x1c = 2; } u32 evStringData; if (getEvStringData((char*)&evStringData, "Trim", "CINESCO")) { if (evStringData == 'STAN') { mEventData.field_0x1c = 0; } else if (evStringData == 'VIST') { mEventData.field_0x1c = 1; } else if (evStringData == 'DEMO') { mEventData.field_0x1c = 3; } else if (evStringData == 'NONE') { mEventData.field_0x1c = 4; } else if (evStringData == 'KEEP') { mEventData.field_0x1c = 999; } } getEvIntData(&mEventData.field_0x24, "WaitAnyKey", 0); if (mEventData.field_0x24) { setFlag(0x200000); } getEvIntData(&mEventData.field_0x20, "BGCheck", 1); getEvIntData(&mEventData.field_0x24, "AutoForcus", 1); if (mEventData.field_0x24 == 0) { mDoGph_gInf_c::offAutoForcus(); } getEvIntData(&mEventData.field_0x28, "MoveBGCheck", 1); } switch (mEventData.field_0x20) { case 1: m068 = 0xf; break; case 2: m068 = 0x3f; break; case 3: case 4: m068 = 0; break; default: m068 = 9; } mTrimSize = mEventData.field_0x1c; // TODO: inline? bool bVar5 = false; if (m100 && m101 && m102) { bVar5 = true; } if (bVar5) { dComIfGp_onCameraAttentionStatus(mCameraInfoIdx, 4); } else { dComIfGp_offCameraAttentionStatus(mCameraInfoIdx, 4); } //Runtime.PPCEABI.H::__ptmf_scall(&local_170 + (int)((ulonglong)lVar12 >> 0x20),this,pvVar8); if ((this->*l_func[lVar12])()) { dComIfGp_evmng_cutEnd(mEventData.mStaffIdx); } if (mEventData.field_0x20 == 4) { dBgS_LinChk lin_chk; if (lineBGCheck(&m044, &m050, &lin_chk, 4)) { m050 = lin_chk.GetCross(); } } return 1; } /* 8017B144-8017B14C .text demoCamera__9dCamera_cFl */ bool dCamera_c::demoCamera(s32) { return TRUE; } /* 8017B14C-8017B154 .text letCamera__9dCamera_cFl */ bool dCamera_c::letCamera(s32) { return TRUE; } /* 8017B154-8017B18C .text Set__9dCamera_cF4cXyz4cXyz */ bool dCamera_c::Set(cXyz center, cXyz eye) { mCenter = center; mEye = eye; return TRUE; } /* 8017B18C-8017B1EC .text Set__9dCamera_cF4cXyz4cXyzfs */ bool dCamera_c::Set(cXyz center, cXyz eye, f32 fovY, s16 bank) { mCenter = center; mEye = eye; mFovY = fovY; mBank.Val(bank); return TRUE; } /* 8017B1EC-8017B24C .text Set__9dCamera_cF4cXyz4cXyzsf */ bool dCamera_c::Set(cXyz center, cXyz eye, s16 bank, f32 fovY) { mCenter = center; mEye = eye; mFovY = fovY; mBank.Val(bank); return TRUE; } /* 8017B24C-8017B31C .text Reset__9dCamera_cF4cXyz4cXyzfs */ bool dCamera_c::Reset(cXyz center, cXyz eye, f32 fovY, s16 bank) { m044 = mCenter = center; m050 = mEye = eye; m060 = mFovY = fovY; mBank = cSAngle(bank); m05C = mBank; m03C.Val(m050 - m044); return Reset(); } /* 8017B31C-8017B3D8 .text Reset__9dCamera_cF4cXyz4cXyz */ bool dCamera_c::Reset(cXyz center, cXyz eye) { m044 = mCenter = center; m050 = mEye = eye; m060 = mFovY; m05C = mBank; m03C.Val(m050 - m044); return Reset(); } /* 8017B3D8-8017B494 .text Reset__9dCamera_cFv */ bool dCamera_c::Reset() { m044 = mCenter; m050 = mEye; m060 = mFovY; mDirection.Val(mEye - mCenter); m03C = mDirection; m05C = mBank; m03C.Val(m050 - m044); return TRUE; } /* 8017B494-8017B4C4 .text ResetView__9dCamera_cFv */ void dCamera_c::ResetView() { setView(0.0f, 0.0f, 640.0f, 480.0f); } /* 8017B4C4-8017B51C .text Chtyp__9dCamera_cFl */ bool dCamera_c::Chtyp(s32 nextType) { if (onTypeChange(mCurType, nextType)) { mCurType = nextType; return TRUE; } else { return FALSE; } } /* 8017B51C-8017B524 .text U2__9dCamera_cFv */ s16 dCamera_c::U2() { return mAngleY.Val(); } /* 8017B524-8017BA50 .text shakeCamera__9dCamera_cFv */ f32 dCamera_c::shakeCamera() { /* Nonmatching - Code 100% */ static f32 const wave[] = {0.4f, 0.9f, 2.1f, 3.2f}; f32 fVar6 = 0.0f; if (m554 < m550) { int uVar5 = (m548[m554 >> 3] << 8) | m548[(m554 >> 3) + 1];; int uVar4 = 1 << (15 - (m554 & 7)); f32 fVar7 = 1.0f; for (int i = 0; i < 4; i++) { if (uVar4 & uVar5) { fVar6 += fVar7 * wave[i]; } else { fVar7 *= 0.43f; } uVar4 = uVar4 >> 1; } m554++; fVar6 *= cM_rndFX(0.05f) + 0.95f; if (m554 & 1) { fVar6 = -fVar6; } cXyz local_38(m55C); local_38.x += cM_rndFX(0.045f); local_38.z += cM_rndFX(0.045f); local_38 = local_38 * fVar6; if (m588 & 2) { mEyeShake = local_38; mCenterShake = mEyeShake; } if (m588 & 4) { mFovYShake = fVar6 * cM_rndFX(0.12f); } if (m588 & 8) { mBankShake = cSAngle(fVar6 * cM_rndFX(0.15f)); } if (m588 & 0x10) { mDoGph_gInf_c::setBlureRate(fVar6 * 30.0f); mDoGph_gInf_c::onBlure(); mBlureTimer = 0; } else { if (m588 & 0x20) { if (mBlurePositionType == 0) { dDlst_window_c* window = get_window(mpCamera); scissor_class* scissor = window->getScissor(); cXyz eye = eyePos(mpPlayerActor); cXyz eye_proj; mDoLib_project(&eye, &eye_proj); mBlurePosition.x = eye_proj.x / scissor->mWidth; mBlurePosition.y = eye_proj.y / scissor->mHeight; mBlurePosition.z = 0.0f; } // TODO: inline? bool bVar1 = false; if (mBlureTimer > 0) { mBlureTimer--; } else if (m58C == 1) { bVar1 = true; } if (!bVar1) { mDoMtx_stack_c::transS(mBlurePosition); mDoMtx_stack_c::scaleM(mBlureScale); mDoMtx_stack_c::XrotM(mBlureRotation.x); mDoMtx_stack_c::YrotM(mBlureRotation.y); mDoMtx_stack_c::ZrotM(mBlureRotation.z); mDoMtx_stack_c::transM(-mBlurePosition.x, -mBlurePosition.y, -mBlurePosition.z); mDoGph_gInf_c::onBlure(mDoMtx_stack_c::get()); int blurRate = mBlureAlpha * 230.0f; mDoMtx_stack_c::scaleM(mBlureScale); mDoGph_gInf_c::setBlureRate(blurRate); } } } } else { mCenterShake -= mCenterShake * 0.1f; mEyeShake -= mEyeShake * 0.1f; mFovYShake -= mFovYShake * 0.1f; mBankShake -= mBankShake * 0.1f; if (mBlureTimer <= 0) { mDoGph_gInf_c::offBlure(); m588 &= ~0x20; mBlureTimer = 0; } else if (mBlureTimer > 0) { // TODO: inline? bool r3 = false; if (m58C != 1) { r3 = true; } if (!r3) { mDoMtx_stack_c::transS(mBlurePosition); mDoMtx_stack_c::scaleM(mBlureScale); mDoMtx_stack_c::XrotM(mBlureRotation.x); mDoMtx_stack_c::YrotM(mBlureRotation.y); mDoMtx_stack_c::ZrotM(mBlureRotation.z); mDoMtx_stack_c::transM(-mBlurePosition.x, -mBlurePosition.y, -mBlurePosition.z); mDoGph_gInf_c::onBlure(mDoMtx_stack_c::get()); int blurRate = mBlureAlpha * 230.0f; mDoMtx_stack_c::scaleM(mBlureScale); mDoGph_gInf_c::setBlureRate(blurRate); } if ((int)(mBlureAlpha * 230.0f) > mBlureTimer && m58C == 0) { mDoGph_gInf_c::setBlureRate(mBlureTimer); } mBlureTimer--; } } return fVar6; } static const int PatternLengthMax[] = {0x00000004}; /* 8017BA50-8017BB8C .text StartShake__9dCamera_cFlPUcl4cXyz */ int dCamera_c::StartShake(s32 i_length, u8* i_pattern, s32 i_flags, cXyz i_pos) { /* Nonmatching - Code 100%, just need to figure out where PatternLengthMax is meant to be placed */ if (i_length < 0 || i_length > PatternLengthMax[0] << 3) { i_length = PatternLengthMax[0] << 3; } m550 = i_length; int i; int var_r28 = i_length >> 3; for (i = 0; i < PatternLengthMax[0]; i++) { m544[i] = m548[i] = 0; } for (i = 0; i < var_r28; i++) { m544[i] = m548[i] = i_pattern[i]; } var_r28 = i_length & 7; m544[i] = (0xFF << (8 - var_r28)) & i_pattern[i]; if (i_length == (PatternLengthMax[0] << 3)) { m548[i] = m544[i] | (i_pattern[0] >> var_r28); } else { m548[i] = m544[i]; } m55C = i_pos.norm(); m554 = 0; m588 = i_flags; return 1; } /* 8017BB8C-8017BBA4 .text StopShake__9dCamera_cFv */ bool dCamera_c::StopShake() { m550 = 0; m554 = 0; m588 = 0; return TRUE; } /* 8017BBA4-8017BBF0 .text ResetBlure__9dCamera_cFi */ void dCamera_c::ResetBlure(int param_0) { /* Nonmatching - Code 100% */ m58C = param_0; mBlureAlpha = 0.75f; mBlurePositionType = 0; mBlurePosition.x = 0.5f; mBlurePosition.y = 0.5f; mBlurePosition.z = 0.0f; mBlureScale.x = 0.99f; mBlureScale.y = 0.99f; mBlureScale.z = 0.0f; mBlureRotation.x = 0; mBlureRotation.y = 0; mBlureRotation.z = 0; mBlureTimer = 0; } /* 8017BBF0-8017BBF8 .text SetBlureAlpha__9dCamera_cFf */ void dCamera_c::SetBlureAlpha(f32 alpha) { mBlureAlpha = alpha; } /* 8017BBF8-8017BC08 .text SetBlureScale__9dCamera_cFfff */ void dCamera_c::SetBlureScale(f32 scale_x, f32 scale_y, f32 scale_z) { mBlureScale.x = scale_x; mBlureScale.y = scale_y; mBlureScale.z = scale_z; return; } /* 8017BC08-8017BC1C .text SetBlureScale__9dCamera_cFf */ void dCamera_c::SetBlureScale(f32 scale) { mBlureScale.x = scale; mBlureScale.y = scale; mBlureScale.z = 0.0f; } /* 8017BC1C-8017BC74 .text SetBlurePosition__9dCamera_cFfff */ void dCamera_c::SetBlurePosition(f32 pos_x, f32 pos_y, f32 pos_z) { SetBlurePositionType(1); mBlurePosition.x = pos_x; mBlurePosition.y = pos_y; mBlurePosition.z = pos_z; } /* 8017BC74-8017BC7C .text SetBlurePositionType__9dCamera_cFi */ void dCamera_c::SetBlurePositionType(int positionType) { mBlurePositionType = positionType; } /* 8017BC7C-8017BC84 .text SetBlureTimer__9dCamera_cFl */ void dCamera_c::SetBlureTimer(s32 timerVal) { mBlureTimer = timerVal; } /* 8017BC84-8017BC9C .text SubjectLockOn__9dCamera_cFP10fopAc_ac_c */ bool dCamera_c::SubjectLockOn(fopAc_ac_c* target) { setFlag(0x3000000); mpLockonTarget = target; return TRUE; } /* 8017BC9C-8017BCB8 .text SubjectLockOff__9dCamera_cFv */ bool dCamera_c::SubjectLockOff() { clrFlag(0x3000000); mpLockonTarget = NULL; return TRUE; } /* 8017BCB8-8017BCEC .text GetForceLockOnActor__9dCamera_cFv */ fopAc_ac_c* dCamera_c::GetForceLockOnActor() { return fopAcM_SearchByID(mLockOnActorId); } /* 8017BCEC-8017BD2C .text ForceLockOn__9dCamera_cFUi */ bool dCamera_c::ForceLockOn(fpc_ProcID procId) { mLockOnActorId = procId; mForceLockTimer = 0; mpLockonActor = GetForceLockOnActor(); return TRUE; } /* 8017BD2C-8017BD5C .text ForceLockOff__9dCamera_cFUi */ bool dCamera_c::ForceLockOff(fpc_ProcID procId) { if (procId == mLockOnActorId || procId == fpcM_ERROR_PROCESS_ID_e) { mLockOnActorId = fpcM_ERROR_PROCESS_ID_e; return TRUE; } return FALSE; } /* 8017BD5C-8017BD7C .text SetExtendedPosition__9dCamera_cFP4cXyz */ bool dCamera_c::SetExtendedPosition(cXyz* pos) { mExtendedPos.x = pos->x; mExtendedPos.y = pos->y; mExtendedPos.z = pos->z; return TRUE; } /* 8017BD7C-8017BD90 .text ScopeViewMsgModeOff__9dCamera_cFv */ bool dCamera_c::ScopeViewMsgModeOff() { clrFlag(0x400000); return TRUE; } /* 8017BD90-8017BD9C .text dCam_isManual__FP12camera_class */ bool dCam_isManual(camera_class* i_this) { return i_this->mCamera.chkFlag(0x20); } /* 8017BD9C-8017BDC0 .text dCam_getAngleY__FP12camera_class */ s16 dCam_getAngleY(camera_class* i_this) { return i_this->mCamera.mDirection.U().Inv(); } /* 8017BDC0-8017BDC8 .text dCam_getAngleX__FP12camera_class */ s16 dCam_getAngleX(camera_class* i_this) { return i_this->mCamera.mDirection.V(); } /* 8017BDC8-8017BDEC .text dCam_getControledAngleY__FP12camera_class */ s16 dCam_getControledAngleY(camera_class* i_this) { return i_this->mCamera.U2(); } /* 8017BDEC-8017BDFC .text dCam_getCamera__Fv */ camera_class* dCam_getCamera() { return dComIfGp_getCamera(0); } /* 8017BDFC-8017BE20 .text dCam_getBody__Fv */ dCamera_c* dCam_getBody() { return &dCam_getCamera()->mCamera; } /* 8017BE20-8017BEB0 .text preparation__FP20camera_process_class */ void preparation(camera_process_class* i_this) { /* Nonmatching - Code 100% */ camera_class* a_this = (camera_class*)i_this; dCamera_c* camera = &a_this->mCamera; int camera_id = get_camera_id(a_this); dDlst_window_c* window = get_window(camera_id); view_port_class* viewport = window->getViewPort(); f32 aspect = 1.3333334f * fapGmHIO_getAspectRatio(); camera->SetWindow(viewport->mWidth, viewport->mHeight); fopCamM_SetAspect(a_this, aspect); dComIfGp_offCameraAttentionStatus(camera_id, 0x23); } /* 8017BEB0-8017BFAC .text view_setup__FP20camera_process_class */ void view_setup(camera_process_class* i_this) { /* Nonmatching - Code 100% */ camera_class* a_this = (camera_class*)i_this; dDlst_window_c* window = get_window(a_this); view_port_class* viewport = window->getViewPort(); view_class* view = (view_class*)i_this; mDoMtx_lookAt(view->mViewMtx, &view->mLookat.mEye, &view->mLookat.mCenter, &view->mLookat.mUp, view->mBank); MTXCopy(view->mViewMtx, view->mViewMtxNoTrans); view->mViewMtxNoTrans[0][3] = 0.0f; view->mViewMtxNoTrans[1][3] = 0.0f; view->mViewMtxNoTrans[2][3] = 0.0f; dComIfGd_setWindow(window); dComIfGd_setViewport(viewport); dComIfGd_setView(view); f32 far; if (dComIfGp_getScopeMesgStatus() != 0) { far = view->mFar; } else { far = dStage_stagInfo_GetCullPoint(dComIfGp_getStageStagInfo()); } mDoLib_clipper::setup(view->mFovy, view->mAspect, view->mNear, far); } /* 8017BFAC-8017C29C .text store__FP20camera_process_class */ void store(camera_process_class* i_this) { /* Nonmatching */ camera_class* a_this = (camera_class*)i_this; dCamera_c* body = &((camera_class*)i_this)->mCamera; int camera_id = get_camera_id(a_this); dStage_stageDt_c* stage = &dComIfGp_getStage(); cXyz oldCenter = *fopCamM_GetCenter_p(a_this); cXyz oldEye = *fopCamM_GetEye_p(a_this); cXyz oldUp = *fopCamM_GetUp_p(a_this); cSAngle bank = fopCamM_GetBank(a_this); f32 fovy = fopCamM_GetFovy(a_this); dDemo_camera_c* mDemoCamera = dComIfGp_demo_getCamera(); if (mDemoCamera) { if (mDemoCamera->checkEnable(0x40)) { oldCenter = mDemoCamera->getTarget(); } if (mDemoCamera->checkEnable(0x10)) { oldEye = mDemoCamera->getTrans(); } if (mDemoCamera->checkEnable(0x20)) { oldUp = mDemoCamera->getUp(); } if (mDemoCamera->checkEnable(0x80)) { bank = cAngle::d2s(-mDemoCamera->getRoll()); } if (mDemoCamera->checkEnable(4)) { fovy = mDemoCamera->getFovy(); } } else { if (body->chkFlag(1) == 0) { oldCenter = body->Center(); oldEye = body->Eye(); oldUp = body->Up(); bank = body->Bank(); fovy = body->Fovy(); } } fopCamM_SetCenter(a_this, oldCenter.x, oldCenter.y, oldCenter.z); fopCamM_SetEye(a_this, oldEye.x, oldEye.y, oldEye.z); fopCamM_SetUp(a_this, oldUp.x, oldUp.y, oldUp.z); fopCamM_SetBank(a_this, bank); fopCamM_SetFovy(a_this, fovy); if (dComIfGp_checkCameraAttentionStatus(camera_id, 8)) { fopCamM_SetNear(a_this, 30.0f); } else { if (stage) { fopCamM_SetNear(a_this, dComIfGp_getStageStagInfo()->mNearPlane); } } if (stage) { fopCamM_SetFar(a_this, dComIfGp_getStageStagInfo()->mFarPlane); } fopCamM_SetAngleY(a_this, body->mDirection.U().Inv()); fopCamM_SetAngleX(a_this, body->mDirection.V()); return; } /* 8017C29C-8017C350 .text camera_execute__FP20camera_process_class */ int camera_execute(camera_process_class* i_this) { camera_class* a_this = (camera_class*)i_this; preparation(i_this); if (dComIfGp_demo_getCamera()) { a_this->mCamera.ResetView(); } if (!dComIfGp_evmng_cameraPlay()) { mDoGph_gInf_c::onAutoForcus(); } if (a_this->mCamera.Active() && !a_this->mCamera.Pause()) { a_this->mCamera.Run(); } else { a_this->mCamera.NotRun(); } a_this->mCamera.CalcTrimSize(); store(i_this); view_setup(i_this); return TRUE; } /* 8017C350-8017C72C .text camera_draw__FP20camera_process_class */ bool camera_draw(camera_process_class* i_this) { camera_class* a_this = (camera_class*)i_this; dCamera_c* body = &((camera_class*)i_this)->mCamera; dDlst_window_c* window = get_window(a_this); view_port_class* viewport = window->getViewPort(); int camera_id = get_camera_id(a_this); int trim_height = body->mTrimHeight; window->setScissor(0.0f, trim_height, mDoMch_render_c::getFbWidth(), mDoMch_render_c::getEfbHeight() - trim_height * 2.0f); C_MTXPerspective(i_this->mProjMtx, i_this->mFovy, i_this->mAspect, i_this->mNear, i_this->mFar); mDoMtx_lookAt(i_this->mViewMtx, &i_this->mLookat.mEye, &i_this->mLookat.mCenter, &i_this->mLookat.mUp, i_this->mBank); j3dSys.setViewMtx(i_this->mViewMtx); cMtx_inverse(i_this->mViewMtx, i_this->mInvViewMtx); mDoAud_getCameraInfo(&i_this->mLookat.mEye, j3dSys.mViewMtx, camera_id); dBgS_GndChk gndchk; gndchk.SetPos(&i_this->mLookat.mEye); f32 ground_y = dComIfG_Bgsp()->GroundCross(&gndchk); if (ground_y != C_BG_MIN_HEIGHT) { mDoAud_getCameraMapInfo(dComIfG_Bgsp()->GetMtrlSndId(gndchk)); mDoAud_setCameraGroupInfo(dComIfG_Bgsp()->GetGrpSoundId(gndchk)); Vec spDC; spDC.x = i_this->mLookat.mEye.x; spDC.y = ground_y; spDC.z = i_this->mLookat.mEye.z; mDoAud_zelAudio_c::getInterface()->setCameraPolygonPos(&spDC); } else { mDoAud_zelAudio_c::getInterface()->setCameraPolygonPos(NULL); } MTXCopy(i_this->mViewMtx, i_this->mViewMtxNoTrans); i_this->mViewMtxNoTrans[0][3] = 0.0f; i_this->mViewMtxNoTrans[1][3] = 0.0f; i_this->mViewMtxNoTrans[2][3] = 0.0f; cMtx_concatProjView(i_this->mProjMtx, i_this->mViewMtx, i_this->mProjViewMtx); body->Draw(); if (fpcLf_GetPriority(a_this) != 1) { get_camera_id(a_this); for (int i = 0; i < 1; i++) { if (!fopOvlpM_IsDoingReq()) { fopAc_ac_c* currPlayerActor = dComIfGp_getPlayer(i); f32 depth = currPlayerActor->current.pos.y; if (currPlayerActor->current.pos.y > 0.0f) { // Fakematch? Fixes load order of y f32 temp = 0.0f; } dComIfGp_map_draw( currPlayerActor->current.pos.x, currPlayerActor->current.pos.z, dComIfGp_roomControl_getStayNo(), depth ); } } } return true; } /* 8017C72C-8017C7E4 .text init_phase1__FP12camera_class */ cPhs_State init_phase1(camera_class* i_this) { int camera_id = get_camera_id(i_this); dComIfGp_setCamera(camera_id, i_this); fopCamM_SetPrm1(i_this, dComIfGp_getCameraWinID(camera_id)); fopCamM_SetPrm2(i_this, dComIfGp_getCameraPlayer1ID(camera_id)); fopCamM_SetPrm3(i_this, dComIfGp_getCameraPlayer2ID(camera_id)); Vec local_18 = {10000000.0f, 10000000.0f, 10000000.0f}; mDoAud_getCameraInfo(&local_18, j3dSys.getViewMtx(), camera_id); dComIfGp_setWindowNum(0); mDoGph_gInf_c::onAutoForcus(); return cPhs_NEXT_e; } /* 8017C7E4-8017C980 .text init_phase2__FP12camera_class */ cPhs_State init_phase2(camera_class* i_this) { /* Nonmatching - Code 100% */ camera_process_class* a_this = (camera_process_class*)i_this; dCamera_c* body = &i_this->mCamera; int camera_id = get_camera_id(i_this); fopAc_ac_c* player = (fopAc_ac_c*)get_player_actor(i_this); if (player == NULL) { return cPhs_INIT_e; } fopAcM_setStageLayer(player); dComIfGp_setWindowNum(1); new (body) dCamera_c(i_this); float farPlane = 160000.0f; if (dComIfGp_getStage().getStagInfo() != NULL) { dStage_stageDt_c* stage_dt = &dComIfGp_getStage(); stage_dt->getStagInfo(); farPlane = stage_dt->getStagInfo()->mFarPlane; } view_port_class* viewPort = (view_port_class*)get_window(camera_id); fopCamM_SetNear(i_this, 1.0f); fopCamM_SetFar(i_this, farPlane); fopCamM_SetFovy(i_this, 30.0f); fopCamM_SetAspect(i_this, viewPort->mWidth / viewPort->mHeight * fapGmHIO_getAspectRatio()); fopCamM_SetCenter(i_this, player->current.pos.x, player->current.pos.y, player->current.pos.z); fopCamM_SetBank(i_this, 0); store(i_this); view_setup(i_this); return cPhs_NEXT_e; } /* 8017C980-8017C9B0 .text camera_create__FP12camera_class */ cPhs_State camera_create(camera_class* i_this) { /* Nonmatching - Code 100% */ static request_of_phase_process_fn l_method[3] = { (request_of_phase_process_fn)init_phase1, (request_of_phase_process_fn)init_phase2, (request_of_phase_process_fn)NULL, }; return dComLbG_PhaseHandler(&i_this->phase_request, l_method, i_this); } /* 8017C9B0-8017C9DC .text camera_delete__FP20camera_process_class */ bool camera_delete(camera_process_class* i_this) { /* Nonmatching - fakematch, instruction swap */ dCamera_c* camera = &((camera_class*)i_this)->mCamera; camera->~dCamera_c(); return TRUE; } /* 8017C9DC-8017C9E4 .text is_camera_delete__FPv */ bool is_camera_delete(void*) { return TRUE; } /* 8017C9E4-8017CA7C .text Init__14dCamForcusLineFv */ void dCamForcusLine::Init() { /* Nonmatching - Code 100% */ m49 = 0; m48 = 1; m38 = cXyz(320.0f, 240.0f, 0.0f); m44.r = 0xFF; m44.g = 0xFF; m44.b = 0xFF; m44.a = 0x60; m4C = 100; m50 = 100; m54 = 100; m58 = 0x50; m5A = 0; m5C = 4; m5E = 4; m68 = 180.0f; m6C = 0.0f; m60 = 180.0f; m64 = 60.0f; } /* 8017CA7C-8017CB00 .text Draw__14dCamForcusLineFv */ void dCamForcusLine::Draw() { if (m49) { if (m48 == 0) { mEffectLine.initRnd(m4C, m50, m54); } mEffectLine.update(m38, m44, m58, m5A, m5C, m5E, m60, m64, m68, m6C); } } /* 8017CB00-8017CB18 .text Off__14dCamForcusLineFv */ bool dCamForcusLine::Off() { m49 = 0; return m49 == 0; }