// // 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 "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, 0x80000) || daNpc_Md_c::m_mirror; } 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 void hideActor(fopAc_ac_c* actor) { fopAcM_OnStatus(actor, 0x1000000); } 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::lockonCamera, &dCamera_c::talktoCamera, &dCamera_c::subjectCamera, &dCamera_c::fixedPositionCamera, &dCamera_c::fixedFrameCamera, &dCamera_c::towerCamera, &dCamera_c::rideCamera, &dCamera_c::manualCamera, &dCamera_c::eventCamera, &dCamera_c::hookshotCamera, &dCamera_c::followCamera2, &dCamera_c::followCamera, &dCamera_c::crawlCamera, &dCamera_c::tornadoCamera, &dCamera_c::hungCamera, &dCamera_c::vomitCamera, &dCamera_c::shieldCamera, &dCamera_c::nonOwnerCamera, &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.field_0x04 = -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) { mMonitoringThings.mPos = positionOf(mpPlayerActor); } else { mMonitoringThings.mPos = cXyz::Zero; } mMonitoringThings.field_0x0C.z = 0.0f; mMonitoringThings.field_0x0C.y = 0.0f; mMonitoringThings.field_0x0C.x = 0.0f; mMonitoringThings.field_0x10 = 0; mMonitoringThings.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, &mMonitoringThings.mPos, NULL, NULL); } playerMonitorHorizontalDist = dCamMath::xyzHorizontalDistance(playerPos, mMonitoringThings.mPos); mMonitoringThings.field_0x0C.z = playerMonitorHorizontalDist - mMonitoringThings.field_0x0C.x; mMonitoringThings.field_0x0C.y += (playerMonitorHorizontalDist - mMonitoringThings.field_0x0C.y) * 0.075f; mMonitoringThings.field_0x0C.x = playerMonitorHorizontalDist; mMonitoringThings.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 mMonitoringThings.field_0x10++; } else { mMonitoringThings.field_0x10 = 0; } mMonitoringThings.field_0x14 = mDirection.R() - mMonitoringThings.field_0x14; } } /* 801628DC-80163020 .text calcPeepAngle__9dCamera_cFv */ cSAngle dCamera_c::calcPeepAngle() { cSAngle res(cSAngle::_0); if (check_owner_action(mPadId, 0x20)) { 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, 0x40)) { 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 fVar3; bool bVar4; uint uVar5; long next; dCamera_c* camera; cSAngle local_40 ; bool res = FALSE; camera = (dCamera_c *)0x0; mForcusLine.Off(); clrFlag(0x10149C01); checkSpecialArea(); checkGroundInfo(); if (m530 && !chkFlag(0x200000)) { if (!(dComIfGp_evmng_cameraPlay() || chkFlag(0x20000000))) { fVar1 = daObjPirateship::getShipOffsetY(&m534, &m536, 130.0f) * m540; //regswap fVar3 = fVar1 - m538; if (((m530 == 1) && (m53C < 0.0f)) && (fVar3 > 0.0f)) { m254 |= 4; } m53C = fVar3; m538 = fVar1; 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; } short curStyle = types[mCurType].mStyles[0][mCurMode]; if (curStyle >= 0) { if (mCurStyle != curStyle && onStyleChange(mCurStyle, curStyle)) { mCurStyle = (int)types[mCurType].mStyles[0][mCurMode]; mCamParam.Change(mCurStyle); } } clrFlag(0x20); if (mCurMode == 0xc) { setFlag(0x20); } clrFlag(0x80000000); dComIfGp_offCameraAttentionStatus(mCameraInfoIdx, 0x80); if (mCamParam.CheckFlag(4) && !check_owner_action(mPadId, 0x4000000) && !check_owner_action1(mPadId, 0x40000)) { m148 += (forwardCheckAngle() - m148) * mCamSetup.mBGChk.FwdCushion(); } else { m148 = cSAngle::_0; } defaultTriming(); mTrimTypeForce = -1; m068 = 9; if (chkFlag(0x200000) && dCamParam_c::styles[mCurStyle].engineIdx != 11) { if (push_any_key(mPadId) || mMonitoringThings.field_0x0C.x > 10.0f || !m360 || m31C) { clrFlag(0x200000); } } else if (dComIfGp_demo_getCamera() && mCamParam.Algorythmn() != 11) { camera = (dCamera_c *)demoCamera(0); } else { // Issues here camera = this; res = (this->*engine_tbl[dCamParam_c::styles[mCurStyle].engineIdx])(mCurStyle); m07C++; m080++; m118++; m108++; m11C++; } if (!res) { m514 = 0; } if (!chkFlag(0x400)) { m05C -= m05C * 0.05f; } shakeCamera(); clrFlag(0x90080); if (mCamParam.CheckFlag(1)) { m068 = 0x3F; } else if (mCamParam.CheckFlag(2)) { m068 = 0xF; } if (mCamParam.CheckFlag(0x400)) { m068 |= 0x40; } fVar1 = m354 + mCamSetup.mBGChk.FloorMargin(); if (m044.y < fVar1) { mCenter.x = m044.x; mCenter.z = m044.z; if ((dCamParam_c::styles[mCurStyle].engineIdx == 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(cSAngle(g_mDoCPd_cpadInfo[mPadId].mMainStickAngle)); } else { mAngleY = cSAngle(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 (m006 >= 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 & uVar5 && (m258 & uVar5) == 0) { // Inline? playSound = TRUE; } if (playSound) { mDoAud_seStart(m248[i]); } } m258 = m254; m254 = 0; bVar4 = FALSE; if (m100 && m101 && m102) { // Also Inline? bVar4 = TRUE; } if (bVar4) { 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, 0x100000)) ) { 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, 0x80000000)) { 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, 0x200000) || check_owner_action1(mPadId, 8)) { next_mode = 14; } else if (check_owner_action(mPadId, 0x80000080)) { next_mode = 0x11; } else if (check_owner_action(mPadId, 0x800000)) { if (m144 == 0) { next_mode = 0xc; } else { next_mode = 0x12; } } else if (check_owner_action1(mPadId, 0x10)) { next_mode = 0xf; } else if (check_owner_action(mPadId, 0x2000)) { next_mode = 4; } else { if (check_owner_action(mPadId, 0x25000) && !attn.Lockon()) { next_mode = 10; } else if (check_owner_action(mPadId, 0x80000) && !attn.Lockon()) { next_mode = 11; } else if (m144 == 0) { next_mode = 12; } else if (check_owner_action1(mPadId, 2)) { next_mode = 5; } else if (check_owner_action1(mPadId, 4)) { next_mode = 6; } else if (check_owner_action(mPadId, 0x60)) { next_mode = 6; } else if (check_owner_action(mPadId, 0x61)) { next_mode = 5; } else if (check_owner_action(mPadId, 0x406) && i_curMode != 12) { if (mpLockonTarget) { next_mode = 8; } } else if (attn.LockonTruth() && !check_owner_action(mPadId, 0xC000000)) { next_mode = 2; } else if (attn.Lockon()) { next_mode = 1; } else if (check_owner_action(mPadId, 0x400000) && !check_owner_action(mPadId, 0x36a02371) && !check_owner_action1(mPadId, 0x11)) { 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(0x10)) { 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, 0x1010000) || check_owner_action1(mPadId, 0x80)) && 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, 0x100000)) { nextType = mCamTypeWater; } else { nextType = mMapToolType; } } } else if (idx == 0x1ff) { if (check_owner_action1(mPadId, 0x20)) { nextType = mMapToolType; } else if (check_owner_action(mPadId, 0x100000)) { 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 (dCamParam_c::styles[style].engineIdx) { 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 param_0, s32 param_1) { m11C = 0; bool bVar1 = false; switch (dCamParam_c::styles[param_0].engineIdx) { 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(dCamParam_c::styles[param_1].engineIdx) { case 1: case 8: if (dCamParam_c::styles[param_0].engineIdx == dCamParam_c::styles[param_1].engineIdx) { 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) { /* Nonmatching */ 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); cSAngle angle = directionOf(i_actor1) + offset_globe.U(); offset_globe.U(delta_globe.U() - offset_globe.U()); delta_globe.R(0.5f * delta_globe.R() * angle.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) { /* Nonmatching */ } /* 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, 0x40000)) { mTrimSize = 2; } else if (check_owner_action(mPadId, 0xa5000)) { 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 */ void dCamera_c::bumpCheck(u32) { /* Nonmatching */ } /* 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() { /* Nonmatching */ 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 (player_pos.y < roof_y) { player_pos.y = roof_y; } dBgS_CamGndChk gnd_chk; gnd_chk.ClrCam(); gnd_chk.SetObj(); gnd_chk.SetPos(&gnd_chk_pos); f32 ground_y = dComIfG_Bgsp()->GroundCross(&gnd_chk); mBG.m00.m04.SetCam(); mBG.m5C.m04.ClrObj(); mBG.m5C.m04.SetPos(&gnd_chk_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(&player_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 (m33C->shape_angle.y == 0x3b) { m044.y += m320.y * mCamSetup.DMCAngle(); } } 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.m00.m00) { m350 = dComIfG_Bgsp()->GetCamMoveBG(mBG.m5C.m04); } else { m350 = 0; } mRoomNo = -1; //if ((*(char *)&this->mBG == '\0') || // ((d_com_inf_game::g_dComIfG_gameInfo.play.mPlayerStatus[this->mPadId * 2][0] & 0x100000) == 0)) //{ // if (this->field_0x360 == '\0') { // this->mRoomMapToolCameraIdx = 0x1ff; // } // else if ((this->mBG).field_0x5c == '\0') { // this->mRoomMapToolCameraIdx = 0xff; // } // else { // iVar3 = dBgS::GetRoomCamId(&d_com_inf_game::g_dComIfG_gameInfo.play.mBgS, // &(this->mBG).field113_0x74); // this->mRoomMapToolCameraIdx = iVar3; // if (this->mRoomMapToolCameraIdx == 0xff) { // iVar3 = dBgS::GetPolyCamId(&d_com_inf_game::g_dComIfG_gameInfo.play.mBgS, // (uint)(ushort)(this->mBG).field113_0x74.mBgIndex, // (uint)(ushort)(this->mBG).field113_0x74.mTriIdx); // this->mRoomMapToolCameraIdx = iVar3; // } // else { // iVar3 = dBgS::GetRoomId(&d_com_inf_game::g_dComIfG_gameInfo.play.mBgS, // &(this->mBG).field113_0x74); // this->mRoomNo = iVar3; // } // } //} //else { // iVar3 = dBgS::GetPolyCamId(&d_com_inf_game::g_dComIfG_gameInfo.play.mBgS, // (uint)*(ushort *)&(this->mBG).field_0x1a, // (uint)*(ushort *)&(this->mBG).field_0x18); // this->mRoomMapToolCameraIdx = iVar3; //} //if (daSea_ChkArea(local_164, local_15c)) { // m318 = daSea_calcWave(local_164, local_15c); // m314 = 1; //} //else { // m318 = -1e+09; // m314 = 0; //} // //if (m354 < m318) { // m354 = m318; //} dBgS_GndChk gnd_chk_2; gnd_chk.SetPos(&mEye); //fVar11 = cBgS::GroundCross((cBgS *)&d_com_inf_game::g_dComIfG_gameInfo.play,&local_158); //if (*(float *)&this->field_0x310 + 40.0 <= fVar11) { // local_194.x = (this->mEye).x; // local_194.y = (this->mEye).y; // local_194.z = (this->mEye).z; // attentionPos(&local_1f4,this,this->mpPlayerActor); // local_188.x = local_1f4.x; // local_188.y = local_1f4.y; // local_188.z = local_1f4.z; // ::cXyz::operator_-(&cStack_200,&local_194,&local_188); // ::cXyz::operator*(&cStack_20c,&cStack_200,0.5); // mtx::PSVECAdd(&local_188,&cStack_20c,&local_188); //} //else { // local_188.x = (this->mEye).x; // local_188.y = (this->mEye).y; // local_188.z = (this->mEye).z; // attentionPos(&local_1d0,this,this->mpPlayerActor); // local_194.x = local_1d0.x; // local_194.y = local_1d0.y; // local_194.z = local_1d0.z; // ::cXyz::operator_-(&cStack_1dc,&local_188,&local_194); // ::cXyz::operator*(&cStack_1e8,&cStack_1dc,0.5); // mtx::PSVECAdd(&local_194,&cStack_1e8,&local_194); //} //if (this->field_0x360 == '\0') { // *(undefined4 *)&this->field_0x364 = 0; // *(float *)&this->field_0x368 = 0.0; //} //else { // uVar4 = lineCollisionCheckBush(this,&local_188,&local_194); // *(uint *)&this->field_0x364 = uVar4 & 5; // if ((*(uint *)&this->field_0x364 & 4) != 0) { // *(float *)&this->field_0x368 = (this->mCamSetup).field59_0xc0; // } // if ((*(uint *)&this->field_0x364 & 1) != 0) { // *(float *)&this->field_0x368 = (this->mCamSetup).field60_0xc4; // } // if (*(int *)&this->field_0x364 != 0) { // dCcMassS_Mng::GetCamTopPos // (&d_com_inf_game::g_dComIfG_gameInfo.play.mCcS.mMassMng,(cXyz *)&this->field_0x36c); // } //} } /* 8016A0F0-8016A110 .text followCamera2__9dCamera_cFl */ bool dCamera_c::followCamera2(s32 param_0) { followCamera(param_0); } /* 8016A110-8016C4F8 .text followCamera__9dCamera_cFl */ bool dCamera_c::followCamera(s32) { /* Nonmatching */ } /* 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) { /* Nonmatching */ } /* 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 */ } /* 80170490-801708E0 .text CalcSubjectAngle__9dCamera_cFPsPs */ void dCamera_c::CalcSubjectAngle(s16*, s16*) { /* Nonmatching */ } /* 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 */ } /* 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 */ void dCamera_c::shakeCamera() { /* Nonmatching */ } /* 8017BA50-8017BB8C .text StartShake__9dCamera_cFlPUcl4cXyz */ void dCamera_c::StartShake(s32, u8*, s32, cXyz) { /* Nonmatching */ } /* 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; m594.x = 0; m594.y = 0; m594.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); // Based on the asm I'm not sure if `dComIfGp_checkCameraAttentionStatus(camera_id, 8)` is meant to be used here (or the functions that are used in the inline) 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); // The code logic seems right but it's just the usage of this `stage` variable that seems to be the key to this matching dStage_stageDt_c* stage = &dComIfGp_getStage(); 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) { fopCamM_GetParam(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 camId = fopCamM_GetParam(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(camId); 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; }