Files
dusklight/src/d/d_camera.cpp
T
hatal175 5b8f2102e7 Sakuita rope Matching (#2470)
* Change dComIfGp_getAttention to return a pointer

* d_a_obj_sakuita_rope Matching
2025-06-01 20:36:19 -07:00

8687 lines
304 KiB
C++

//
// Generated By: dol2asm
// Translation Unit: d/d_camera
//
#include "d/d_camera.h"
#include "SSystem/SComponent/c_math.h"
#include "math.h"
#include "cmath.h"
#include "d/actor/d_a_alink.h"
#include "d/d_bg_s_sph_chk.h"
#include "d/d_com_inf_actor.h"
#include "d/d_com_inf_game.h"
#include "d/d_demo.h"
#include "dol2asm.h"
#include "f_op/f_op_camera.h"
#include "m_Do/m_Do_controller_pad.h"
#include "m_Do/m_Do_graphic.h"
#include "m_Do/m_Do_lib.h"
#include "d/actor/d_a_boomerang.h"
#include "d/actor/d_a_horse.h"
#include "d/actor/d_a_midna.h"
#include "d/actor/d_a_tag_mhint.h"
#include "d/actor/d_a_tag_mstop.h"
#include "d/actor/d_a_tag_mwait.h"
//
// Forward References:
//
static f32 func_8015FA2C(f32 param_0, f32 param_1, f32 param_2);
static void func_8015FA4C(fopAc_ac_c* param_0);
static bool func_8015FADC(f32 param_0, f32 param_1, f32* param_2);
static bool func_8015FB28(cXyz* param_0, cXyz* param_1, cXyz* param_2);
static void func_8015FBF8(fopAc_ac_c* param_0, fopAc_ac_c* param_1, cXyz* param_2,
f32 param_3, cSAngle param_4);
void Set__15dCamMapToolDataFllP10fopAc_ac_cUsUc();
void __ct__9dCamera_cFP12camera_class();
void func_801602C4();
void func_80160300();
void __dt__9dCamera_cFv();
void initialize__9dCamera_cFP12camera_classP10fopAc_ac_cUlUl();
void Start__9dCamera_cFv();
void QuickStart__9dCamera_cFv();
void Stop__9dCamera_cFv();
void Stay__9dCamera_cFv();
void ChangeModeOK__9dCamera_cFl();
void initPad__9dCamera_cFv();
void updatePad__9dCamera_cFv();
void initMonitor__9dCamera_cFv();
void updateMonitor__9dCamera_cFv();
void checkForceLockTarget__9dCamera_cFv();
void infoReport__9dCamera_cFv();
void Run__9dCamera_cFv();
void NotRun__9dCamera_cFv();
void V__9dCamera_cFv();
void U__9dCamera_cFv();
void SetTrimSize__9dCamera_cFl();
void SetTrimTypeForce__9dCamera_cFl();
void CalcTrimSize__9dCamera_cFv();
void Draw__9dCamera_cFv();
void setStageMapToolData__9dCamera_cFv();
void setMapToolData__9dCamera_cFv();
void SetTagData__9dCamera_cFP10fopAc_ac_clUsUc();
void setRoomMapToolData__9dCamera_cFP15dCamMapToolDatall();
void nextMode__9dCamera_cFl();
void onModeChange__9dCamera_cFll();
void ModeFix__9dCamera_cFl();
void nextType__9dCamera_cFl();
void onTypeChange__9dCamera_cFll();
void onStyleChange__9dCamera_cFll();
void onRoomChange__9dCamera_cFl();
void getParamTargetActor__9dCamera_cFl();
void GetCameraTypeFromMapToolID__9dCamera_cFll();
void GetCameraTypeFromCameraName__9dCamera_cFPCc();
void GetCameraTypeFromToolData__9dCamera_cFP24stage_camera2_data_class();
void pushInfo__9dCamera_cFPQ29dCamera_c10dCamInfo_cs();
void popInfo__9dCamera_cFPQ29dCamera_c10dCamInfo_c();
void heightOf__9dCamera_cFP10fopAc_ac_c();
void relationalPos__9dCamera_cFP10fopAc_ac_cP4cXyz();
void relationalPos__9dCamera_cFP10fopAc_ac_cP10fopAc_ac_cP4cXyzf();
void setUSOAngle__9dCamera_cFv();
void getUSOAngle__9dCamera_cF7cSAngle();
void pointInSight__9dCamera_cFP4cXyz();
void radiusActorInSight__9dCamera_cFP10fopAc_ac_cP10fopAc_ac_cP4cXyzP4cXyzfsf();
void groundHeight__9dCamera_cFP4cXyz();
void lineBGCheck__9dCamera_cFP4cXyzP4cXyzP11dBgS_LinChkUl();
void lineBGCheck__9dCamera_cFP4cXyzP4cXyzP4cXyzUl();
void lineBGCheck__9dCamera_cFP4cXyzP4cXyzUl();
void lineCollisionCheckBush__9dCamera_cFP4cXyzP4cXyz();
static void sph_chk_callback__FP11dBgS_SphChkP10cBgD_Vtx_tiiiP8cM3dGPlaPv();
void compWallMargin__9dCamera_cFP4cXyzP4cXyzf();
void __dt__14dBgS_CamSphChkFv();
void defaultTriming__9dCamera_cFv();
void setView__9dCamera_cFffff();
void forwardCheckAngle__9dCamera_cFv();
void bumpCheck__9dCamera_cFUl();
void __dt__Q214cCcD_ShapeAttr5ShapeFv();
void lineBGCheckBoth__9dCamera_cFP4cXyzP4cXyzP11dBgS_LinChkUl();
void radiusActorInSight__9dCamera_cFP10fopAc_ac_cP10fopAc_ac_cP10fopAc_ac_c();
static void func_80167CB8(fopAc_ac_c* param_0);
void jutOutCheck__9dCamera_cFP4cXyzf();
void tooNearEscape__9dCamera_cFP4cXyz();
void getWaterSurfaceHeight__9dCamera_cFP4cXyz();
void checkGroundInfo__9dCamera_cFv();
void chaseCamera__9dCamera_cFl();
static void func_8016C25C(daAlink_c* param_0);
void Val__7cSAngleCFv();
static void func_8016C2D4(cXyz& param_0);
void getHoldA__8mDoCPd_cFUl();
static void func_8016C330(u32 param_0, u32 param_1);
static void func_8016C34C(u32 param_0);
static void func_8016C368(u32 param_0, u32 param_1);
void lockonCamera__9dCamera_cFl();
static void func_8016E410(f32 param_0, f32 param_1, f32 param_2);
void __ct__7cSGlobeFv();
void LockEdge__12dAttention_cFv();
void getMsgCmdSpeaker__9dCamera_cFv();
void getMsgCmdCut__9dCamera_cFl();
void talktoCamera__9dCamera_cFl();
void talkBasePos__9dCamera_cFP10fopAc_ac_c();
void talkEyePos__9dCamera_cFP10fopAc_ac_c();
static void func_80174E50(cXyz param_0, cXyz param_1, fopAc_ac_c* param_2,
fopAc_ac_c* param_3, fopAc_ac_c* param_4);
bool CalcSubjectAngle__9dCamera_cFPsPs();
void SaveZoomRatio__9dCamera_cFv();
void subjectCamera__9dCamera_cFl();
void magneCamera__9dCamera_cFl();
void colosseumCamera__9dCamera_cFl();
bool test1Camera__9dCamera_cFl();
bool test2Camera__9dCamera_cFl();
void towerCamera__9dCamera_cFl();
void hookshotCamera__9dCamera_cFl();
void railCamera__9dCamera_cFl();
void paraRailCamera__9dCamera_cFl();
void rideCamera__9dCamera_cFl();
static void func_8017D934(cXyz& param_0);
bool manualCamera__9dCamera_cFl();
void observeCamera__9dCamera_cFl();
void fixedFrameCamera__9dCamera_cFl();
void fixedPositionCamera__9dCamera_cFl();
void oneSideCamera__9dCamera_cFl();
void eventCamera__9dCamera_cFl();
void currentEvCamera__9dCamera_cFv();
bool letCamera__9dCamera_cFl();
void setEventRecoveryTrans__9dCamera_cFs();
void runEventRecoveryTrans__9dCamera_cFv();
void EventRecoverNotime__9dCamera_cFv();
void Set__9dCamera_cF4cXyz4cXyz();
void Set__9dCamera_cF4cXyz4cXyzfs();
void Set__9dCamera_cF4cXyz4cXyzsf();
void Reset__9dCamera_cF4cXyz4cXyzfs();
void Reset__9dCamera_cF4cXyz4cXyz();
void Reset__9dCamera_cFv();
void shakeCamera__9dCamera_cFv();
void StartShake__9dCamera_cFlPUcl4cXyz();
void StopShake__9dCamera_cFv();
void StartBlure__9dCamera_cFiP10fopAc_ac_cff();
void ResetBlure__9dCamera_cFv();
void SetBlureAlpha__9dCamera_cFf();
void SetBlureScale__9dCamera_cFfff();
void SetBlurePosition__9dCamera_cFfff();
void SetBlureActor__9dCamera_cFP10fopAc_ac_c();
void blureCamera__9dCamera_cFv();
void onHorseDush__9dCamera_cFv();
void GetForceLockOnActor__9dCamera_cFv();
void ForceLockOn__9dCamera_cFP10fopAc_ac_c();
void ForceLockOff__9dCamera_cFUi();
void ForceLockOff__9dCamera_cFP10fopAc_ac_c();
void dCam_getAngleY__FP12camera_class();
void dCam_getAngleX__FP12camera_class();
void dCam_getControledAngleY__FP12camera_class();
void dCam_getCamera__Fv();
void dCam_getBody__Fv();
static void preparation__FP20camera_process_class();
static void view_setup__FP20camera_process_class();
static void store__FP20camera_process_class();
void Up__9dCamera_cFv();
void Eye__9dCamera_cFv();
void Center__9dCamera_cFv();
static void camera_execute__FP20camera_process_class();
static void camera_draw__FP20camera_process_class();
static void init_phase1__FP12camera_class();
static void init_phase2__FP12camera_class();
static void camera_create__FP12camera_class();
static void camera_delete__FP20camera_process_class();
static bool is_camera_delete__FPv();
void Init__14dCamForcusLineFv();
void Draw__14dCamForcusLineFv();
void Off__14dCamForcusLineFv();
void __sinit_d_camera_cpp();
static void func_801827EC();
static void func_801827F4();
static void func_801827FC();
static void func_80182804();
void getChainGrabActor__9daAlink_cFv();
void checkCokkoGlide__9daAlink_cCFv();
void checkCameraLargeDamage__9daAlink_cCFv();
void getHsSubChainTopPos__9daAlink_cCFv();
static void daAlink_getAlinkActorClass__Fv();
void checkCutHeadProc__9daAlink_cCFv();
void getRideActor__9daAlink_cFv();
static void dComIfGs_isTmpBit__FUs();
void __dt__14d2DBSplinePathFv();
void __ct__Q29dCamera_c10dCamInfo_cFv();
void __dt__Q29dCamera_c10dCamInfo_cFv();
void footHeightOf__9dCamera_cFP10fopAc_ac_c();
void push_any_key__9dCamera_cFv();
void clrFlag__9dCamera_cFUl();
void chkFlag__9dCamera_cFUl();
void GetCheckObjectCount__12dAttention_cFv();
static void dComIfGp_getAttention__Fv();
void Bank__9dCamera_cFv();
void checkThrowDamage__9daPy_py_cCFv();
void GetNP__8cM3dGPlaFv();
void GetCross__11cBgS_LinChkFv();
static void dComIfG_Bgsp__Fv();
void V__7cSGlobeCFv();
void checkGoronSideMove__9daPy_py_cCFv();
static void JMAFastSqrt__Ff();
void fabsf__3stdFf();
void __ct__7cSAngleFv();
void R__7cSGlobeFf();
static void dComIfGp_evmng_cameraPlay__Fv();
void R__7cSGlobeCFv();
bool __lt__7cSAngleCFRC7cSAngle();
bool __gt__7cSAngleCFRC7cSAngle();
void getRightFootPosP__9daPy_py_cFv();
void getLeftFootPosP__9daPy_py_cFv();
u32 getMidnaActor__9daPy_py_cFv();
void checkCopyRodThrowAfter__9daPy_py_cCFv();
void keepLock__12dAttention_cFi();
void checkRide__9daPy_py_cCFv();
void getRightHandPos__9daPy_py_cCFv();
void CheckFlag2__11dCamSetup_cFUs();
void CheckFlag__11dCamSetup_cFUs();
void WaitRollSpeed__11dCamSetup_cFv();
void WaitRollTimer__11dCamSetup_cFv();
void getTrigA__8mDoCPd_cFUl();
void __ops__7cSAngleCFv();
void ThrowTimer__11dCamSetup_cFv();
void ThrowCushion__11dCamSetup_cFv();
void ThrowVAngle__11dCamSetup_cFv();
void ThrowCtrAdjust__11dCamSetup_cFv();
void Arg2__11dCamParam_cFv();
void Arg1__11dCamParam_cFv();
void Arg0__11dCamParam_cFv();
void Fovy__11dCamParam_cFv();
void Arg2__11dCamParam_cFs();
void Arg1__11dCamParam_cFUc();
void Arg0__11dCamParam_cFUc();
void Fovy__11dCamParam_cFUc();
void U__7cSGlobeCFv();
void Flag__11dCamParam_cFlUs();
void __as__7cSAngleFRC7cSAngle();
void CheckFlag__11dCamParam_cFUs();
void Val__11dCamParam_cFli();
void ChargeBRatio__11dCamSetup_cFv();
void ChargeTimer__11dCamSetup_cFv();
void ChargeLatitude__11dCamSetup_cFv();
void getLashDashStart__9daHorse_cCFv();
void fabs__3stdFf();
void checkTurnStandCamera__9daHorse_cCFv();
void d2s__6cAngleFf();
void checkJump__9daHorse_cCFv();
static void fopAcM_GetParam__FPCv();
void checkNoAttention__12daTagMstop_cCFv();
void checkNoAttention__12daTagMhint_cCFv();
void set__4cXyzFfff();
void checkEndMessage__12daTagMwait_cFv();
extern char const* const d_d_camera__stringBase0;
//
// External References:
//
void onBlure__13mDoGph_gInf_cFv();
void onBlure__13mDoGph_gInf_cFPA4_Cf();
void __dt__4cXyzFv();
void mDoMtx_XrotM__FPA4_fs();
void mDoMtx_YrotM__FPA4_fs();
void mDoMtx_ZrotM__FPA4_fs();
void mDoMtx_lookAt__FPA4_fPC3VecPC3VecPC3Vecs();
void mDoMtx_concatProjView__FPA4_CfPA4_CfPA4_f();
void transM__14mDoMtx_stack_cFfff();
void scaleM__14mDoMtx_stack_cFRC4cXyz();
void __ct__4cXyzFv();
void setup__14mDoLib_clipperFffff();
void mDoLib_project__FP3VecP3Vec();
void fopAcIt_Judge__FPFPvPv_PvPv();
void fopAcM_setStageLayer__FPv();
void fopAcM_searchFromName4Event__FPCcs();
void __dt__8cM3dGPlaFv();
void fopCamM_GetParam__FP12camera_class();
void fpcSch_JudgeForPName__FPvPv();
void fpcSch_JudgeByID__FPvPv();
void getStatusRoomDt__20dStage_roomControl_cFi();
void dComIfGp_getRoomCamera__Fi();
void dComIfGp_getRoomArrow__Fi();
void dComLbG_PhaseHandler__FP30request_of_phase_process_classPPFPv_iPv();
void __dt__7cSAngleFv();
void __dt__8cM3dGCylFv();
void isEventBit__11dSv_event_cCFUs();
void isSwitch__10dSv_info_cCFii();
void __dt__8cM3dGLinFv();
void getActiveCamera__14dDemo_object_cFv();
void getRes__14dRes_control_cFPCcPCcP11dRes_info_ci();
void searchMapEventData__14dEvt_control_cFUc();
void getMyStaffId__16dEvent_manager_cFPCcP10fopAc_ac_ci();
void getIsAddvance__16dEvent_manager_cFi();
void getMyActIdx__16dEvent_manager_cFiPCPCciii();
void cutEnd__16dEvent_manager_cFi();
void dPath_GetRoomPath__Fii();
void setViewPort__14dDlst_window_cFffffff();
void setScissor__14dDlst_window_cFffff();
void init__8cM_rnd_cFiii();
void update__18dDlst_effectLine_cFR4cXyzR8_GXColorUsUsUsUsffff();
void dKyw_get_wind_vec__Fv();
void dKyw_get_wind_pow__Fv();
void StartShock__12dVibration_cFii4cXyz();
void __dt__7cSGlobeFv();
void LockonTarget__12dAttention_cFl();
void LockonReleaseDistanse__12dAttention_cFv();
void ActionTarget__12dAttention_cFl();
void CheckObjectTarget__12dAttention_cFl();
void LockonTruth__12dAttention_cFv();
void LineCross__4cBgSFP11cBgS_LinChk();
void GroundCross__4cBgSFP11cBgS_GndChk();
void GetActorPointer__4cBgSCFi();
void GetTriPla__4cBgSCFRC13cBgS_PolyInfoP8cM3dGPla();
void ChkMoveBG__4dBgSFRC13cBgS_PolyInfo();
void GetGroundCode__4dBgSFRC13cBgS_PolyInfo();
void GetCamMoveBG__4dBgSFRC13cBgS_PolyInfo();
void GetRoomCamId__4dBgSFRC13cBgS_PolyInfo();
void GetGrpSoundId__4dBgSFRC13cBgS_PolyInfo();
void ChkGrpInf__4dBgSFRC13cBgS_PolyInfoUl();
void RoofChk__4dBgSFP12dBgS_RoofChk();
void SphChk__4dBgSFP11dBgS_SphChkPv();
void MoveBgMatrixCrrPos__4dBgSFRC13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz();
void __ct__11dBgS_GndChkFv();
void __dt__11dBgS_GndChkFv();
void __dt__14dBgS_CamGndChkFv();
void __ct__18dBgS_CamGndChk_WtrFv();
void __dt__18dBgS_CamGndChk_WtrFv();
void Set__11dBgS_LinChkFPC4cXyzPC4cXyzPC10fopAc_ac_c();
void __ct__14dBgS_CamLinChkFv();
void __dt__14dBgS_CamLinChkFv();
void __ct__11dBgS_SphChkFv();
void __dt__11dBgS_SphChkFv();
void SetObj__16dBgS_PolyPassChkFv();
void ClrObj__16dBgS_PolyPassChkFv();
void SetCam__16dBgS_PolyPassChkFv();
void ClrCam__16dBgS_PolyPassChkFv();
void SetUnderwaterRoof__16dBgS_PolyPassChkFv();
void __ct__12dBgS_RoofChkFv();
void __dt__12dBgS_RoofChkFv();
void SetCam__12dCcMassS_MngFRC8cM3dGCps();
void GetResultCam__12dCcMassS_MngCFv();
void GetCamTopPos__12dCcMassS_MngFP3Vec();
void ChkCamera__4dCcSFR4cXyzR4cXyzfP10fopAc_ac_cP10fopAc_ac_cP10fopAc_ac_c();
void chkCameraPoint__4dCcSFRC4cXyzPQ214cCcD_ShapeAttr5ShapeP10fopAc_ac_cP10fopAc_ac_c();
void rationalBezierRatio__8dCamMathFff();
void zoomFovy__8dCamMathFff();
void __dt__7cDegreeFv();
void xyzRotateX__8dCamMathFR4cXyz7cSAngle();
void xyzRotateY__8dCamMathFR4cXyz7cSAngle();
void xyzHorizontalDistance__8dCamMathFR4cXyzR4cXyz();
bool Shift__9dCstick_cFUl();
void __ct__11dCamParam_cFl();
void __dt__11dCamParam_cFv();
void Change__11dCamParam_cFl();
void SearchStyle__11dCamParam_cFUl();
void __ct__11dCamSetup_cFv();
void __dt__11dCamSetup_cFv();
void CheckLatitudeRange__11dCamSetup_cFPs();
void PlayerHideDist__11dCamSetup_cFv();
void getEvIntData__9dCamera_cFPiPc();
void getEvFloatData__9dCamera_cFPfPc();
void getEvIntData__9dCamera_cFPiPci();
void getEvFloatData__9dCamera_cFPfPcf();
void getEvStringData__9dCamera_cFPcPcPc();
void getEvActor__9dCamera_cFPc();
void getEvActor__9dCamera_cFPcPc();
void pauseEvCamera__9dCamera_cFv();
void fixedFrameEvCamera__9dCamera_cFv();
void stokerEvCamera__9dCamera_cFv();
void rollingEvCamera__9dCamera_cFv();
void fixedPositionEvCamera__9dCamera_cFv();
void uniformTransEvCamera__9dCamera_cFv();
void uniformBrakeEvCamera__9dCamera_cFv();
void uniformAcceleEvCamera__9dCamera_cFv();
void __as__7cSGlobeFRC7cSGlobe();
void abs__4cXyzCFv();
void U__7cSGlobeFRC7cSAngle();
void __ami__4cXyzFRC3Vec();
void __apl__4cXyzFRC3Vec();
void watchActorEvCamera__9dCamera_cFv();
void V__7cSGlobeFRC7cSAngle();
void restorePosEvCamera__9dCamera_cFv();
void talktoEvCamera__9dCamera_cFv();
void maptoolIdEvCamera__9dCamera_cFv();
void styleEvCamera__9dCamera_cFv();
void gameOverEvCamera__9dCamera_cFv();
void tactEvCamera__9dCamera_cFv();
bool turnToActorEvCamera__9dCamera_cFv();
void stbWaitEvCamera__9dCamera_cFv();
void saveEvCamera__9dCamera_cFv();
void loadEvCamera__9dCamera_cFv();
void useItem0EvCamera__9dCamera_cFv();
void useItem1EvCamera__9dCamera_cFv();
void getItemEvCamera__9dCamera_cFv();
void possessedEvCamera__9dCamera_cFv();
void fixedFramesEvCamera__9dCamera_cFv();
void bSplineEvCamera__9dCamera_cFv();
void twoActor0EvCamera__9dCamera_cFv();
void peepHoleEvCamera__9dCamera_cFv();
void digHoleEvCamera__9dCamera_cFv();
void hintTalkEvCamera__9dCamera_cFv();
void bspTransEvCamera__9dCamera_cFv();
bool portalWarpEvCamera__9dCamera_cFv();
void attentionPos__9dCamera_cFP10fopAc_ac_c();
void directionOf__9dCamera_cFP10fopAc_ac_c();
void positionOf__9dCamera_cFP10fopAc_ac_c();
void setFlag__9dCamera_cFUl();
void eyePos__9dCamera_cFP10fopAc_ac_c();
//
// Declarations:
//
namespace {
/* 8015FA2C-8015FA4C 15A36C 0020+00 2/2 0/0 0/0 .text limitf__22@unnamed@d_camera_cpp@Ffff */
static f32 limitf(f32 value, f32 min, f32 max) {
if (value > max) {
return max;
} else if (value < min) {
return min;
}
return value;
}
inline static f32 rangef(f32 value1, f32 value2, f32 ratio) {
return value1 + (value2 - value1) * ratio;
}
inline static bool is_player(fopAc_ac_c* actor) {
return fopAcM_GetName(actor) == PROC_ALINK || fopAcM_GetName(actor) == PROC_ALINK;
}
/* 8015FA4C-8015FADC 15A38C 0090+00 1/1 0/0 0/0 .text
* hideActor__22@unnamed@d_camera_cpp@FP10fopAc_ac_c */
static void hideActor(fopAc_ac_c* actor) {
if (is_player(actor)) {
dComIfGp_onCameraAttentionStatus(0, 2);
if (((daPy_py_c*)actor)->checkHorseRide()) {
fopAcM_OnStatus(dComIfGp_getHorseActor(), 0x1000000);
}
} else {
fopAcM_OnStatus(actor, 0x1000000);
}
}
/* 8015FADC-8015FB28 15A41C 004C+00 1/1 0/0 0/0 .text defaultRadius__22@unnamed@d_camera_cpp@FffPf
*/
static bool defaultRadius(f32 param_0, f32 param_1, f32* param_2) {
f32 var_f30;
f32 var_f31;
if (param_0 < param_1) {
var_f31 = param_0;
var_f30 = param_1;
} else {
var_f30 = param_0;
var_f31 = param_1;
}
if (*param_2 > var_f30) {
*param_2 = var_f30;
return false;
}
if (*param_2 < var_f31) {
*param_2 = var_f31;
return false;
}
return true;
}
/* 8015FB28-8015FBF8 15A468 00D0+00 1/1 0/0 0/0 .text
* posInLine2D__22@unnamed@d_camera_cpp@FP4cXyzP4cXyzP4cXyz */
static bool posInLine2D(cXyz* param_0, cXyz* param_1, cXyz* param_2) {
if (param_0->x <= param_1->x) {
if (param_2->x < param_0->x)
return false;
if (param_2->x > param_1->x)
return false;
} else {
if (param_2->x <= param_1->x)
return false;
if (param_2->x >= param_0->x)
return false;
}
if (param_0->z <= param_1->z) {
if (param_2->z < param_0->z)
return false;
if (param_2->z > param_1->z)
return false;
} else {
if (param_2->z <= param_1->z)
return false;
if (param_2->z >= param_0->z)
return false;
}
return true;
}
/* 8015FBF8-8015FEB8 15A538 02C0+00 1/1 0/0 0/0 .text
* relationalPos2__22@unnamed@d_camera_cpp@FP10fopAc_ac_cP10fopAc_ac_cP4cXyzf7cSAngle */
static cXyz relationalPos2(fopAc_ac_c* i_actor1, fopAc_ac_c* i_actor2, cXyz* param_2, f32 param_3,
cSAngle param_4) {
if (i_actor1 == NULL || i_actor2 == NULL) {
return cXyz::Zero;
}
cXyz pos1 = i_actor1->attention_info.position;
cXyz pos2 = i_actor2->attention_info.position;
cXyz pos_diff = pos2 - pos1;
cSGlobe diff_globe(pos_diff);
pos_diff.normalize();
pos1 -= pos_diff * i_actor1->attention_info.field_0xa;
pos2 += pos_diff * i_actor2->attention_info.field_0xa;
cXyz mid = pos1 + (pos2 - pos1) * 0.5f;
cXyz vec = *param_2;
cSAngle angle = param_4 - diff_globe.U();
if (angle < cSAngle::_0) {
vec.x = -vec.x;
}
cSGlobe globe2(vec);
globe2.U(diff_globe.U() + globe2.U());
diff_globe.R(0.5f * diff_globe.R() * angle.Cos() * param_3);
cXyz ret = mid + diff_globe.Xyz() + globe2.Xyz();
return ret;
}
} // namespace
/* 8015FEB8-8016008C 15A7F8 01D4+00 4/4 0/0 0/0 .text Set__15dCamMapToolDataFllP10fopAc_ac_cUsUc
*/
int dCamMapToolData::Set(s32 param_0, s32 roomNo, fopAc_ac_c* param_2, u16 param_3, u8 param_4) {
if ((param_3 & 0xFF) > field_0x38) {
return 0;
}
stage_camera_class* room_cam = dComIfGp_getRoomCamera(roomNo);
stage_arrow_class* room_arrow = dComIfGp_getRoomArrow(roomNo);
if (room_cam != NULL && param_0 >= 0 && param_0 < room_cam->num) {
Clr();
field_0x30 = param_0;
field_0x0 = room_cam->m_entries[field_0x30];
field_0x3a = (field_0x0.field_0x14 >> 0xE) & 3;
if (param_3 & 0x8000) {
field_0x3a |= 0x10;
}
if (field_0x0.field_0x14 & 0x2000) {
field_0x0.field_0x14 |= 0xC000;
} else {
field_0x0.field_0x14 &= ~0xC000;
}
field_0x2c = field_0x0.m_arrow_idx;
if (room_arrow != NULL && field_0x2c >= 0 && field_0x2c < room_arrow->num) {
field_0x18 = room_arrow->m_entries[field_0x2c];
}
field_0x34 = param_2;
field_0x3b = param_4;
field_0x38 = param_3 & 0xFF;
return 1;
}
return 0;
}
/* ############################################################################################## */
/* 80393F68-80393F68 0205C8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_80393F68 = "camtype.dat";
SECTION_DEAD static char const* const stringBase_80393F74 = "D_MN01A";
SECTION_DEAD static char const* const stringBase_80393F7C = "D_MN10A";
SECTION_DEAD static char const* const stringBase_80393F84 = "D_MN11A";
SECTION_DEAD static char const* const stringBase_80393F8C = "D_MN04A";
SECTION_DEAD static char const* const stringBase_80393F94 = "D_MN05A";
SECTION_DEAD static char const* const stringBase_80393F9C = "D_MN07A";
SECTION_DEAD static char const* const stringBase_80393FA4 = "FieldS";
SECTION_DEAD static char const* const stringBase_80393FAB = "Event";
SECTION_DEAD static char const* const stringBase_80393FB1 = "Water";
SECTION_DEAD static char const* const stringBase_80393FB7 = "Scope";
SECTION_DEAD static char const* const stringBase_80393FBD = "WaterSurf";
SECTION_DEAD static char const* const stringBase_80393FC7 = "HorseT";
SECTION_DEAD static char const* const stringBase_80393FCE = "Board";
SECTION_DEAD static char const* const stringBase_80393FD4 = "Canoe";
SECTION_DEAD static char const* const stringBase_80393FDA = "Keep";
SECTION_DEAD static char const* const stringBase_80393FDF = "Rodeo";
SECTION_DEAD static char const* const stringBase_80393FE5 = "MagneBoots";
SECTION_DEAD static char const* const stringBase_80393FF0 = "MagneRoof";
SECTION_DEAD static char const* const stringBase_80393FFA = "MagneWall";
SECTION_DEAD static char const* const stringBase_80394004 = "CoccoJump";
SECTION_DEAD static char const* const stringBase_8039400E = "Boar";
SECTION_DEAD static char const* const stringBase_80394013 = "GoatBattle";
SECTION_DEAD static char const* const stringBase_8039401E = "GoronJump";
SECTION_DEAD static char const* const stringBase_80394028 = "Spinner";
SECTION_DEAD static char const* const stringBase_80394030 = "HookWall";
SECTION_DEAD static char const* const stringBase_80394039 = "HookRoof";
SECTION_DEAD static char const* const stringBase_80394042 = "HookActor";
SECTION_DEAD static char const* const stringBase_8039404C = "RoofHung";
SECTION_DEAD static char const* const stringBase_80394055 = "Rotary";
SECTION_DEAD static char const* const stringBase_8039405C = "Street";
SECTION_DEAD static char const* const stringBase_80394063 = "StreetN";
SECTION_DEAD static char const* const stringBase_8039406B = "StreetP";
SECTION_DEAD static char const* const stringBase_80394073 = "Rampart2";
SECTION_DEAD static char const* const stringBase_8039407C = "Allay";
SECTION_DEAD static char const* const stringBase_80394082 = "AllayR";
SECTION_DEAD static char const* const stringBase_80394089 = "AllayR2";
SECTION_DEAD static char const* const stringBase_80394091 = "AllayS";
SECTION_DEAD static char const* const stringBase_80394098 = "AllayN";
SECTION_DEAD static char const* const stringBase_8039409F = "AllayR3";
SECTION_DEAD static char const* const stringBase_803940A7 = "CopyRodHall";
SECTION_DEAD static char const* const stringBase_803940B3 = "MidnaTag";
SECTION_DEAD static char const* const stringBase_803940BC = "WarpObj";
SECTION_DEAD static char const* const stringBase_803940C4 = "LV9GZeldaTri";
SECTION_DEAD static char const* const stringBase_803940D1 = "LV4BOSSSPJP";
SECTION_DEAD static char const* const stringBase_803940DD = "LV7BOSS";
SECTION_DEAD static char const* const stringBase_803940E5 = "TeppeiHook";
SECTION_DEAD static char const* const stringBase_803940F0 = "Peep";
SECTION_DEAD static char const* const stringBase_803940F5 = "DungeonS";
SECTION_DEAD static char const* const stringBase_803940FE = "Room";
SECTION_DEAD static char const* const stringBase_80394103 = "Cave";
SECTION_DEAD static char const* const stringBase_80394108 = "Timer";
SECTION_DEAD static char const* const stringBase_8039410E = "Target";
SECTION_DEAD static char const* const stringBase_80394115 = "Smoothless";
SECTION_DEAD static char const* const stringBase_80394120 = "Mode";
SECTION_DEAD static char const* const stringBase_80394125 = "Radius";
SECTION_DEAD static char const* const stringBase_8039412C = "RadiusNear";
SECTION_DEAD static char const* const stringBase_80394137 = "Longitude";
SECTION_DEAD static char const* const stringBase_80394141 = "Fovy";
SECTION_DEAD static char const* const stringBase_80394146 = "FovyNear";
SECTION_DEAD static char const* const stringBase_8039414F = "Latitude";
SECTION_DEAD static char const* const stringBase_80394158 = "Listener";
SECTION_DEAD static char const* const stringBase_80394161 = "@STARTER";
SECTION_DEAD static char const* const stringBase_8039416A = "Speaker";
SECTION_DEAD static char const* const stringBase_80394172 = "@TALKPARTNER";
SECTION_DEAD static char const* const stringBase_8039417F = "E_RD";
SECTION_DEAD static char const* const stringBase_80394184 = "PAUSE";
SECTION_DEAD static char const* const stringBase_8039418A = "WAIT";
SECTION_DEAD static char const* const stringBase_8039418F = "TALK";
SECTION_DEAD static char const* const stringBase_80394194 = "FIXEDPOS";
SECTION_DEAD static char const* const stringBase_8039419D = "FIXEDFRM";
SECTION_DEAD static char const* const stringBase_803941A6 = "UNITRANS";
SECTION_DEAD static char const* const stringBase_803941AF = "WATCHACTOR";
SECTION_DEAD static char const* const stringBase_803941BA = "RESTOREPOS";
SECTION_DEAD static char const* const stringBase_803941C5 = "GETITEM";
SECTION_DEAD static char const* const stringBase_803941CD = "GAMEOVER";
SECTION_DEAD static char const* const stringBase_803941D6 = "TURNTOACTOR";
SECTION_DEAD static char const* const stringBase_803941E2 = "ROLLING";
SECTION_DEAD static char const* const stringBase_803941EA = "TACT";
SECTION_DEAD static char const* const stringBase_803941EF = "WINDDIR";
SECTION_DEAD static char const* const stringBase_803941F7 = "PORTALWARP";
SECTION_DEAD static char const* const stringBase_80394202 = "STYLE";
SECTION_DEAD static char const* const stringBase_80394208 = "SAVE";
SECTION_DEAD static char const* const stringBase_8039420D = "LOAD";
SECTION_DEAD static char const* const stringBase_80394212 = "USEITEM0";
SECTION_DEAD static char const* const stringBase_8039421B = "USEITEM1";
SECTION_DEAD static char const* const stringBase_80394224 = "FIXEDFRMS";
SECTION_DEAD static char const* const stringBase_8039422E = "BSPLINE";
SECTION_DEAD static char const* const stringBase_80394236 = "POSSESSED";
SECTION_DEAD static char const* const stringBase_80394240 = "TWOACTOR0";
SECTION_DEAD static char const* const stringBase_8039424A = "STOKER";
SECTION_DEAD static char const* const stringBase_80394251 = "UNIBRAKE";
SECTION_DEAD static char const* const stringBase_8039425A = "UNIACCELE";
SECTION_DEAD static char const* const stringBase_80394264 = "STBWAIT";
SECTION_DEAD static char const* const stringBase_8039426C = "CURRENT";
SECTION_DEAD static char const* const stringBase_80394274 = "PEEPHOLE";
SECTION_DEAD static char const* const stringBase_8039427D = "DIGHOLE";
SECTION_DEAD static char const* const stringBase_80394285 = "HINTTALK";
SECTION_DEAD static char const* const stringBase_8039428E = "BSPTRANS";
SECTION_DEAD static char const* const stringBase_80394297 = "MAPTOOL";
#pragma pop
/* 803BA160-803BA16C 017280 000C+00 2/2 0/0 0/0 .data cNullVec__6Z2Calc */
SECTION_DATA static u8 cNullVec__6Z2Calc[12] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 803BA25C-803BA34C 01737C 00F0+00 2/3 3/3 0/0 .data engine_tbl__9dCamera_c */
engine_fn dCamera_c::engine_tbl[] = {
&dCamera_c::letCamera, &dCamera_c::chaseCamera, &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::colosseumCamera, &dCamera_c::observeCamera, &dCamera_c::magneCamera,
&dCamera_c::railCamera, &dCamera_c::paraRailCamera, &dCamera_c::oneSideCamera,
&dCamera_c::test1Camera, &dCamera_c::test2Camera,
};
namespace {
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 fopAc_ac_c* get_player_actor(camera_class* i_camera) {
return dComIfGp_getPlayer(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_boomerang_actor(fopAc_ac_c* i_actor) {
if (is_player(i_actor)) {
return static_cast<daAlink_c*>(i_actor)->getThrowBoomerangActor();
} else {
return NULL;
}
}
inline static cSAngle sAngleX(cXyz& i_vec) {
return cSAngle(cM_atan2s(i_vec.y, i_vec.z));
}
inline static bool lineCollisionCheck(cXyz param_0, cXyz param_1, fopAc_ac_c* param_2,
fopAc_ac_c* param_3, fopAc_ac_c* param_4) {
return dComIfG_Ccsp()->ChkCamera(param_0, param_1, 15.0f, param_2, param_3, param_4);
}
inline static f32 playerMaxSpeed() {
return 40.0f;
}
} // namespace
/* 8016008C-801602C4 15A9CC 0238+00 1/1 0/0 0/0 .text __ct__9dCamera_cFP12camera_class */
dCamera_c::dCamera_c(camera_class* i_camera) : mCamParam(0) {
initialize(i_camera, get_player_actor(i_camera), get_camera_id(i_camera),
get_controller_id(i_camera));
}
/* 80160304-80160470 15AC44 016C+00 1/1 0/0 0/0 .text __dt__9dCamera_cFv */
// NONMATCHING extra mWork destructor
dCamera_c::~dCamera_c() {
if (!daPy_py_c::checkPeepEndSceneChange()) {
dComIfGs_getTurnRestart().setCameraCtr(mCenter);
dComIfGs_getTurnRestart().setCameraEye(mEye);
dComIfGs_getTurnRestart().setCameraUp(mUp);
dComIfGs_getTurnRestart().setCameraFvy(mFovy);
fopAc_ac_c::setStopStatus(0);
}
}
enum SpecialType {
/* 0x00 */ CAM_TYPE_FIELD_S,
/* 0x01 */ CAM_TYPE_EVENT,
/* 0x02 */ CAM_TYPE_WATER,
/* 0x03 */ CAM_TYPE_SCOPE,
/* 0x04 */ CAM_TYPE_CANOE,
/* 0x05 */ CAM_TYPE_HORSE_T,
/* 0x06 */ CAM_TYPE_BOARD,
/* 0x07 */ CAM_TYPE_07,
/* 0x08 */ CAM_TYPE_KEEP,
/* 0x09 */ CAM_TYPE_RODEO,
/* 0x0A */ CAM_TYPE_MAGNE_BOOTS,
/* 0x0B */ CAM_TYPE_MAGNE_WALL,
/* 0x0C */ CAM_TYPE_MAGNE_ROOF,
/* 0x0D */ CAM_TYPE_WATER_SURF,
/* 0x0E */ CAM_TYPE_ROTARY,
/* 0x0F */ CAM_TYPE_STREET,
/* 0x10 */ CAM_TYPE_STREET_N,
/* 0x11 */ CAM_TYPE_STREET_P,
/* 0x12 */ CAM_TYPE_RAMPART_2,
/* 0x13 */ CAM_TYPE_ALLAY,
/* 0x14 */ CAM_TYPE_ALLAY_R,
/* 0x15 */ CAM_TYPE_ALLAY_R2,
/* 0x16 */ CAM_TYPE_ALLAY_S,
/* 0x17 */ CAM_TYPE_ALLAY_N,
/* 0x18 */ CAM_TYPE_ALLAY_R3,
/* 0x19 */ CAM_TYPE_HOOK_WALL,
/* 0x1A */ CAM_TYPE_HOOK_ROOF,
/* 0x1B */ CAM_TYPE_HOOK_ACTOR,
/* 0x1C */ CAM_TYPE_SPINNER,
/* 0x1D */ CAM_TYPE_GORON_JUMP,
/* 0x1E */ CAM_TYPE_GOAT_BATTLE,
/* 0x1F */ CAM_TYPE_BOAR,
/* 0x20 */ CAM_TYPE_COCCO_JUMP,
/* 0x21 */ CAM_TYPE_ROOF_HUNG,
/* 0x22 */ CAM_TYPE_COPY_ROD_HALL,
/* 0x23 */ CAM_TYPE_MIDNA_TAG,
/* 0x24 */ CAM_TYPE_WARP_OBJ,
/* 0x25 */ CAM_TYPE_LV9_GZELDA_TRI,
/* 0x26 */ CAM_TYPE_TEPPEI_HOOK,
/* 0x27 */ CAM_TYPE_LV4_BOSS_SPJP,
/* 0x28 */ CAM_TYPE_LV7_BOSS,
/* 0x29 */ CAM_TYPE_PEEP,
};
namespace {
/* 8042C8F8-8042C9A0 059618 00A8+00 12/12 0/0 0/0 .bss specialType__22@unnamed@d_camera_cpp@ */
static int specialType[42];
/* 80451020-80451024 000520 0004+00 4/4 0/0 0/0 .sbss Stage__22@unnamed@d_camera_cpp@ */
static int Stage;
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 bool isPlayerCharging(u32 param_0) {
return check_owner_action(param_0, 0x40000000);
}
inline static void setComStat(u32 param_0) {
dComIfGp_onCameraAttentionStatus(0, param_0);
}
inline static bool getComStat(u32 param_0) {
return dComIfGp_getCameraAttentionStatus(0) & param_0;
}
inline static void clrComStat(u32 param_0) {
dComIfGp_offCameraAttentionStatus(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
/* 80160470-801614AC 15ADB0 103C+00 1/1 0/0 0/0 .text
* initialize__9dCamera_cFP12camera_classP10fopAc_ac_cUlUl */
void dCamera_c::initialize(camera_class* i_camera, fopAc_ac_c* i_player, u32 i_cameraID,
u32 i_padID) {
char* type_data =
(char*)dComIfG_getObjectRes(dComIfGp_getCameraParamFileName(0), "camtype.dat");
mCamTypeData = (dCamera_type_data*)(type_data + 8);
mCamTypeNum = *(int*)(type_data + 4);
field_0x0 = i_camera;
field_0x20 = 1;
field_0x21 = 0;
field_0x24 = 0;
mpPlayerActor = i_player;
mCameraID = i_cameraID;
mPadID = i_padID;
initMonitor();
initPad();
mFocusLine.Init();
mRoomNo = dComIfGp_roomControl_getStayNo();
const char* stage_name = dComIfGp_getStartStageName();
if (strcmp(stage_name, "D_MN01A") == 0) {
Stage = 0x68;
} else if (strcmp(stage_name, "D_MN10A") == 0) {
Stage = 0x69;
} else if (strcmp(stage_name, "D_MN11A") == 0) {
Stage = 0x6A;
} else if (strcmp(stage_name, "D_MN04A") == 0) {
Stage = 0x66;
} else if (strcmp(stage_name, "D_MN05A") == 0) {
Stage = 0x65;
} else if (strcmp(stage_name, "D_MN07A") == 0) {
Stage = 0x6B;
}
specialType[CAM_TYPE_FIELD_S] = GetCameraTypeFromCameraName("FieldS");
specialType[CAM_TYPE_EVENT] = GetCameraTypeFromCameraName("Event");
specialType[CAM_TYPE_WATER] = GetCameraTypeFromCameraName("Water");
specialType[CAM_TYPE_SCOPE] = GetCameraTypeFromCameraName("Scope");
specialType[CAM_TYPE_WATER_SURF] = GetCameraTypeFromCameraName("WaterSurf");
specialType[CAM_TYPE_HORSE_T] = GetCameraTypeFromCameraName("HorseT");
specialType[CAM_TYPE_BOARD] = GetCameraTypeFromCameraName("Board");
specialType[CAM_TYPE_CANOE] = GetCameraTypeFromCameraName("Canoe");
specialType[CAM_TYPE_KEEP] = GetCameraTypeFromCameraName("Keep");
specialType[CAM_TYPE_RODEO] = GetCameraTypeFromCameraName("Rodeo");
specialType[CAM_TYPE_MAGNE_BOOTS] = GetCameraTypeFromCameraName("MagneBoots");
specialType[CAM_TYPE_MAGNE_ROOF] = GetCameraTypeFromCameraName("MagneRoof");
specialType[CAM_TYPE_MAGNE_WALL] = GetCameraTypeFromCameraName("MagneWall");
specialType[CAM_TYPE_COCCO_JUMP] = GetCameraTypeFromCameraName("CoccoJump");
specialType[CAM_TYPE_BOAR] = GetCameraTypeFromCameraName("Boar");
specialType[CAM_TYPE_GOAT_BATTLE] = GetCameraTypeFromCameraName("GoatBattle");
specialType[CAM_TYPE_GORON_JUMP] = GetCameraTypeFromCameraName("GoronJump");
specialType[CAM_TYPE_SPINNER] = GetCameraTypeFromCameraName("Spinner");
specialType[CAM_TYPE_HOOK_WALL] = GetCameraTypeFromCameraName("HookWall");
specialType[CAM_TYPE_HOOK_ROOF] = GetCameraTypeFromCameraName("HookRoof");
specialType[CAM_TYPE_HOOK_ACTOR] = GetCameraTypeFromCameraName("HookActor");
specialType[CAM_TYPE_ROOF_HUNG] = GetCameraTypeFromCameraName("RoofHung");
specialType[CAM_TYPE_ROTARY] = GetCameraTypeFromCameraName("Rotary");
specialType[CAM_TYPE_STREET] = GetCameraTypeFromCameraName("Street");
specialType[CAM_TYPE_STREET_N] = GetCameraTypeFromCameraName("StreetN");
specialType[CAM_TYPE_STREET_P] = GetCameraTypeFromCameraName("StreetP");
specialType[CAM_TYPE_RAMPART_2] = GetCameraTypeFromCameraName("Rampart2");
specialType[CAM_TYPE_ALLAY] = GetCameraTypeFromCameraName("Allay");
specialType[CAM_TYPE_ALLAY_R] = GetCameraTypeFromCameraName("AllayR");
specialType[CAM_TYPE_ALLAY_R2] = GetCameraTypeFromCameraName("AllayR2");
specialType[CAM_TYPE_ALLAY_S] = GetCameraTypeFromCameraName("AllayS");
specialType[CAM_TYPE_ALLAY_N] = GetCameraTypeFromCameraName("AllayN");
specialType[CAM_TYPE_ALLAY_R3] = GetCameraTypeFromCameraName("AllayR3");
specialType[CAM_TYPE_COPY_ROD_HALL] = GetCameraTypeFromCameraName("CopyRodHall");
specialType[CAM_TYPE_MIDNA_TAG] = GetCameraTypeFromCameraName("MidnaTag");
specialType[CAM_TYPE_WARP_OBJ] = GetCameraTypeFromCameraName("WarpObj");
specialType[CAM_TYPE_LV9_GZELDA_TRI] = GetCameraTypeFromCameraName("LV9GZeldaTri");
specialType[CAM_TYPE_LV4_BOSS_SPJP] = GetCameraTypeFromCameraName("LV4BOSSSPJP");
specialType[CAM_TYPE_LV7_BOSS] = GetCameraTypeFromCameraName("LV7BOSS");
specialType[CAM_TYPE_TEPPEI_HOOK] = GetCameraTypeFromCameraName("TeppeiHook");
mCurType = mMapToolType = specialType[CAM_TYPE_FIELD_S];
specialType[CAM_TYPE_PEEP] = GetCameraTypeFromCameraName("Peep");
field_0x698 = 0xFF;
field_0x69c = 0;
mIsWolf = daPy_py_c::checkNowWolf() != 0;
mCurMode = 0;
field_0x680 = 0;
field_0x1ac = 11;
field_0x1b4 = 0.0f;
mEventFlags = 0;
field_0x1b0 = cSAngle::_0;
field_0xa8 = 0;
field_0xac = cM_rndFX(0x7FFF);
field_0x84 = 1.0f;
field_0x91c = 0.0f;
mTrimHeight = 0.0f;
mTrimSize = 0;
mTrimTypeForce = -1;
field_0x940 = 0;
field_0x944 = 0;
field_0x950 = field_0x940;
mBG.field_0x5c.field_0x0 = 0;
mBG.field_0x0.field_0x0 = 0;
mBG.field_0xc0.field_0x3c = 0xFF;
mBG.field_0x5c.field_0x58 = -1000000000.0f;
mBG.field_0x0.field_0x58 = -1000000000.0f;
mBG.field_0x0.field_0x4.OffNormalGrp();
mBG.field_0x0.field_0x4.OnWaterGrp();
mBG.field_0xc0.field_0x1 = 0;
mBG.field_0xc0.field_0x0 = 0;
mBG.field_0xc0.field_0x10 = cXyz::Zero;
mBG.field_0xc0.field_0x4 = mBG.field_0xc0.field_0x10;
mBG.field_0xc0.field_0x20 = 0;
mBG.field_0xc0.field_0x1e = cSAngle::_0;
mBG.field_0xc0.field_0x1c = mBG.field_0xc0.field_0x1e;
mBG.field_0xc0.field_0x34 = 0;
mBG.field_0x108.field_0x0 = 0;
mBG.field_0x108.field_0x4 = 0.0f;
mBG.field_0xc0.field_0x38 = -1000000000.0f;
mBG.field_0xc0.field_0x40 = 0xFF;
field_0x934 = mCamSetup.mBGChk.WallUpDistance();
mMapToolType = 0xFF;
field_0x7ac.Clr();
field_0x7e8.Clr();
field_0x824.Clr();
field_0x860.Clr();
field_0x89c.Clr();
field_0x8d8.Clr();
setStageMapToolData();
if (field_0x7e8.field_0x30 != 0xFF) {
mMapToolType = GetCameraTypeFromToolData(&field_0x7e8.field_0x0);
}
dStage_stageDt_c* stage_dt = dComIfGp_getStage();
stage_stag_info_class* stag_info;
if (stage_dt != NULL) {
stag_info = stage_dt->getStagInfo();
} else {
stag_info = NULL;
}
if (stag_info != NULL && mMapToolType == 0xFF) {
switch (dStage_stagInfo_GetSTType(stag_info)) {
case ST_DUNGEON:
mMapToolType = GetCameraTypeFromCameraName("DungeonS");
break;
case ST_ROOM:
mMapToolType = GetCameraTypeFromCameraName("Room");
break;
default:
mMapToolType = GetCameraTypeFromCameraName("FieldS");
break;
}
}
int sp108 = 0xFF;
s32 sp10C = dComIfGp_roomControl_getStayNo();
dStage_roomDt_c* room_dt = dComIfGp_roomControl_getStatusRoomDt(sp10C);
if (room_dt != NULL) {
dStage_FileList_dt_c* filelist = room_dt->getFileListInfo();
if (filelist != NULL) {
sp108 = dStage_FileList_dt_GetDefaultCamera(filelist);
}
}
setRoomMapToolData(&field_0x824, sp108, sp10C);
checkGroundInfo();
setMapToolData();
if (field_0x7ac.field_0x30 != 0xFF) {
mCurType = GetCameraTypeFromToolData(&field_0x7ac.field_0x0);
} else {
if (check_owner_action(mPadID, 0x8000000)) {
mCurType = GetCameraTypeFromCameraName("Cave");
} else {
mCurType = mMapToolType;
}
}
mCamStyle = mCamTypeData[mCurType].field_0x18[mIsWolf][mCurMode];
mLockOnActorID = 0xFFFFFFFF;
mEventData.field_0x14 = -1;
mEventData.field_0x18 = -1;
mEventData.field_0x4 = -1;
mEventData.field_0xc = -1;
mEventData.field_0x0 = 1;
OS_REPORT("camera: init: type %d mode %d style %d\n", mCurType, mCurMode, mCamStyle);
mCamParam.Change(mCamStyle);
if (daPy_py_c::checkPeepEndSceneChange() || dComIfGp_getStartStagePoint() == -2 ||
dComIfGp_getStartStagePoint() == -3)
{
mCenter = field_0x5c.mCenter = dComIfGs_getTurnRestart().getCameraCtr();
mEye = field_0x5c.mEye = dComIfGs_getTurnRestart().getCameraEye();
field_0x5c.mDirection.Val(mEye - mCenter);
mDirection = field_0x5c.mDirection;
field_0x8c = field_0x5c.mDirection.U().Inv();
mUp = dComIfGs_getTurnRestart().getCameraUp();
mBank = cSAngle::_0;
field_0x5c.mBank = mBank;
field_0x5c.mFovy = mFovy = dComIfGs_getTurnRestart().getCameraFvy();
} else if (daAlink_getAlinkActorClass()->checkStartFall()) {
cXyz attn_pos = attentionPos(mpPlayerActor);
if (mCamParam.Algorythmn() == 1) {
attn_pos.y += -20.0f;
}
cSGlobe spE8(0.0f, cSAngle((s16)0), directionOf(mpPlayerActor));
mCenter = field_0x5c.mCenter = attn_pos + spE8.Xyz();
cXyz center = dComIfGs_getTurnRestart().getCameraCtr();
cXyz eye = dComIfGs_getTurnRestart().getCameraEye();
field_0x5c.mDirection.Val(eye - center);
field_0x8c = field_0x5c.mDirection.U().Inv();
mEye = field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
mUp = dComIfGs_getTurnRestart().getCameraUp();
mBank = cSAngle::_0;
field_0x5c.mBank = mBank;
field_0x5c.mFovy = mFovy = dComIfGs_getTurnRestart().getCameraFvy();
} else {
cXyz attn_pos = attentionPos(mpPlayerActor);
if (mCamParam.Algorythmn() == 1) {
attn_pos.y += -20.0f;
}
cSGlobe spE8(0.0f, cSAngle((s16)0), directionOf(mpPlayerActor));
mCenter = field_0x5c.mCenter = attn_pos + spE8.Xyz();
field_0x5c.mDirection.Val(300.0f, 0, directionOf(mpPlayerActor).Inv());
mEye = field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
mDirection = field_0x5c.mDirection;
field_0x8c = field_0x5c.mDirection.U().Inv();
mFovy = 60.0f;
field_0x5c.mFovy = 60.0f;
mUp.set(0.0f, 1.0f, 0.0f);
mBank = cSAngle::_0;
field_0x5c.mBank = mBank;
}
mFakeAngleSys.field_0x0 = 0;
field_0x674 = 0xFF;
field_0x670 = 0xFF;
field_0x668 = 0;
field_0x66c = 0;
field_0x678 = 1;
field_0x73c = 0.0f;
field_0x738 = 85.0f;
field_0x610 = 0;
field_0x611 = 0;
clearInfo(&field_0xb0, 0);
clearInfo(&field_0xd0[0], 0);
clearInfo(&field_0xd0[1], 0);
clearInfo(&field_0x110.field_0x8, 0);
field_0x110.field_0x4 = 0;
field_0x110.field_0x28 = cXyz::Zero;
field_0x110.field_0x0 = -1;
field_0x93c = 0;
mThrowTimer = 0;
field_0x94c = cSAngle::_0;
field_0x740.field_0x18 = mUp;
field_0x740.field_0xc = mEye;
field_0x740.field_0x0 = mCenter;
setFlag(0x1000);
daAlink_c* player = daAlink_getAlinkActorClass();
daMidna_c* midna = daPy_py_c::getMidnaActor();
field_0x194 = player->checkMidnaRide() && !midna->checkNoDraw();
field_0x958 = 0;
field_0x95c = cXyz::Zero;
}
/* 801614AC-801614C4 15BDEC 0018+00 0/0 1/1 106/106 .text Start__9dCamera_cFv */
void dCamera_c::Start() {
if (mCamSetup.CheckFlag(0x8000) && field_0x24 != 0 && field_0x24 != 2) {
OS_REPORT("camera: start\n");
}
if (field_0x24 != 0) {
field_0x24 = 2;
}
}
/* 801614C4-801614D0 15BE04 000C+00 0/0 1/1 0/0 .text QuickStart__9dCamera_cFv */
void dCamera_c::QuickStart() {
if (mCamSetup.CheckFlag(0x8000) && field_0x24 != 0) {
OS_REPORT("camera: quick start\n");
}
field_0x24 = 0;
}
/* 801614D0-801614E8 15BE10 0018+00 0/0 2/2 98/98 .text Stop__9dCamera_cFv */
void dCamera_c::Stop() {
clrFlag(0x200000);
if (mCamSetup.CheckFlag(0x8000) && field_0x24 != 3) {
OS_REPORT("%06d: camera: stop \n", field_0xa8);
}
field_0x24 = 3;
}
/* 801614E8-801614F4 15BE28 000C+00 0/0 2/2 0/0 .text Stay__9dCamera_cFv */
void dCamera_c::Stay() {
field_0x24 = 1;
}
/* 801614F4-80161550 15BE34 005C+00 2/2 4/4 0/0 .text ChangeModeOK__9dCamera_cFl */
bool dCamera_c::ChangeModeOK(s32 param_0) {
if (dComIfGp_evmng_cameraPlay() || chkFlag(0x20000000)) {
return 0;
}
return !(mCamTypeData[mCurType].field_0x18[mIsWolf][param_0] < 0);
}
/* 80161550-801617B0 15BE90 0260+00 1/1 0/0 0/0 .text initPad__9dCamera_cFv */
// NONMATCHING weird stuff with getTrig/Hold. wrong types???
void dCamera_c::initPad() {
if (chkFlag(0x1000000)) {
mPadInfo.mMainStick.mLastPosX = 0.0f;
mPadInfo.mMainStick.mLastPosY = 0.0f;
mPadInfo.mMainStick.mLastValue = 0.0f;
} else {
mPadInfo.mMainStick.mLastPosX = mDoCPd_c::getStickX3D(mPadID);
mPadInfo.mMainStick.mLastPosY = mDoCPd_c::getStickY(mPadID);
mPadInfo.mMainStick.mLastValue = mDoCPd_c::getStickValue(mPadID);
}
mPadInfo.mMainStick.mPosXDelta = 0.0f;
mPadInfo.mMainStick.mPosYDelta = 0.0f;
mPadInfo.mMainStick.mValueDelta = 0.0f;
mPadInfo.mMainStick.mAngle = cSAngle::_0;
if (chkFlag(0x800000)) {
mPadInfo.mMainStick.mLastPosX = 0.0f;
mPadInfo.mMainStick.mLastPosY = 0.0f;
mPadInfo.mMainStick.mLastValue = 0.0f;
} else {
mPadInfo.mCStick.mLastPosX = mDoCPd_c::getSubStickX(mPadID);
mPadInfo.mCStick.mLastPosY = mDoCPd_c::getSubStickY(mPadID);
mPadInfo.mCStick.mLastValue = mDoCPd_c::getSubStickValue(mPadID);
}
mPadInfo.mCStick.mPosXDelta = 0.0f;
mPadInfo.mCStick.mPosYDelta = 0.0f;
mPadInfo.mCStick.mValueDelta = 0.0f;
mPadInfo.mCStick.mAngle = cSAngle::_0;
field_0x1fc = 0;
field_0x1f8 = 0;
field_0x1f4 = 0;
mTriggerLeftLast = mDoCPd_c::getAnalogL(mPadID);
mTriggerLeftDelta = 0.0f;
field_0x208 = 0;
field_0x209 = 0;
field_0x20a = 0;
field_0x20b = 0;
mTriggerRightLast = mDoCPd_c::getAnalogR(mPadID);
mTriggerRightDelta = 0.0f;
field_0x214 = 0;
field_0x215 = 0;
field_0x216 = 0;
field_0x217 = 0;
mHoldX = mDoCPd_c::getHoldX(mPadID);
mTrigX = mDoCPd_c::getTrigX(mPadID);
mHoldY = mDoCPd_c::getHoldY(mPadID);
mTrigY = mDoCPd_c::getTrigY(mPadID);
mHoldY = mDoCPd_c::getHoldY(mPadID);
mTrigY = mDoCPd_c::getTrigY(mPadID);
mHoldZ = mDoCPd_c::getHoldZ(mPadID);
mTrigZ = mDoCPd_c::getTrigZ(mPadID);
field_0x21f = 0;
mHoldB = mDoCPd_c::getHoldB(mPadID);
mTrigB = mDoCPd_c::getTrigB(mPadID);
field_0x223 = 0;
field_0x224 = 0;
}
/* 801617B0-80161D84 15C0F0 05D4+00 1/1 0/0 0/0 .text updatePad__9dCamera_cFv */
void dCamera_c::updatePad() {
dComIfGp_getAttention();
int var_r30 = mCamParam.Algorythmn(mCamStyle);
f32 var_f31;
f32 var_f30;
f32 var_f29;
if (chkFlag(0x1000000)) {
var_f31 = 0.0f;
var_f30 = 0.0f;
var_f29 = 0.0f;
} else {
var_f31 = mDoCPd_c::getStickX3D(mPadID);
var_f30 = mDoCPd_c::getStickY(mPadID);
var_f29 = mDoCPd_c::getStickValue(mPadID);
}
mPadInfo.mMainStick.mPosXDelta = var_f31 - mPadInfo.mMainStick.mLastPosX;
mPadInfo.mMainStick.mPosYDelta = var_f30 - mPadInfo.mMainStick.mLastPosY;
mPadInfo.mMainStick.mValueDelta = var_f29 - mPadInfo.mMainStick.mLastValue;
mPadInfo.mMainStick.mLastPosX = var_f31;
mPadInfo.mMainStick.mLastPosY = var_f30;
mPadInfo.mMainStick.mLastValue = var_f29;
mPadInfo.mMainStick.mAngle.Val(mDoCPd_c::getStickAngle3D(mPadID));
if (chkFlag(0x800000)) {
var_f31 = 0.0f;
var_f30 = 0.0f;
var_f29 = 0.0f;
} else {
var_f31 = mDoCPd_c::getSubStickX3D(mPadID);
var_f30 = mDoCPd_c::getSubStickY(mPadID);
var_f29 = mDoCPd_c::getSubStickValue(mPadID);
}
mPadInfo.mCStick.mPosXDelta = var_f31 - mPadInfo.mCStick.mLastPosX;
mPadInfo.mCStick.mPosYDelta = var_f30 - mPadInfo.mCStick.mLastPosY;
mPadInfo.mCStick.mValueDelta = var_f29 - mPadInfo.mCStick.mLastValue;
mPadInfo.mCStick.mLastPosX = var_f31;
mPadInfo.mCStick.mLastPosY = var_f30;
mPadInfo.mCStick.mLastValue = var_f29;
mPadInfo.mCStick.mAngle.Val(mDoCPd_c::getSubStickAngle(mPadID));
f32 analog_l = mDoCPd_c::getAnalogL(mPadID);
mTriggerLeftDelta = mTriggerLeftLast - analog_l;
mTriggerLeftLast = analog_l;
field_0x208 = mDoCPd_c::getHoldLockL(mPadID) != 0;
field_0x209 = mDoCPd_c::getTrigLockL(mPadID) != 0;
if (mTriggerLeftLast > mCamSetup.ManualEndVal()) {
if (field_0x20a == 0) {
field_0x20b = 1;
} else {
field_0x20b = 0;
}
field_0x20a = 1;
} else {
field_0x20b = 0;
field_0x20a = 0;
}
f32 analog_r = mDoCPd_c::getAnalogR(mPadID);
mTriggerRightDelta = mTriggerRightLast - analog_r;
mTriggerRightLast = analog_r;
field_0x214 = mDoCPd_c::getHoldLockR(mPadID) != 0;
field_0x215 = mDoCPd_c::getTrigLockR(mPadID) != 0;
if (mTriggerRightLast > mCamSetup.ManualEndVal()) {
if (field_0x216 == 0) {
field_0x217 = 1;
} else {
field_0x217 = 0;
}
field_0x216 = 1;
} else {
field_0x217 = 0;
field_0x216 = 0;
}
mHoldX = mDoCPd_c::getHoldX(mPadID);
mTrigX = mDoCPd_c::getTrigX(mPadID);
mHoldY = mDoCPd_c::getHoldY(mPadID);
mTrigY = mDoCPd_c::getTrigY(mPadID);
mHoldZ = mDoCPd_c::getHoldZ(mPadID);
mTrigZ = mDoCPd_c::getTrigZ(mPadID);
mHoldB = mDoCPd_c::getHoldB(mPadID);
mTrigB = mDoCPd_c::getTrigB(mPadID);
bool sp6B = true;
bool sp6C = true;
int sp68;
if (mCamTypeData[mCurType].field_0x18[mIsWolf][0] > 0) {
sp68 = mIsWolf;
} else {
sp68 = 0;
}
if (mCamTypeData[mCurType].field_0x18[sp68][4] < 0) {
sp6B = false;
if (field_0x940 == -1) {
field_0x940 = 0;
}
}
if ((var_r30 != 1 && var_r30 != 8 && var_r30 != 7) || mCamParam.Flag(mCamStyle, 0x80)) {
sp6C = false;
if (field_0x940 == 1) {
field_0x940 = 0;
}
}
if (mCurMode == 0 || mCurMode == 4) {
if (check_owner_action(mPadID, 0x12000)) {
field_0x940 = -1;
} else if (field_0x940 == -1) {
field_0x940 = 0;
}
if (mPadInfo.mCStick.mLastPosY < -mCamSetup.mCStick.SwTHH()) {
if (field_0x1f4 != -1) {
if (field_0x940 == -1 && mCurMode == 4) {
field_0x940 = 0;
setComStat(0x2000);
} else if (field_0x940 == 0 && sp6C) {
field_0x940 = 1;
}
}
field_0x1f4 = -1;
} else if (mPadInfo.mCStick.mLastPosY > mCamSetup.mCStick.SwTHH()) {
if (field_0x1f4 != 1) {
if (field_0x940 == 0 && sp6B) {
setComStat(0x1000);
} else if (field_0x940 == 1) {
field_0x940 = 0;
}
}
field_0x1f4 = 1;
} else {
field_0x1f4 = 0;
}
if (field_0x1f4 != 0) {
field_0x1f8++;
} else {
field_0x1f8 = 0;
}
}
field_0x223 = 0;
field_0x224 = 0;
if (mDoCPd_c::getStickValue(mPadID) > 0.001f || mDoCPd_c::getSubStickValue(mPadID) > 0.001f ||
mDoCPd_c::getHold(mPadID) != 0)
{
field_0x224 = 1;
}
}
/* 80161D84-80161E34 15C6C4 00B0+00 1/1 0/0 0/0 .text initMonitor__9dCamera_cFv */
void dCamera_c::initMonitor() {
if (mpPlayerActor != NULL) {
mMonitor.field_0x0 = positionOf(mpPlayerActor);
} else {
mMonitor.field_0x0 = cXyz::Zero;
}
field_0x2c0 = 0.0f;
mMonitor.field_0x10 = 0.0f;
mMonitor.field_0xc = 0.0f;
field_0x2c4 = 0;
field_0x2c8 = 0.0f;
mMonitor.field_0x14 = cXyz::Zero;
}
/* 80161E34-80162088 15C774 0254+00 1/1 0/0 0/0 .text updateMonitor__9dCamera_cFv */
void dCamera_c::updateMonitor() {
if (mpPlayerActor != NULL) {
cXyz sp24 = positionOf(mpPlayerActor);
mMonitor.field_0x14 = sp24 - mMonitor.field_0x0;
if (mBG.field_0xc0.field_0x1) {
dComIfG_Bgsp().MoveBgMatrixCrrPos(mBG.field_0x5c.field_0x4, true, &mMonitor.field_0x0, NULL, NULL);
}
f32 var_f31;
if (chkFlag(0x10000)) {
var_f31 = cXyz(sp24 - mMonitor.field_0x0).abs();
} else {
var_f31 = dCamMath::xyzHorizontalDistance(sp24, mMonitor.field_0x0);
}
field_0x2c0 = var_f31 - mMonitor.field_0xc;
mMonitor.field_0x10 += (var_f31 - mMonitor.field_0x10) * 0.01f;
mMonitor.field_0xc = var_f31;
mMonitor.field_0x0 = sp24;
if (!push_any_key()) {
field_0x2c4++;
} else {
field_0x2c4 = 0;
}
field_0x2c8 = mDirection.R() - field_0x2c8;
}
}
/* 80162088-801622B0 15C9C8 0228+00 1/1 0/0 0/0 .text checkForceLockTarget__9dCamera_cFv
*/
bool dCamera_c::checkForceLockTarget() {
bool ret = true;
if (mLockOnActorID != -1) {
mpLockOnActor = GetForceLockOnActor();
if (mpLockOnActor != NULL) {
if (dComIfGp_getAttention()->Lockon() || mForceLockTimer > mCamSetup.ForceLockOffTimer()
|| cXyz(positionOf(mpLockOnActor) - positionOf(mpPlayerActor)).abs() > mCamSetup.ForceLockOffDist())
{
ret = false;
}
} else {
ret = false;
}
} else {
ret = false;
}
return ret;
}
/* 801622B0-801622B4 15CBF0 0004+00 1/1 0/0 0/0 .text infoReport__9dCamera_cFv */
void dCamera_c::infoReport() {
#if DEBUG
#endif
}
namespace {
inline bool isPlayerFlying(daAlink_c* link) {
bool ret = false;
if (link->checkPlayerFly() && !link->checkBootsOrArmorHeavy()) {
ret = true;
}
return ret;
}
inline bool chkCornerCos(f32 param_0) {
return param_0 >= -0.5f && param_0 <= 0.5f;
}
} // namespace
/* 801622B4-80162D38 15CBF4 0A84+00 1/1 0/0 0/0 .text Run__9dCamera_cFv */
bool dCamera_c::Run() {
daAlink_c* link = daAlink_getAlinkActorClass();
daMidna_c* midna = daPy_py_c::getMidnaActor();
field_0x194 = link->checkMidnaRide() && !midna->checkNoDraw();
bool bVar9 = false;
clrComStat(0x804);
int iVar8 = mIsWolf;
mIsWolf = daPy_py_c::checkNowWolf() ? 1 : 0;
mFocusLine.Off();
clrFlag(0x10168C21);
clrFlag(0x10);
field_0x18c = NULL;
field_0x188 = NULL;
s32 stay_no = dComIfGp_roomControl_getStayNo();
if (stay_no != mRoomNo) {
onRoomChange(stay_no);
}
checkGroundInfo();
setMapToolData();
if (link->checkRollJump() || link->checkGoronRideWait()) {
setFlag(0x10000);
setFlag(0x100000);
} else {
if (mBG.field_0xc0.field_0x44 != 0) {
clrFlag(0x10000);
}
}
if (link->checkGrabThrow() || link->checkIronBallThrowMode()) {
mThrowTimer = mCamSetup.ThrowTimer();
} else {
if (mThrowTimer != 0) {
mThrowTimer--;
}
}
updateMonitor();
Att();
clrComStat(0xf400);
if (!dComIfGp_evmng_cameraPlay() && !chkFlag(0x20000000)) {
updatePad();
mCamSetup.mCStick.Shift(mPadID);
}
if (dComIfGp_getEvent().runCheck()) {
mPadInfo.mMainStick.mLastValue = 0.0f;
mPadInfo.mMainStick.mLastPosY = 0.0f;
mPadInfo.mMainStick.mLastPosX = 0.0f;
mPadInfo.mCStick.mLastValue = 0.0f;
mPadInfo.mCStick.mLastPosY = 0.0f;
mPadInfo.mCStick.mLastPosX = 0.0f;
}
if (!checkForceLockTarget()) {
mLockOnActorID = -1;
} else {
mForceLockTimer++;
}
mNextType = nextType(mCurType);
if (mNextType != mCurType && onTypeChange(mCurType, mNextType)) {
mCurType = mNextType;
}
clrComStat(0x40000);
if (mCurType == specialType[CAM_TYPE_PEEP]) {
setComStat(0x40000);
}
mNextMode = nextMode(mCurMode);
if ((iVar8 != mIsWolf || mNextMode != mCurMode)
&& mCamTypeData[mCurType].field_0x18[mIsWolf][mNextMode] >= 0
&& onModeChange(mCurMode, mNextMode))
{
mCurMode = mNextMode;
mCurCamStyleTimer = 0;
}
if (!ChangeModeOK(mCurMode)) {
mCurMode = 0;
}
int style = mCamTypeData[mCurType].field_0x18[mIsWolf][mCurMode];
if (style >= 0 && mCamStyle != style && onStyleChange(mCamStyle, style)) {
mCamStyle = style;
mCamParam.Change(mCamStyle);
setFlag(0x200);
}
clrFlag(0);
clrComStat(0x80);
if (field_0x940 == -1) {
setComStat(0x80);
}
if (getComStat(0x2000)) {
setComStat(0x80);
}
if (mCamParam.CheckFlag(0x4000) && !check_owner_action(mPadID, 0x4000000)
&& !link->checkMagneBootsOn() && !isPlayerFlying(link))
{
field_0x1b0 += (forwardCheckAngle() - field_0x1b0) * mCamSetup.mBGChk.FwdCushion();
} else {
field_0x1b0 = cSAngle::_0;
}
field_0x88 = 0x4001;
clrFlag(8);
if (chkFlag(0x200000) && mCamParam.Algorythmn(mCamStyle) != 10) {
if (push_any_key() || mMonitor.field_0xc > 10.0f || mBG.field_0xc0.field_0x44 == 0) {
clrFlag(0x200000);
}
} else {
bVar9 = (this->*engine_tbl[mCamParam.Algorythmn(mCamStyle)])(mCamStyle);
field_0x170++;
field_0x160++;
mCurCamStyleTimer++;
}
field_0xa8++;
field_0xac++;
if (!bVar9) {
field_0x680 = 0;
}
defaultTriming();
if (!chkFlag(0x400)) {
field_0x5c.mBank -= field_0x5c.mBank * 0.05f;
}
shakeCamera();
blureCamera();
if (mCamParam.Algorythmn() != 10) {
clrFlag(0x80080);
if (mCamParam.CheckFlag(1)) {
if (mCurMode == 1 && mCamParam.CheckFlag(2)) {
field_0x88 = 0x4007;
} else if (chkFlag(0x20000)) {
field_0x88 = 0x4037;
} else {
field_0x88 = 0x4017;
}
} else if (mCamParam.CheckFlag(2)) {
field_0x88 = 0x4007;
}
if (mCamParam.CheckFlag(8)) {
field_0x88 |= 0x80;
}
if (mCamParam.CheckFlag(0x10)) {
field_0x88 &= ~0x4000;
}
field_0x88 &= ~8;
if (mCamParam.CheckFlag(4)) {
field_0x88 = 0;
}
}
mFovy = field_0x5c.mFovy;
mBank = field_0x5c.mBank;
bumpCheck(field_0x88);
cSAngle angle = mPadInfo.mMainStick.mAngle - mFakeAngleSys.field_0x4;
if (mPadInfo.mMainStick.mLastValue < mCamSetup.USOValue()
|| angle > cSAngle(mCamSetup.USOAngle()) || angle < cSAngle(-mCamSetup.USOAngle()))
{
mFakeAngleSys.field_0x0 = 0;
}
if (mFakeAngleSys.field_0x0 != 0) {
field_0x8c = getUSOAngle(mPadInfo.mMainStick.mAngle);
} else {
field_0x8c = mDirection.U().Inv();
}
if (mCamSetup.CheckFlag(0x8000)) {
infoReport();
}
if (chkFlag(0x10)) {
mUp = field_0x740.field_0x18.norm();
} else if (dComIfGp_getStageWorldRollAngleX() != 0) {
cSPolar polar;
polar.R(1.0f);
polar.V((s16)-dComIfGp_getStageWorldRollAngleX());
polar.U(dComIfGp_getStageWorldRollDirAngleY());
mUp = polar.Xyz();
} else if (mCenter.x == mEye.x && mCenter.z == mEye.z) {
mUp.set(0.01f, 1.0f, 0.0f);
} else {
mUp.set(0.0f, 1.0f, 0.0f);
}
if (!chkFlag(0x10)) {
field_0x740.field_0x18.set(0.0f, 1.0f, 0.0f);
}
if (field_0x94c != cSAngle::_0) {
mBank = field_0x94c;
}
field_0x94c = cSAngle::_0;
f32 water_height = getWaterSurfaceHeight(&mEye);
if (water_height > mEye.y) {
dKy_camera_water_in_status_set(1);
Z2GetAudioMgr()->setCameraInWaterDepth(water_height - mEye.y);
} else {
dKy_camera_water_in_status_set(0);
Z2GetAudioMgr()->setCameraInWaterDepth(0.0f);
}
if (field_0x158.field_0x0) {
setComStat(0x10);
} else {
clrComStat(0x10);
}
f32 hide_dist = mCamSetup.PlayerHideDist();
if (mDirection.R() < hide_dist) {
if (chkFlag(0x800) & 1) {
setComStat(2);
} else if (chkFlag(0x10000000)) {
setComStat(0x20);
}
}
runEventRecoveryTrans();
clrFlag(0x1000);
field_0x860.Clr();
field_0x89c.Clr();
return bVar9;
}
/* 80162D38-80162FB8 15D678 0280+00 1/1 0/0 0/0 .text NotRun__9dCamera_cFv */
bool dCamera_c::NotRun() {
daAlink_c* link = daAlink_getAlinkActorClass();
daMidna_c* midna = daPy_py_c::getMidnaActor();
field_0x194 = link->checkMidnaRide() && !midna->checkNoDraw();
clrComStat(0x804);
clrFlag(0x10168C21);
checkGroundInfo();
clrComStat(0x80);
if (dComIfGp_evmng_cameraPlay() || chkFlag(0x20000000)) {
if (mCurType != specialType[CAM_TYPE_EVENT]) {
pushInfo(&field_0xb0, 1);
mEventData.field_0xc = mCurType;
mCurType = specialType[CAM_TYPE_EVENT];
mCamStyle = mCamParam.SearchStyle('EN01');
field_0x170 = 0;
field_0x160 = 0;
mCurCamStyleTimer = 0;
}
eventCamera(mCamTypeData[mCurType].field_0x18[mIsWolf][3]);
field_0x170++;
field_0x160++;
mCurCamStyleTimer++;
}
setComStat(0x14);
clrFlag(0x80080);
mFocusLine.Off();
shakeCamera();
blureCamera();
field_0x21 = 0;
if (field_0x94c != cSAngle::_0) {
mBank = field_0x94c;
}
field_0x94c = cSAngle::_0;
f32 water_height = getWaterSurfaceHeight(&mEye);
if (water_height > mEye.y) {
dKy_camera_water_in_status_set(1);
Z2GetAudioMgr()->setCameraInWaterDepth(water_height - mEye.y);
} else {
dKy_camera_water_in_status_set(0);
Z2GetAudioMgr()->setCameraInWaterDepth(0.0f);
}
field_0xa8++;
field_0xac++;
field_0x860.Clr();
field_0x89c.Clr();
return true;
}
/* 80162FB8-80162FD4 15D8F8 001C+00 1/1 0/0 0/0 .text V__9dCamera_cFv */
s16 dCamera_c::V() {
if (chkFlag(0x10)) {
return field_0x740.field_0x24.V();
} else {
return mDirection.V();
}
}
/* 80162FD4-8016300C 15D914 0038+00 1/1 0/0 0/0 .text U__9dCamera_cFv */
s16 dCamera_c::U() {
if (chkFlag(0x10)) {
return field_0x740.field_0x24.U();
} else {
return mDirection.U().Inv();
}
}
/* 8016300C-80163028 15D94C 001C+00 1/1 1/1 135/135 .text SetTrimSize__9dCamera_cFl */
bool dCamera_c::SetTrimSize(s32 size) {
bool rt = mTrimSize != size;
mTrimSize = size;
return rt;
}
/* 80163028-80163034 15D968 000C+00 1/1 2/2 4/4 .text SetTrimTypeForce__9dCamera_cFl */
bool dCamera_c::SetTrimTypeForce(s32 param_0) {
mTrimTypeForce = param_0;
return 1;
}
/* 80163034-80163154 15D974 0120+00 1/1 0/0 0/0 .text CalcTrimSize__9dCamera_cFv */
void dCamera_c::CalcTrimSize() {
if (field_0x24 != 2) {
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() - mTrimHeight) * 0.25f;
break;
case 4:
mTrimHeight = 0.0f;
break;
}
} else {
OS_REPORT("%06d: camera: trim: keep\n", field_0xa8);
}
if (field_0x24 == 1) {
field_0x24 = 0;
} else if (field_0x24 == 2) {
if (dComIfGp_getEvent().isOrderOK()) {
field_0x24 = 0;
}
}
field_0x1ac = 11;
}
/* 80163154-8016317C 15DA94 0028+00 1/1 0/0 0/0 .text Draw__9dCamera_cFv */
int dCamera_c::Draw() {
#if DEBUG
debugDraw();
#endif
mFocusLine.Draw();
return 1;
}
/* 8016317C-80163340 15DABC 01C4+00 1/1 0/0 0/0 .text setStageMapToolData__9dCamera_cFv
*/
// NONMATCHING regswap, equivalent
void dCamera_c::setStageMapToolData() {
int var_r28 = 0xFF;
field_0x7e8.Clr();
dStage_stageDt_c* stage_dt = dComIfGp_getStage();
if (stage_dt != NULL) {
stage_camera_class* camera = stage_dt->getCamera();
stage_arrow_class* arrow = stage_dt->getArrow();
stage_stag_info_class* staginfo = stage_dt->getStagInfo();
if (staginfo != NULL) {
var_r28 = dStage_stagInfo_DefaultCameraType(staginfo);
}
if (camera != NULL && var_r28 >= 0 && var_r28 < camera->num) {
field_0x7e8.field_0x30 = var_r28;
field_0x7e8.field_0x0 = camera->m_entries[var_r28];
field_0x7e8.field_0x3a = (field_0x7e8.field_0x0.field_0x14 >> 0xE) & 3;
if (field_0x7e8.field_0x0.field_0x14 & 0x2000) {
field_0x7e8.field_0x0.field_0x14 |= 0xC000;
} else {
field_0x7e8.field_0x0.field_0x14 &= ~0xC000;
}
int var_r27 = field_0x7e8.field_0x0.m_arrow_idx;
if (arrow != NULL && var_r27 >= 0 && var_r27 < arrow->num) {
field_0x7e8.field_0x2c = var_r27;
field_0x7e8.field_0x18 = arrow->m_entries[var_r27];
}
}
}
}
/* 80163340-80163558 15DC80 0218+00 2/2 0/0 0/0 .text setMapToolData__9dCamera_cFv */
void dCamera_c::setMapToolData() {
int room_no = dComIfGp_roomControl_getStayNo();
stage_camera_class* camera = dComIfGp_getRoomCamera(room_no);
stage_arrow_class* arrow = dComIfGp_getRoomArrow(room_no);
int var_r29 = 0xFF;
int var_r26 = 0xFF;
if (mBG.field_0xc0.field_0x40 == 0x1FF && field_0x7ac.field_0x34 == NULL) {
return;
}
if (mBG.field_0xc0.field_0x40 != 0xFF) {
field_0x7ac.Clr();
var_r29 = mBG.field_0xc0.field_0x40;
} else if (field_0x8d8.field_0x30 != 0xFF) {
field_0x7ac.Clr();
var_r29 = field_0x8d8.field_0x30;
} else if (field_0x824.field_0x30 != 0xFF) {
field_0x7ac = field_0x824;
return;
} else if (field_0x7e8.field_0x30 != 0xFF) {
field_0x7ac = field_0x7e8;
return;
} else {
field_0x7ac.Clr();
}
setRoomMapToolData(&field_0x7ac, var_r29, room_no);
}
/* 80163558-801635AC 15DE98 0054+00 0/0 0/0 1/1 .text SetTagData__9dCamera_cFP10fopAc_ac_clUsUc */
void dCamera_c::SetTagData(fopAc_ac_c* param_0, s32 param_1, u16 param_2, u8 param_3) {
s32 room_no;
if (param_0 != NULL) {
room_no = fopAcM_GetRoomNo(param_0);
} else {
room_no = dComIfGp_roomControl_getStayNo();
}
field_0x860.Set(param_1, room_no, param_0, param_2, param_3);
}
/* 801635AC-801635E4 15DEEC 0038+00 2/2 0/0 0/0 .text
* setRoomMapToolData__9dCamera_cFP15dCamMapToolDatall */
void dCamera_c::setRoomMapToolData(dCamMapToolData* i_toolData, s32 param_1, s32 i_roomNo) {
i_toolData->Set(param_1, i_roomNo, NULL, 0xFF, 0xFF);
}
/* 801635E4-80163C38 15DF24 0654+00 1/1 0/0 0/0 .text nextMode__9dCamera_cFl */
s32 dCamera_c::nextMode(s32 i_curMode) {
dAttention_c* attn = dComIfGp_getAttention();
s32 next_mode = i_curMode;
cXyz player_pos = positionOf(mpPlayerActor);
daAlink_c* link = daAlink_getAlinkActorClass();
if (!dComIfGp_evmng_cameraPlay()) {
if (mBG.field_0x0.field_0x58 > player_pos.y) {
field_0x223 = 0;
}
if (!link->checkFastShotTime()) {
field_0x610 = 0;
}
if (field_0x1ac != 11 && mCamTypeData[mCurType].field_0x18[mIsWolf][field_0x1ac] >= 0) {
next_mode = field_0x1ac;
} else if (check_owner_action(mPadID, 0x200000) && !attn->Lockon()) {
if (check_owner_action(mPadID, 0x25040)) {
next_mode = 7;
} else {
next_mode = 0;
}
} else if (link->checkGoatThrow() && dComIfGoat_GetThrow() != NULL) {
dComIfGp_getAttention()->LockSoundOff();
mpLockonTarget = dComIfGoat_GetThrow();
if (fopAcM_GetName(mpLockonTarget) == PROC_E_GOB) {
if (link->checkGoatThrowAfter()) {
next_mode = 2;
} else {
next_mode = 1;
}
} else if (fopAcM_GetName(mpLockonTarget) == PROC_OBJ_GRA) {
next_mode = 1;
} else {
next_mode = 2;
}
} else if (link->checkGoronSideMove() || link->getSumouCameraMode()) {
dComIfGp_getAttention()->LockSoundOff();
next_mode = 1;
} else if (link->checkFastShotTime()) {
field_0x610 = 1;
} else if (check_owner_action1(mPadID, 0x10)) {
next_mode = 9;
} else if ((check_owner_action1(mPadID, 0x400000)
|| check_owner_action1(mPadID, 0x200000)) && mpLockonTarget != NULL) {
next_mode = 6;
} else if (link->checkCutHeadProc()) {
next_mode = 6;
} else if (check_owner_action(mPadID, 6) && mpLockonTarget != NULL) {
next_mode = 5;
} else if (attn->LockonTruth() && mpLockonTarget != NULL
&& !check_owner_action(mPadID, 0xC000000)) {
next_mode = 2;
} else if (check_owner_action(mPadID, 0x12000)) {
next_mode = 4;
} else if (check_owner_action(mPadID, 0x25040) && !attn->Lockon()) {
next_mode = 7;
} else if ((check_owner_action(mPadID, 0x80480) && !attn->Lockon())
|| link->checkHawkWait()) {
next_mode = 8;
} else if (check_owner_action(mPadID, 0x4000000) || link->checkChainBlockPushPull()) {
next_mode = 10;
} else if (attn->Lockon()) {
next_mode = 1;
} else if ((check_owner_action(mPadID, 0x400000) || link->checkIronBallThrowMode()
|| link->checkBoomerangAtnKeep())
&& !check_owner_action(mPadID, 0x36A02311) && field_0x610 == 0
&& !check_owner_action1(mPadID, 0x11)) {
mpLockonTarget = get_boomerang_actor(mpPlayerActor);
next_mode = 2;
mLockOnActorID = -1;
field_0x610 = 1;
} else if ((link->checkCopyRodThrowAfter() || link->checkCopyRodAtnKeep())
&& link->getCopyRodCameraActor() == NULL) {
mpLockonTarget = link->getCopyRodActor();
next_mode = 2;
mLockOnActorID = -1;
field_0x610 = 1;
} else if (link->checkSpinnerRideWait()) {
next_mode = 1;
} else if (mLockOnActorID != -1) {
if (mpLockOnActor != NULL) {
next_mode = 2;
mpLockonTarget = mpLockOnActor;
} else {
next_mode = 0;
mLockOnActorID = -1;
}
} else {
next_mode = 0;
}
}
if (mCamTypeData[mCurType].field_0x18[mIsWolf][next_mode] >= 0) {
if (next_mode != 2) {
mLockOnActorID = -1;
}
if (next_mode == 1) {
setFlag(0x100000);
} else if (next_mode == 10) {
setFlag(0x100000);
}
} else {
next_mode = i_curMode;
}
switch (next_mode) {
case 4:
dComIfGp_getAttention()->LockSoundOff();
break;
}
return next_mode;
}
/* 80163C38-80163D50 15E578 0118+00 2/1 0/0 0/0 .text onModeChange__9dCamera_cFll */
bool dCamera_c::onModeChange(s32 i_curMode, s32 i_nextMode) {
field_0x160 = 0;
field_0x164 = 0;
field_0x168 = 1;
field_0x1b4 = 0.0f;
clrFlag(0x2306);
switch (i_curMode) {
case 3:
clrComStat(4);
break;
case 4:
case 7:
case 8:
if (i_nextMode == 0) {
setFlag(0x40000);
}
break;
}
switch (i_nextMode) {
case 7:
field_0x940 = 0;
break;
case 1:
setFlag(0x100000);
// fallthrough
case 0:
if (mCamTypeData[mCurType].field_0x18[mIsWolf][i_curMode]
== mCamTypeData[mCurType].field_0x18[mIsWolf][i_nextMode])
{
field_0x168 = 0;
}
// fallthrough
case 2:
if (mCamSetup.CheckFlag(0x4000)) {
field_0x940 = 0;
}
break;
case 10:
break;
}
return true;
}
/* 80163D50-80163D5C 15E690 000C+00 0/0 0/0 4/4 .text ModeFix__9dCamera_cFl */
int dCamera_c::ModeFix(s32 param_0) {
field_0x1ac = param_0;
return 1;
}
/* 80163D5C-8016444C 15E69C 06F0+00 1/1 0/0 0/0 .text nextType__9dCamera_cFl */
// NONMATCHING missing clrlwi in daMidna_c::checkFlyWaitAnime
s32 dCamera_c::nextType(s32 i_curType) {
s32 next_type = i_curType;
if (field_0x680 != 1) {
s32 iVar14 = 0xff;
if (field_0x860.field_0x30 != 0xff) {
s32 type = GetCameraTypeFromToolData(&field_0x860.field_0x0);
if (type != 0xff) {
iVar14 = type;
}
}
daAlink_c* link = daAlink_getAlinkActorClass();
bool bVar2 = false;
bool bVar1 = false;
if (link->checkMagneBootsOn()) {
cXyz* top_vec = link->getMagneBootsTopVec();
if (cBgW_CheckBRoof(top_vec->y)) {
bVar2 = true;
} else if (cBgW_CheckBWall(top_vec->y)) {
bVar1 = true;
}
}
bool copy_rod = false;
if (link->getCopyRodCameraActor() != NULL) {
copy_rod = true;
}
if (check_owner_action(mPadID, 0x200000) && ChangeModeOK(4)
&& !dComIfGp_getAttention()->Lockon()) {
next_type = specialType[CAM_TYPE_SCOPE];
} else if (iVar14 != 0xff && !(field_0x860.field_0x3a & 0x10)) {
next_type = iVar14;
field_0x7ac = field_0x860;
} else if (link->checkMidnaLockJumpPoint() &&
(daPy_py_c::getMidnaActor()->checkFlyWaitAnime()
|| daPy_py_c::getMidnaActor()->checkNoInput())) {
next_type = specialType[CAM_TYPE_MIDNA_TAG];
} else if (daPy_py_c::getMidnaActor()->checkPortalObjCall()) {
next_type = specialType[CAM_TYPE_WARP_OBJ];
} else if (link->checkGoatStopGame()) {
next_type = specialType[CAM_TYPE_GOAT_BATTLE];
} else if (chkFlag(0x10000)) {
next_type = specialType[CAM_TYPE_GORON_JUMP];
} else if (link->checkHorseRide()) {
next_type = specialType[CAM_TYPE_HORSE_T];
} else if (bVar1) {
next_type = specialType[CAM_TYPE_MAGNE_WALL];
} else if (bVar2) {
next_type = specialType[CAM_TYPE_MAGNE_ROOF];
} else if (copy_rod) {
next_type = specialType[CAM_TYPE_COPY_ROD_HALL];
} else if (link->checkBoarRide()) {
next_type = specialType[CAM_TYPE_BOAR];
} else if (link->checkCanoeRide()) {
next_type = specialType[CAM_TYPE_CANOE];
} else if (link->checkBoardRide()) {
next_type = specialType[CAM_TYPE_BOARD];
} else if (link->checkSpinnerRide()) {
next_type = specialType[CAM_TYPE_SPINNER];
} else if (check_owner_action1(mPadID, 0x2000000)) {
next_type = specialType[CAM_TYPE_HOOK_WALL];
} else if (check_owner_action1(mPadID, 0x10000)) {
if (link->getHookshotRoofWaitActor() != NULL) {
next_type = specialType[CAM_TYPE_HOOK_ACTOR];
} else {
next_type = specialType[CAM_TYPE_HOOK_ROOF];
}
} else if (check_owner_action1(mPadID, 0x100000)) {
next_type = specialType[CAM_TYPE_ROOF_HUNG];
} else if (link->checkCokkoGlide()) {
next_type = specialType[CAM_TYPE_COCCO_JUMP];
} else if (check_owner_action(mPadID, 0x100000)) {
if (getComStat(0x800)) {
next_type = specialType[CAM_TYPE_WATER_SURF];
} else if (mBG.field_0xc0.field_0x3c != 0xff) {
setRoomMapToolData(&field_0x7ac, mBG.field_0xc0.field_0x3c,
dComIfGp_roomControl_getStayNo());
s32 type = GetCameraTypeFromToolData(&field_0x7ac.field_0x0);
if (type != 0xff) {
next_type = type;
} else {
next_type = specialType[CAM_TYPE_WATER];
}
} else {
next_type = specialType[CAM_TYPE_WATER];
}
} else if (iVar14 != 0xff) {
next_type = iVar14;
field_0x7ac = field_0x860;
} else if (field_0x7ac.field_0x30 != 0xff) {
s32 type = GetCameraTypeFromToolData(&field_0x7ac.field_0x0);
if (type != 0xff) {
next_type = type;
}
} else if (field_0x7ac.field_0x30 != 0x1ff) {
next_type = mMapToolType;
}
}
field_0x698 = 0xff;
field_0x69c = 0;
if (mCamTypeData[mCurType].field_0x18[mIsWolf][0] < 0) {
next_type = mMapToolType;
if (field_0x7ac.field_0x30 != 0xff) {
s32 type = GetCameraTypeFromToolData(&field_0x7ac.field_0x0);
if (type != 0xff) {
next_type = type;
}
}
}
if (!ChangeModeOK(2)) {
dComIfGp_getAttention()->LockSoundOff();
}
if (dComIfGp_evmng_cameraPlay() || chkFlag(0x20000000)) {
if (i_curType != specialType[CAM_TYPE_EVENT]) {
mEventData.field_0xc = next_type;
}
next_type = specialType[CAM_TYPE_EVENT];
dComIfGp_getAttention()->LockSoundOff();
} else {
clrFlag(0x40000000);
if (dComIfGp_getEvent().runCheck()) {
setComStat(4);
dComIfGp_getAttention()->LockSoundOff();
}
}
return next_type;
}
/* 8016444C-8016469C 15ED8C 0250+00 1/1 0/0 0/0 .text onTypeChange__9dCamera_cFll */
bool dCamera_c::onTypeChange(s32 i_curType, s32 i_nextType) {
if (i_curType == specialType[CAM_TYPE_EVENT]) {
if (mCamSetup.CheckFlag(0x4000)) {
field_0x940 = 0;
}
if (field_0x110.field_0x4 != 0) {
cXyz vec = field_0x110.field_0x28 - positionOf(mpPlayerActor);
setEventRecoveryTrans(field_0x110.field_0x4);
popInfo(&field_0xb0);
field_0x5c.mCenter -= vec;
field_0x5c.mEye -= vec;
}
field_0x110.field_0x4 = 0;
field_0x668 = 0;
clearInfo(&field_0xb0, 0);
clearInfo(&field_0xd0[0], 0);
clearInfo(&field_0xd0[1], 0);
if (chkFlag(0x400000)) {
mCamStyle = mCamTypeData[mEventData.field_0xc].field_0x18[mIsWolf][0];
mCamParam.Change(mCamStyle);
setFlag(0x200);
clrFlag(0x400000);
}
mEventData.field_0x14 = -1;
mEventData.field_0x18 = -1;
mEventData.field_0x4 = -1;
mEventData.field_0xc = -1;
mEventData.field_0x0 = 1;
setFlag(0x20);
if (chkFlag(0x40000000)) {
cM3dGLin line(field_0x5c.mCenter, field_0x5c.mEye);
cXyz attn_pos = attentionPos(mpPlayerActor);
cXyz proj;
f32 dist;
if (cM3d_Len3dSqPntAndSegLine(&line, &attn_pos, &proj, &dist)) {
field_0x5c.mCenter = proj;
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
}
clrFlag(0x40000000);
}
} else if (i_nextType == specialType[CAM_TYPE_EVENT]) {
clrFlag(0x200000);
pushInfo(&field_0xb0, 1);
field_0x1b4 = 0.0f;
field_0x668 = 0;
}
field_0x170 = 0;
field_0x16c = 0;
return true;
}
/* 8016469C-801647B0 15EFDC 0114+00 2/1 0/0 0/0 .text onStyleChange__9dCamera_cFll */
bool dCamera_c::onStyleChange(s32 param_0, s32 param_1) {
mCurCamStyleTimer = 0;
field_0x158.field_0x0 = 0;
bool var_r30 = false;
switch (mCamParam.Algorythmn(param_0)) {
case 5:
case 6:
if (mFakeAngleSys.field_0x0 == 0) {
setUSOAngle();
}
var_r30 = true;
break;
case 4:
clrComStat(8);
setComZoomScale(1.0f);
break;
}
switch (mCamParam.Algorythmn(param_1)) {
case 0:
case 3:
default:
break;
case 8:
if (mCamParam.Algorythmn(param_0) == mCamParam.Algorythmn(param_1) && mCurMode == 0) {
setFlag(0x8000);
}
break;
case 1:
mCamParam.Algorythmn(param_1);
mCamParam.Algorythmn(param_0);
break;
case 5:
case 6:
if (mFakeAngleSys.field_0x0 == 0 || var_r30) {
setUSOAngle();
}
break;
}
return true;
}
/* 801647B0-80164878 15F0F0 00C8+00 1/1 0/0 0/0 .text onRoomChange__9dCamera_cFl */
int dCamera_c::onRoomChange(s32 i_roomNo) {
mRoomNo = i_roomNo;
setFlag(0x1000);
int var_r29 = 0xFF;
dStage_roomDt_c* room_dt = dComIfGp_roomControl_getStatusRoomDt(i_roomNo);
if (room_dt != NULL) {
dStage_FileList_dt_c* filelist = room_dt->getFileListInfo();
if (filelist != NULL) {
var_r29 = dStage_FileList_dt_GetDefaultCamera(filelist);
}
}
if (var_r29 != 0xFF) {
setRoomMapToolData(&field_0x824, var_r29, i_roomNo);
} else {
field_0x824.Clr();
}
return 1;
}
/* 80164878-80164944 15F1B8 00CC+00 4/4 0/0 0/0 .text getParamTargetActor__9dCamera_cFl
*/
fopAc_ac_c* dCamera_c::getParamTargetActor(s32 param_0) {
daAlink_c* player = daAlink_getAlinkActorClass();
switch (*(u32*)&mCamTypeData[param_0].name[16]) {
case '@LOC':
return dComIfGp_getAttention()->LockonTarget(0);
case '@ACT':
return dComIfGp_getAttention()->ActionTarget(0);
case '@CHK':
return dComIfGp_getAttention()->CheckObjectTarget(0);
case '@CPY':
return player->getCopyRodCameraActor();
}
return fopAcM_searchFromName4Event(&mCamTypeData[param_0].name[16], -1);
}
/* 80164944-80164B64 15F284 0220+00 0/0 1/1 0/0 .text GetCameraTypeFromMapToolID__9dCamera_cFll */
int dCamera_c::GetCameraTypeFromMapToolID(s32 param_0, s32 i_roomNo) {
dStage_stageDt_c& stage_dt = g_dComIfG_gameInfo.play.getStage();
int i;
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) {
if (!(field_0xa8 & 0xFFF)) {
OS_REPORT("camera: no room camera list. camera ID ignored\n");
}
return 0xFF;
}
}
if (param_0 < 0 || camera == NULL || (camera != NULL && param_0 >= camera->num)) {
int sp28;
if (camera != NULL) {
sp28 = camera->num;
} else {
sp28 = -99;
}
OS_REPORT("camera: bad number %d for map data ID [%x:%d] room %d\n", param_0, camera, sp28,
i_roomNo);
return 0xFF;
}
i = 0;
while (i < mCamTypeNum) {
if (strcmp(camera->m_entries[param_0].m_cam_type, mCamTypeData[i].name) ==
0)
{
break;
}
i++;
}
if (i == mCamTypeNum) {
OS_REPORT("camera: type \'%s\' not found\n", camera->m_entries[param_0].m_cam_type);
return 0xFF;
}
field_0x7ac.field_0x0 = camera->m_entries[param_0];
field_0x7ac.field_0x30 = param_0;
field_0x7ac.field_0x3a = (field_0x7ac.field_0x0.field_0x14 >> 0xE) & 3;
if (field_0x7ac.field_0x0.field_0x14 & 0x2000) {
field_0x7ac.field_0x0.field_0x14 |= 0xC000;
} else {
field_0x7ac.field_0x0.field_0x14 &= ~0xC000;
}
field_0x7ac.field_0x2c = field_0x7ac.field_0x0.m_arrow_idx;
if (field_0x7ac.field_0x2c != -1 && field_0x7ac.field_0x2c < arrow->num) {
field_0x7ac.field_0x18 = arrow->m_entries[field_0x7ac.field_0x2c];
} else {
field_0x7ac.field_0x2c = 0xFF;
}
return i;
}
/* 80164B64-80164C10 15F4A4 00AC+00 2/2 1/1 0/0 .text GetCameraTypeFromCameraName__9dCamera_cFPCc
*/
int dCamera_c::GetCameraTypeFromCameraName(char const* i_name) {
if (strcmp(i_name, mCamTypeData[mCurType].name) == 0) {
return mCurType;
}
int i = 0;
while (i < mCamTypeNum) {
if (strcmp(i_name, mCamTypeData[i].name) == 0) {
break;
}
i++;
}
if (i == mCamTypeNum) {
OS_REPORT("camera: type \'%s\' not found\n", i_name);
return 0xFF;
}
return i;
}
/* 80164C10-80164C64 15F550 0054+00 2/2 0/0 0/0 .text
* GetCameraTypeFromToolData__9dCamera_cFP24stage_camera2_data_class */
int dCamera_c::GetCameraTypeFromToolData(stage_camera2_data_class* i_data) {
if (i_data->field_0x16 != 0xFFFF) {
return i_data->field_0x16;
}
int type = GetCameraTypeFromCameraName(i_data->m_cam_type);
if (type < 0xFFFF) {
i_data->field_0x16 = type;
}
return type;
}
/* 80164C64-80164CAC 15F5A4 0048+00 4/4 2/2 0/0 .text
* pushInfo__9dCamera_cFPQ29dCamera_c10dCamInfo_cs */
void dCamera_c::pushInfo(dCamera_c::dCamInfo_c* i_info, s16 param_1) {
i_info->mCenter = mCenter;
i_info->mEye = mEye;
i_info->mFovy = mFovy;
i_info->mBank = mBank;
i_info->field_0x1e = param_1;
}
/* 80164CAC-80164D2C 15F5EC 0080+00 2/2 0/0 0/0 .text
* popInfo__9dCamera_cFPQ29dCamera_c10dCamInfo_c */
void dCamera_c::popInfo(dCamera_c::dCamInfo_c* i_info) {
mCenter = field_0x5c.mCenter = i_info->mCenter;
mEye = field_0x5c.mEye = i_info->mEye;
mFovy = field_0x5c.mFovy = i_info->mFovy;
field_0x5c.mBank = i_info->mBank;
mBank = field_0x5c.mBank;
}
/* 80164D2C-80164D6C 15F66C 0040+00 4/4 0/0 0/0 .text heightOf__9dCamera_cFP10fopAc_ac_c
*/
f32 dCamera_c::heightOf(fopAc_ac_c* i_actor) {
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;
}
}
/* 80164D6C-80164E20 15F6AC 00B4+00 9/9 15/15 0/0 .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;
}
cXyz offset = dCamMath::xyzRotateY(*i_offset, cSAngle(i_actor->shape_angle.y));
return attentionPos(i_actor) + offset;
}
/* 80164E20-80165104 15F760 02E4+00 0/0 1/1 0/0 .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 delta = pos2 - pos1;
cSGlobe delta_globe(delta);
delta.normalize();
pos1 -= delta * i_actor1->attention_info.field_0xa;
pos2 += delta * i_actor2->attention_info.field_0xa;
cXyz mid = pos1 + (pos2 - pos1) * 0.5f;
cXyz offset = *i_offset;
cSAngle angle = field_0x5c.mDirection.U() - delta_globe.U();
if (angle < cSAngle::_0) {
offset.x = -offset.x;
}
cSGlobe offset_globe(offset);
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;
}
/* 80165104-80165158 15FA44 0054+00 7/7 0/0 0/0 .text setUSOAngle__9dCamera_cFv */
void dCamera_c::setUSOAngle() {
mFakeAngleSys.field_0x0 = 1;
mFakeAngleSys.field_0x2 = mDirection.U().Inv();
mFakeAngleSys.field_0x4 = mPadInfo.mMainStick.mAngle;
}
/* 80165158-8016517C 15FA98 0024+00 1/1 0/0 0/0 .text getUSOAngle__9dCamera_cF7cSAngle */
cSAngle dCamera_c::getUSOAngle(cSAngle param_0) {
return mFakeAngleSys.field_0x2;
}
/* 8016517C-80165238 15FABC 00BC+00 1/1 2/2 0/0 .text pointInSight__9dCamera_cFP4cXyz */
bool dCamera_c::pointInSight(cXyz* i_point) {
cXyz proj;
dDlst_window_c* window = get_window(field_0x0);
scissor_class* scissor = window->getScissor();
f32 scissor_width = scissor->width;
f32 scissor_height = scissor->height;
mDoLib_project(i_point, &proj);
return (proj.x > 0.0f && proj.x < scissor_width) && (proj.y > 0.0f && proj.y < scissor_height);
}
/* 80165238-801657EC 15FB78 05B4+00 3/3 0/0 0/0 .text
* radiusActorInSight__9dCamera_cFP10fopAc_ac_cP10fopAc_ac_cP4cXyzP4cXyzfsf */
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 param_6) {
dDlst_window_c* window = get_window(field_0x0);
scissor_class* scissor = window->getScissor();
f32 dVar3 = cAngle::d2r(i_fovY) * 0.5f;
f32 tmp = (scissor->height - mTrimHeight * 2.0f) / 448.0f * dVar3;
f32 fVar8 = tmp * (mTrimHeight < 0.01f ? 0.95f : 1.0f);
dVar3 *= field_0x92c;
f32 fVar7 = dVar3 * (scissor->width / 608.0f) * 0.85f;
cXyz pos1 = attentionPos(i_actor1);
pos1.y += (positionOf(i_actor1).y - attentionPos(i_actor1).y) * 0.5f;
cXyz pos2 = attentionPos(i_actor2);
pos2.y += (positionOf(i_actor2).y - attentionPos(i_actor2).y) * 0.5f;
cXyz delta = pos1 - pos2;
f32 dist = delta.abs();
f32 local_128 = 1.0f - (dist - 0.1f - 200.0f);
if (local_128 < 0.2f) {
local_128 = 0.2f;
}
if (local_128 > 1.0f) {
local_128 = 1.0f;
}
dist *= param_6 * local_128;
delta.normalize();
pos1 += delta * (i_actor1->attention_info.field_0xa + dist);
pos2 -= delta * (i_actor2->attention_info.field_0xa + dist);
Mtx look_mtx;
mDoMtx_lookAt(look_mtx, i_eye, i_center, &mUp, i_bank);
MTXMultVec(look_mtx, &pos1, &pos1);
MTXMultVec(look_mtx, &pos2, &pos2);
int bVar2 = 0;
f32 fVar5 = fabsf(cM_atan2f(pos1.x, -pos1.z));
f32 fVar6 = fabsf(cM_atan2f(pos1.y, -pos1.z));
if (fVar5 > fVar7) {
bVar2 |= 1;
}
if (fVar6 > fVar8) {
bVar2 |= 2;
}
fVar5 = fabsf(cM_atan2f(pos2.x, -pos2.z));
fVar6 = fabsf(cM_atan2f(pos2.y, -pos2.z));
if (fVar5 > fVar7) {
bVar2 |= 4;
}
if (fVar6 > fVar8) {
bVar2 |= 8;
}
if (bVar2 == 0) {
return 0.0f;
}
f32 ret = 0.0f;
f32 local_12c = 1.0f;
f32 local_130 = 1.0f;
if (bVar2 & 5) {
local_12c = i_tanf(fVar7);
}
if (bVar2 & 0xA) {
local_130 = i_tanf(fVar8);
}
if (bVar2 & 1) {
f32 dVar4 = pos1.z + fabsf(pos1.x) / local_12c;
if (dVar4 > ret) {
ret = dVar4;
}
}
if (bVar2 & 2) {
f32 dVar4 = pos1.z + fabsf(pos1.y) / local_130;
if (dVar4 > ret) {
ret = dVar4;
}
}
if (bVar2 & 4) {
f32 dVar4 = pos2.z + fabsf(pos2.x) / local_12c;
if (dVar4 > ret) {
ret = dVar4;
}
}
if (bVar2 & 8) {
f32 dVar4 = pos2.z + fabsf(pos2.y) / local_130;
if (dVar4 > ret) {
ret = dVar4;
}
}
return ret;
}
/* 801657EC-801658C0 16012C 00D4+00 3/3 0/0 0/0 .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);
f32 height;
if (gnd_y >= wtr_y) {
height = gnd_y;
} else {
height = wtr_y;
}
f32 height_correct;
if (height == -1000000000.0f) {
height_correct = param_0->y;
} else {
height_correct = height;
}
return height_correct;
}
/* 801658C0-801659F4 160200 0134+00 12/12 0/0 0/0 .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 & 0x8000) {
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;
}
}
/* 801659F4-80165AF0 160334 00FC+00 4/4 4/4 0/0 .text lineBGCheck__9dCamera_cFP4cXyzP4cXyzP4cXyzUl
*/
bool dCamera_c::lineBGCheck(cXyz* i_start, cXyz* i_end, cXyz* o_cross, u32 i_flags) {
dBgS_CamLinChk lin_chk;
if (lineBGCheck(i_start, i_end, &lin_chk, i_flags)) {
cM3dGPla plane;
dComIfG_Bgsp().GetTriPla(lin_chk, &plane);
*o_cross = lin_chk.GetCross() + *plane.GetNP();
return true;
} else {
*o_cross = *i_end;
return false;
}
}
/* 80165AF0-80165B60 160430 0070+00 3/3 13/13 0/0 .text lineBGCheck__9dCamera_cFP4cXyzP4cXyzUl */
bool dCamera_c::lineBGCheck(cXyz* i_start, cXyz* i_end, u32 i_flags) {
dBgS_CamLinChk lin_chk;
return lineBGCheck(i_start, i_end, &lin_chk, i_flags);
}
/* 80165B60-80165C08 1604A0 00A8+00 1/1 0/0 0/0 .text
* lineCollisionCheckBush__9dCamera_cFP4cXyzP4cXyz */
// NONMATCHING loads g_dComIfG_gameInfo.play.mCcS.mMass_Mng twice
u32 dCamera_c::lineCollisionCheckBush(cXyz* i_start, cXyz* i_end) {
u32 ret = 0;
u32 result = dComIfG_Ccsp()->GetMassResultCam();
if (result & 2) {
ret |= 2;
}
if (result & 4) {
ret |= 8;
}
if (result & 8) {
ret |= 4;
}
cM3dGCps cps;
cps.Set(*i_start, *i_end, 30.0f);
dComIfG_Ccsp()->SetMassCam(cps);
return ret;
}
/* 80165C08-80165CE0 160548 00D8+00 1/1 0/0 0/0 .text
* sph_chk_callback__FP11dBgS_SphChkP10cBgD_Vtx_tiiiP8cM3dGPlaPv */
static 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) {
camSphChkdata* sph_chk_data = (camSphChkdata*)i_data;
if (!sph_chk_data->field_0x1c) {
f32 len = cM3d_SignedLenPlaAndPos(i_plane, &sph_chk_data->field_0xc);
if (i_plane->getPlaneFunc(sph_chk_data->field_0x8) >= -0.0001f
&& len < sph_chk_data->field_0x4) {
cXyz normal = *i_plane->GetNP();
sph_chk_data->field_0xc += normal * (sph_chk_data->field_0x4 + 0.1f - len);
sph_chk_data->field_0x1c = true;
}
}
//! @bug Function does not return a value
}
/* 80165CE0-80165E74 160620 0194+00 1/1 0/0 0/0 .text compWallMargin__9dCamera_cFP4cXyzP4cXyzf */
cXyz dCamera_c::compWallMargin(cXyz* i_center, cXyz* param_1, f32 i_radius) {
dBgS_CamSphChk sph_chk;
camSphChkdata sph_chk_data(i_center, param_1, i_radius);
sph_chk.SetCallback(&sph_chk_callback);
sph_chk.Set(*i_center, i_radius);
sph_chk_data.field_0x18 = i_radius;
for (int i = 0; i < 5; i++) {
cXyz vec = sph_chk_data.field_0xc;
sph_chk_data.Base(&vec);
sph_chk.Set(vec, i_radius);
sph_chk_data.field_0x1c = false;
if (!dComIfG_Bgsp().SphChk(&sph_chk, &sph_chk_data)) break;
}
return sph_chk_data.field_0xc;
}
/* 80165EF4-80165FB4 160834 00C0+00 1/1 0/0 0/0 .text defaultTriming__9dCamera_cFv */
int dCamera_c::defaultTriming() {
if (mTrimTypeForce >= 0) {
SetTrimSize(mTrimTypeForce);
mTrimTypeForce = -1;
} else {
switch (mCurMode) {
case 3:
SetTrimSize(2);
break;
case 1:
case 2:
case 5:
case 6:
SetTrimSize(1);
break;
case 4:
SetTrimSize(0);
break;
case 7:
case 8:
SetTrimSize(1);
break;
default:
SetTrimSize(0);
break;
}
}
return mTrimSize;
}
/* 80165FB4-8016608C 1608F4 00D8+00 1/1 0/0 0/0 .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(field_0x0);
view_port_class* view_port = window->getViewPort();
window->setViewPort(i_xOrig, i_yOrig, i_width, i_height, view_port->near_z, view_port->far_z);
window->setScissor(i_xOrig, i_yOrig, i_width, i_height);
}
/* 8016608C-80166764 1609CC 06D8+00 1/1 0/0 0/0 .text forwardCheckAngle__9dCamera_cFv */
cSAngle dCamera_c::forwardCheckAngle() {
dBgS_CamLinChk lin_chk;
cSAngle ret = cSAngle::_0;
cSAngle local_1b8;
cSAngle local_1bc;
cXyz player_pos = positionOf(mpPlayerActor);
f32 player_height = heightOf(mpPlayerActor);
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, 0x40b7)) {
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, 0x40b7)) {
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) {
ret = local_1b8 >= local_1bc ? -local_1b8 : -local_1bc;
} else if (local_1b8 <= cSAngle::_0 && local_1bc <= cSAngle::_0) {
ret = local_1b8 <= local_1bc ? -local_1b8 : -local_1bc;
} else {
ret = -local_1b8;
}
if (ret <= cSAngle::_0) {
ret *= 0.75f;
}
return ret;
}
/* 80166764-80167BBC 1610A4 1458+00 1/1 0/0 0/0 .text bumpCheck__9dCamera_cFUl */
bool dCamera_c::bumpCheck(u32 i_flags) {
int uVar14 = 0;
static int prev_plat1 = 0;
static int prev_plat2 = 0;
int uVar13 = 0;
f32 gaze_back_margin = mCamSetup.mBGChk.GazeBackMargin() + 0.5f;
f32 wall_cushion = mCamSetup.mBGChk.WallCushion();
f32 wall_back_cushion = mCamSetup.mBGChk.WallBackCushion();
f32 corner_cushion = mCamSetup.mBGChk.CornerCushion();
f32 corner_angle_max_cos = cDegree(mCamSetup.mBGChk.CornerAngleMax()).Cos();
f32 wall_up_distance = mCamSetup.mBGChk.WallUpDistance();
cXyz center = field_0x5c.mCenter;
cXyz eye = field_0x5c.mEye;
cSGlobe direction = field_0x5c.mDirection;
if (mCamSetup.CheckFlag2(0x100) && dKy_TeachWind_existence_chk()) {
f32 wind_pow = dKyw_get_wind_pow();
if (wind_pow > 0.3f) {
cSGlobe wind_globe(*dKyw_get_wind_vec());
wind_globe.R(field_0x5c.mDirection.R() * cM_rndFX(mCamSetup.WindShakeGap4Ctr() * 0.0001f));
center += wind_globe.Xyz();
if (wind_pow > 1.0f) {
wind_pow = 1.0f;
}
wind_pow -= 0.3f;
cSAngle angle = wind_globe.U() - field_0x5c.mDirection.U();
mFovy += mCamSetup.WindShakeGap4Fvy() * cM_rndFX(wind_pow / 0.7f) * (1.0f - fabsf(angle.Norm()));
}
}
if (is_player(mpPlayerActor)) {
u32 grab_actor_id = static_cast<daPy_py_c*>(mpPlayerActor)->getGrabActorID();
if (grab_actor_id != -1) {
fopAc_ac_c* grab_actor = fopAcM_SearchByID(grab_actor_id);
if (grab_actor != NULL && !fopAcM_CheckCarryType(grab_actor,
(fopAcM_CARRY)(fopAcM_CARRY_ITEM | fopAcM_CARRY_TYPE_8))) {
if (fopAcM_CheckCarryType(grab_actor, fopAcM_CARRY_SIDE)) {
wall_up_distance += 40.0f;
} else {
wall_up_distance += 100.0f;
}
}
}
}
f32 fVar1 = field_0x5c.mDirection.R() * field_0x5c.mDirection.V().Sin();
if (i_flags & 0x10) {
if (fVar1 > wall_up_distance) {
wall_up_distance = fVar1;
}
} else {
clrFlag(0x4000);
}
if (chkFlag(0x2002)) {
if (field_0x188 != NULL && field_0x18c != NULL) {
f32 sight_radius = radiusActorInSight(mpPlayerActor, field_0x188, field_0x18c);
if (sight_radius > 0.0f) {
f32 fVar17, fVar18;
if (chkFlag(2)) {
fVar17 = 0.33f;
} else {
fVar17 = 0.08f;
}
field_0x1b4 += fVar17 * (sight_radius - field_0x1b4);
uVar13 |= 0x40;
fVar18 = 1.0f;
if (field_0x160 < 10) {
fVar18 = (f32)field_0x160 / 10.0f;
}
direction.R(field_0x1b4 * fVar18 + direction.R());
eye = center + direction.Xyz();
}
} else if (field_0x188 != NULL) {
f32 sight_radius = radiusActorInSight(mpPlayerActor, field_0x188, &field_0x5c.mCenter,
&field_0x5c.mEye, mFovy, mBank, 0.05f);
if (sight_radius > 0.0f) {
f32 fVar17, fVar18;
if (chkFlag(2)) {
fVar17 = 0.33f;
} else {
fVar17 = 0.08f;
}
field_0x1b4 += fVar17 * (sight_radius - field_0x1b4);
uVar13 |= 0x40;
fVar18 = 1.0f;
if (field_0x160 < 10) {
fVar18 = (f32)field_0x160 / 10.0f;
}
direction.R(field_0x1b4 * fVar18 + direction.R());
eye = center + direction.Xyz();
}
}
}
if (field_0x1b4 > 0.1f && !(uVar13 & 0x40)) {
field_0x1b4 -= field_0x1b4 * 0.08f;
direction.R(field_0x1b4 + direction.R());
eye = center + direction.Xyz();
}
if ((i_flags & 0x80) && mBG.field_0x108.field_0x0 != 0) {
direction.V(mBG.field_0x108.field_0x4 + direction.V().Degree());
eye = center + direction.Xyz();
uVar13 |= 0x20;
}
dBgS_CamLinChk lin_chk1;
dBgS_CamLinChk lin_chk2;
cXyz norm_dir_vec = cXyz(eye - center).norm();
cXyz vec = eye + norm_dir_vec * gaze_back_margin;
cXyz pos, mid;
bool bVar8 = false;
if (i_flags & 0xb7) {
if (lineBGCheck(&center, &vec, &lin_chk1, i_flags)) {
cSGlobe unused1, unused2;
cM3dGPla plane1;
dComIfG_Bgsp().GetTriPla(lin_chk1, &plane1);
cM3dGPla plane2;
cXyz* normal1 = plane1.GetNP();
if ((i_flags & 1) && normal1->y >= 0.75f) {
uVar14 = 4;
} else if ((i_flags & 4) && normal1->y < -0.5f) {
uVar14 = 3;
} else if (i_flags & 2) {
if (!(i_flags & 0x10)) {
uVar14 = 1;
} else if (!(i_flags & 0x20)) {
uVar14 = 2;
} else {
if (lineBGCheck(&vec, &center, &lin_chk2, i_flags)) {
cXyz(lin_chk1.GetCross() - lin_chk2.GetCross()).abs();
dComIfG_Bgsp().GetTriPla(lin_chk2, &plane2);
cXyz* normal2 = plane2.GetNP();
cXyz cross;
f32 dot = VECDotProduct(normal1, normal2);
VECCrossProduct(normal1, normal2, &cross);
if (chkCornerCos(dot) && fabsf(cross.y) > 0.5f
&& cBgW_CheckBWall(normal2->y)) {
uVar14 = 5;
} else if (field_0x958 != 5 && field_0x958 != 6) {
uVar14 = 7;
} else {
uVar14 = 8;
}
} else if (field_0x958 == 5 || field_0x958 == 8) {
uVar14 = 8;
} else {
uVar14 = 2;
}
}
}
switch (uVar14) {
case 5:
case 6: {
uVar13 |= 2;
cXyz cross1 = lin_chk1.GetCross();
cXyz cross2 = lin_chk2.GetCross();
mid = (cross1 + cross2) * 0.5f;
if (cM3d_2PlaneLinePosNearPos(plane1, plane2, &mid, &pos)) {
field_0x9c = *plane1.GetNP() + *plane2.GetNP();
field_0x90 = pos;
cXyz vec3 = pos + field_0x9c * 2.0f;
cross1 += *plane1.GetNP();
cross2 += *plane2.GetNP();
dBgS_CamLinChk lin_chk3;
if (!lineBGCheckBoth(&cross1, &vec3, &lin_chk3, i_flags)
&& !lineBGCheckBoth(&cross2, &vec3, &lin_chk3, i_flags))
{
vec = eye;
if (chkFlag(0x4000)) {
if (field_0x938 == 0) {
f32 dist = cXyz(mEye - field_0x5c.mEye).abs();
if (dist > 60.0f) {
field_0x938 = 40;
} else if (dist < 6.0f) {
field_0x938 = 4;
} else {
field_0x938 = dist / 1.5f;
}
}
f32 tmp = 1.0f / field_0x938;
direction.V(mDirection.V() + (direction.V() - mDirection.V()) * tmp);
vec = center + direction.Xyz();
if (--field_0x938 == 0) {
clrFlag(0x4000);
}
}
if (lineBGCheck(&cross2, &eye, &lin_chk1, i_flags)) {
vec = lin_chk1.GetCross();
}
eye = compWallMargin(&vec, &center, gaze_back_margin);
bVar8 = true;
setFlag(0x80000);
break;
}
}
// fallthrough
}
case 2:
case 7:
case 8: {
uVar13 |= 1;
vec = field_0x90 = lin_chk1.GetCross();
if (i_flags & 0x10) {
switch (field_0x958) {
case 2:
case 7:
case 8:
bVar8 = false;
break;
default:
bVar8 = true;
break;
}
f32 tmp2 = wall_up_distance - (vec.y - center.y);
if (tmp2 < 10.0f) {
tmp2 = 10.0f;
}
cSGlobe globe(*plane1.GetNP());
globe.V(globe.V() + cSAngle::_90);
globe.R(tmp2 * globe.V().Sin());
cXyz vec2 = vec + globe.Xyz();
cXyz vec3 = *plane1.GetNP();
vec3.y = 0.0f;
if (dComIfGp_evmng_cameraPlay() || CheckFlag(0x20000000)) {
field_0x968 = 1.0f;
field_0x96c = 0.0f;
}
if (bVar8) {
field_0x96c = 0.0f;
} else {
field_0x96c += (1.0f - field_0x96c) * 0.1f;
}
if (bVar8 || !(mMonitor.field_0xc < 5.0f)
|| !(fabsf(mPadInfo.mCStick.mLastPosX) < 0.05f)) {
field_0x968 = 0.2f;
} else {
field_0x968 *= mMonitor.field_0xc / 5.0f;
}
f32 tmp = field_0x96c * (mIsWolf == 1 ? 30.0f : 30.0f);
center += vec3.norm() * (tmp * globe.V().Sin());
cSGlobe globe2(vec2 - center);
globe2.V(mDirection.V() + (globe2.V() - mDirection.V()) * field_0x968);
if (globe2.V() > cSAngle(80.0f)) {
globe2.V(cSAngle(80.0f));
}
globe2.R(gaze_back_margin + globe2.R());
vec = center + globe2.Xyz();
if (lineBGCheck(&center, &vec, &lin_chk1, i_flags)) {
vec = lin_chk1.GetCross();
}
eye = compWallMargin(&vec, &center, gaze_back_margin);
tooNearEscape(&eye);
bVar8 = true;
setFlag(0x80);
setFlag(0x4000);
break;
}
// fallthrough
}
case 1:
case 3:
case 4: {
uVar13 |= 4;
setFlag(0x80);
vec = field_0x90 = lin_chk1.GetCross();
eye = compWallMargin(&vec, &center, gaze_back_margin);
tooNearEscape(&eye);
bVar8 = true;
break;
}
}
} else {
uVar14 = 0;
if (chkFlag(0x4000)) {
if (field_0x938 == 0) {
f32 dist = cXyz(mEye - field_0x5c.mEye).abs();
if (dist > 60.0f) {
field_0x938 = 40;
} else if (dist < 6.0f) {
field_0x938 = 4;
} else {
field_0x938 = (int)(dist / 1.5f);
}
}
f32 rate = 1.0f / (f32)field_0x938;
direction.R(mDirection.R() + rate * (direction.R() - mDirection.R()));
direction.V(mDirection.V() + (direction.V() - mDirection.V()) * rate);
vec = center + direction.Xyz();
if (lineBGCheck(&center, &vec, &lin_chk1, i_flags)) {
vec = lin_chk1.GetCross();
}
if (--field_0x938 == 0) {
clrFlag(0x4000);
}
} else {
vec = eye;
}
eye = compWallMargin(&vec, &center, gaze_back_margin);
bVar8 = true;
}
}
field_0x958 = uVar14;
if ((i_flags & 0x4000) && mCamSetup.CheckFlag2(0x400)) {
cCcD_ShapeAttr::Shape shape;
for (int i = 0; i < 3; i++) {
if (!dComIfG_Ccsp()->chkCameraPoint(eye, &shape, mpPlayerActor, NULL)) {
break;
}
bool bVar9 = false;
cXyz vec;
f32 var_f29, var_f28;
switch (shape._0) {
case 0:
vec = shape._4;
vec.y -= shape._10;
var_f29 = shape._10;
var_f28 = var_f29 * 2.0f;
bVar9 = true;
break;
case 1:
vec = shape._4;
var_f29 = shape._10;
var_f28 = shape._14;
bVar9 = true;
break;
}
if (bVar9 && center.y >= vec.y && center.y <= vec.y + var_f28) {
cXyz vec2;
vec2.x = vec.x - center.x;
vec2.y = 0.0f;
vec2.z = vec.z - center.z;
if (vec2.abs() <= var_f29) {
bVar9 = false;
}
}
if (bVar9) {
cM3dGCyl cyl(&vec, var_f29, var_f28);
cM3dGLin lin(center, eye);
cXyz vec2, vec3, vec4;
if (cM3d_Cross_CylLin(&cyl, &lin, &vec2, &vec3)) {
vec4.x = vec2.x - vec.x;
vec4.y = 0.0f;
vec4.z = vec2.z - vec.z;
vec4.normalize();
eye = vec2 + vec4 * 2.0f;
bVar8 = true;
}
}
}
}
if (i_flags & 0x80) {
dBgS_GndChk gnd_chk;
gnd_chk.SetPos(&eye);
cXyz vec1, vec2;
if (dComIfG_Bgsp().GroundCross(&gnd_chk) < mBG.field_0x5c.field_0x58 + 40.0f) {
vec1 = eye;
vec2 = center;
vec2 += (vec1 - vec2) * 0.5f;
} else {
vec2 = eye;
vec1 = center;
vec1 += (vec2 - vec1) * 0.5f;
}
if (mBG.field_0xc0.field_0x44 && (lineCollisionCheckBush(&vec1, &vec2) & 6) != 0) {
cXyz mass_cam_top_pos;
dComIfG_Ccsp()->GetMassCamTopPos(&mass_cam_top_pos);
if (eye.y < mass_cam_top_pos.y) {
eye.y = mEye.y + (mass_cam_top_pos.y - mEye.y) * 0.2f;
bVar8 = true;
}
}
} else if (i_flags & 0xb7) {
f32 fVar1 = eye.y - mBG.field_0x0.field_0x58;
if (fVar1 >= 0.0f && fVar1 < 3.0f) {
eye.y = mBG.field_0x0.field_0x58 + 3.0f;
bVar8 = true;
} else if (fVar1 <= 0.0f && fVar1 > -3.0f) {
eye.y = mBG.field_0x0.field_0x58 - 3.0f;
bVar8 = true;
}
}
mCenter = center;
mEye = eye;
if (bVar8) {
direction.Val(eye - center);
}
mDirection = direction;
return uVar13 != 0 ? true : false;
}
/* 80167BF8-80167C24 162538 002C+00 2/2 0/0 0/0 .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);
}
/* 80167C24-80167CB8 162564 0094+00 1/1 0/0 0/0 .text
* radiusActorInSight__9dCamera_cFP10fopAc_ac_cP10fopAc_ac_cP10fopAc_ac_c */
f32 dCamera_c::radiusActorInSight(fopAc_ac_c* param_0, fopAc_ac_c* param_1,
fopAc_ac_c* param_2) {
f32 var_f31 = radiusActorInSight(param_0, param_1, &field_0x5c.mCenter, &field_0x5c.mEye, mFovy, mBank, 0.05f);
f32 var_f30 = radiusActorInSight(param_0, param_2, &field_0x5c.mCenter, &field_0x5c.mEye, mFovy, mBank, 0.05f);
f32 var_f29;
if (var_f31 > var_f30) {
var_f29 = var_f31;
} else {
var_f29 = var_f30;
}
return var_f29;
}
/* 80167CD8-80167E3C 162618 0164+00 2/2 0/0 0/0 .text jutOutCheck__9dCamera_cFP4cXyzf */
BOOL dCamera_c::jutOutCheck(cXyz* param_0, f32 param_1) {
cXyz spB4 = attentionPos(mpPlayerActor);
spB4 += (positionOf(mpPlayerActor) - spB4) * 0.5f;
dBgS_CamLinChk linchk;
if (lineBGCheck(&spB4, param_0, &linchk, 0x40B7)) {
cM3dGPla plane;
dComIfG_Bgsp().GetTriPla(linchk, &plane);
*param_0 = linchk.GetCross();
*param_0 += *plane.GetNP() * param_1;
return TRUE;
}
return FALSE;
}
/* 80167E3C-80167EF4 16277C 00B8+00 1/1 0/0 0/0 .text tooNearEscape__9dCamera_cFP4cXyz */
void dCamera_c::tooNearEscape(cXyz* param_0) {
cXyz sp2C = attentionPos(mpPlayerActor);
cSGlobe sp58(*param_0 - sp2C);
if (sp58.R() < 40.0f) {
sp58.R(40.0f);
*param_0 = sp2C + sp58.Xyz();
}
}
/* 80167EF4-80167FEC 162834 00F8+00 2/2 0/0 0/0 .text getWaterSurfaceHeight__9dCamera_cFP4cXyz */
f32 dCamera_c::getWaterSurfaceHeight(cXyz* param_0) {
f32 var_f31 = -1000000000.0f;
cXyz spF8(*param_0);
dBgS_RoofChk roofchk;
roofchk.SetUnderwaterRoof();
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 > param_0->y) {
var_f31 = gnd_y;
}
return var_f31;
}
/* 80167FEC-80168744 16292C 0758+00 3/3 0/0 0/0 .text checkGroundInfo__9dCamera_cFv */
void dCamera_c::checkGroundInfo() {
daAlink_c* player = (daAlink_c*)mpPlayerActor;
cXyz gnd_chk_pos = positionOf(mpPlayerActor);
if (check_owner_action(mPadID, 0x8000000)) {
gnd_chk_pos = eyePos(mpPlayerActor);
gnd_chk_pos.y = positionOf(mpPlayerActor).y;
}
cXyz roof_chk_pos = gnd_chk_pos;
gnd_chk_pos.y += 20.0f;
dBgS_RoofChk roof_chk;
roof_chk.SetUnderwaterRoof();
roof_chk.SetPos(roof_chk_pos);
f32 roof_y = dComIfG_Bgsp().RoofChk(&roof_chk);
if (roof_chk_pos.y < roof_y) {
roof_chk_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.field_0x5c.field_0x4.SetCam();
mBG.field_0x5c.field_0x4.ClrObj();
mBG.field_0x5c.field_0x4.SetPos(&gnd_chk_pos);
mBG.field_0x5c.field_0x58 = dComIfG_Bgsp().GroundCross(&mBG.field_0x5c.field_0x4);
if (mBG.field_0x5c.field_0x58 < ground_y) {
mBG.field_0x5c.field_0x58 = ground_y;
mBG.field_0x5c.field_0x4 = gnd_chk;
}
mBG.field_0x5c.field_0x0 = mBG.field_0x5c.field_0x58 != -1.0e9f;
mBG.field_0x0.field_0x4.SetPos(&roof_chk_pos);
mBG.field_0x0.field_0x58 = dComIfG_Bgsp().GroundCross(&mBG.field_0x0.field_0x4);
mBG.field_0x0.field_0x0 = mBG.field_0x0.field_0x58 != -1.0e9f;
if (check_owner_action(mPadID, 0x100000)
&& mBG.field_0x0.field_0x58 < attentionPos(mpPlayerActor).y + 40.0f)
{
setComStat(0x800);
mBG.field_0xc0.field_0x44 = 1;
} else if (player->checkRide() || player->checkRoofSwitchHang() || player->checkWolfRope()) {
mBG.field_0xc0.field_0x44 = 1;
} else if (check_owner_action1(mPadID, 0x2110000)) {
mBG.field_0xc0.field_0x44 = 1;
} else if (player->checkSpinnerRide()) {
mBG.field_0xc0.field_0x44 = 1;
} else if (player->checkMagneBootsOn()) {
if (!cBgW_CheckBWall(player->getMagneBootsTopVec()->y)) {
mBG.field_0xc0.field_0x44 = 1;
}
} else if (footHeightOf(mpPlayerActor) - mBG.field_0x5c.field_0x58 > mCamSetup.mBGChk.FloorMargin()) {
mBG.field_0xc0.field_0x44 = 0;
} else {
mBG.field_0xc0.field_0x44 = 1;
}
mBG.field_0xc0.field_0x1 = 0;
mBG.field_0xc0.field_0x20 = NULL;
if (dComIfG_Bgsp().ChkMoveBG(mBG.field_0x5c.field_0x4)) {
mBG.field_0xc0.field_0x20 = dComIfG_Bgsp().GetActorPointer(mBG.field_0x5c.field_0x4);
if (mBG.field_0xc0.field_0x20 != NULL) {
cXyz pos = positionOf(mBG.field_0xc0.field_0x20);
cSAngle angle = directionOf(mBG.field_0xc0.field_0x20);
if (mBG.field_0xc0.field_0x0 != 0) {
mBG.field_0xc0.field_0x4 = mBG.field_0xc0.field_0x10 - pos;
mBG.field_0xc0.field_0x1c = mBG.field_0xc0.field_0x1e - angle;
}
mBG.field_0xc0.field_0x0 = 1;
if (!dComIfGp_evmng_cameraPlay() && !chkFlag(0x20000000) && mBG.field_0xc0.field_0x44 != 0) {
mBG.field_0xc0.field_0x1 = 1;
}
if (mBG.field_0xc0.field_0x1 != 0) {
dComIfG_Bgsp().MoveBgMatrixCrrPos(mBG.field_0x5c.field_0x4, true,
&field_0x5c.mCenter, NULL, NULL);
dComIfG_Bgsp().MoveBgMatrixCrrPos(mBG.field_0x5c.field_0x4, true,
&field_0x5c.mEye, NULL, NULL);
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
}
mBG.field_0xc0.field_0x10 = pos;
mBG.field_0xc0.field_0x1e = angle;
}
} else {
mBG.field_0xc0.field_0x0 = 0;
}
if (mBG.field_0x5c.field_0x0) {
mBG.field_0xc0.field_0x34 = dComIfG_Bgsp().GetCamMoveBG(mBG.field_0x5c.field_0x4);
} else {
mBG.field_0xc0.field_0x34 = 0;
}
if (mBG.field_0x0.field_0x0 && check_owner_action(mPadID, 0x100000)) {
mBG.field_0xc0.field_0x3c = dComIfG_Bgsp().GetRoomCamId(mBG.field_0x0.field_0x4);
} else {
mBG.field_0xc0.field_0x3c = 0xff;
}
if (mBG.field_0xc0.field_0x44 == 0 && field_0xa8 != 0 && !check_owner_action(mPadID, 0x100000)) {
mBG.field_0xc0.field_0x40 = 0x1ff;
} else if (mBG.field_0x5c.field_0x0) {
mBG.field_0xc0.field_0x40 = dComIfG_Bgsp().GetRoomCamId(mBG.field_0x5c.field_0x4);
} else {
mBG.field_0xc0.field_0x40 = 0xff;
}
}
/* 80168744-8016C25C 163084 3B18+00 3/2 0/0 0/0 .text chaseCamera__9dCamera_cFl */
bool dCamera_c::chaseCamera(s32 param_0) {
static f32 JumpCushion = 0.9f;
f32 charge_latitude = mCamSetup.ChargeLatitude();
int charge_timer = mCamSetup.ChargeTimer();
f32 charge_b_ratio = mCamSetup.ChargeBRatio();
static cSAngle LatitudeLimitMax = 80.0f;
daAlink_c* player = (daAlink_c*)mpPlayerActor;
daMidna_c* midna = daPy_py_c::getMidnaActor();
if (dComIfGp_getAttention()->GetCheckObjectCount() != 0) {
field_0x188 = dComIfGp_getAttention()->CheckObjectTarget(0);
setFlag(2);
}
f32 val0 = mCamParam.Val(param_0, 0);
f32 val2 = mCamParam.Val(param_0, 2);
f32 val1 = mCamParam.Val(param_0, 1);
f32 val3 = mCamParam.Val(param_0, 3);
f32 val4 = mCamParam.Val(param_0, 4);
f32 val5 = mCamParam.Val(param_0, 5);
f32 val6 = mCamParam.Val(param_0, 6);
f32 val7 = mCamParam.Val(param_0, 7);
f32 val8 = mCamParam.Val(param_0, 8);
f32 val9 = mCamParam.Val(param_0, 9);
f32 val10 = mCamParam.Val(param_0, 10);
f32 val11 = mCamParam.Val(param_0, 11);
f32 val12 = mCamParam.Val(param_0, 12);
f32 val13 = mCamParam.Val(param_0, 13);
f32 val14 = mCamParam.Val(param_0, 14);
f32 val16 = mCamParam.Val(param_0, 16);
f32 val15 = mCamParam.Val(param_0, 15);
f32 val17 = mCamParam.Val(param_0, 17);
f32 val19 = mCamParam.Val(param_0, 19);
f32 val18 = mCamParam.Val(param_0, 18);
f32 val21 = mCamParam.Val(param_0, 21);
f32 val22 = mCamParam.Val(param_0, 22);
f32 val23 = mCamParam.Val(param_0, 23);
f32 val24 = mCamParam.Val(param_0, 24);
cSAngle ang1 = -75.0f;
cSAngle ang2 = 75.0f;
f32 dVar52 = 0.25f;
if (mCamParam.CheckFlag(1)) {
setFlag(0x20000);
}
if (player->checkSpinnerPathMove() || mCurType == specialType[CAM_TYPE_LV4_BOSS_SPJP]) {
mPadInfo.mMainStick.mLastPosX = 0.0f;
mPadInfo.mMainStick.mLastPosY = 0.0f;
mPadInfo.mMainStick.mLastValue = 0.0f;
}
if (mCurCamStyleTimer == 0) {
cXyz player_attention = attentionPos(mpPlayerActor) - positionOf(mpPlayerActor);
if (chkFlag(0x200) && field_0x110.field_0x8.field_0x1e <= 0) {
field_0x5c.mCenter = mCenter;
field_0x5c.mEye = mEye;
field_0x5c.mDirection = mDirection;
field_0x5c.mFovy = mFovy;
}
mWork.chase.field_0x40 = 0.0f;
mWork.chase.field_0x71 = false;
mWork.chase.field_0x96 = directionOf(mpPlayerActor).Inv();
mWork.chase.field_0x93 = false;
mWork.chase.field_0x73 = false;
mWork.chase.field_0x9c = 0xfe;
mWork.chase.field_0x18 = 0;
mWork.chase.field_0xa0 = field_0x940;
mWork.chase.field_0x94 = false;
mWork.chase.field_0xa4 = 0.0f;
mWork.chase.field_0x24 = 0.0f;
mWork.chase.field_0x98 = directionOf(mpPlayerActor);
if (chkFlag(0x100000)) {
setUSOAngle();
}
if (mCamParam.Flag(param_0, 0x200)) {
switch (field_0x7ac.field_0x3a & 3) {
case 1:
field_0x940 = 0;
break;
case 2:
field_0x940 = 1;
break;
}
}
}
bool bVar6 = false;
if (check_owner_action(mPadID, 0x100000) && mBG.field_0xc0.field_0x44 == 0) {
bVar6 = true;
}
cSAngle player_direction = directionOf(mpPlayerActor);
bool bVar12 = false;
bool bVar2 = false;
bool bVar7 = false;
if (check_owner_action(mPadID, 0x300)) {
bVar12 = true;
}
if (check_owner_action(mPadID, 0x2000008)) {
bVar2 = true;
}
if (player->checkMagneBootsOn()) {
bVar7 = true;
if (cBgW_CheckBWall(player->getMagneBootsTopVec()->y)) {
bVar2 = true;
}
}
cSAngle player_angle_delta = player_direction - field_0x5c.mDirection.U();
field_0x944 = 1;
if (field_0x7ac.field_0x30 != 0xff && mCamParam.Flag(param_0, 0x200)) {
if (field_0x7ac.field_0x30 != mWork.chase.field_0x9c) {
mCamParam.Fovy(field_0x7ac.field_0x0.field_0x11);
mCamParam.Arg0(field_0x7ac.field_0x0.field_0x12);
mCamParam.Arg1(field_0x7ac.field_0x0.field_0x13);
mCamParam.Arg2(field_0x7ac.field_0x0.field_0x14);
if (param_0 == mCamTypeData[mCurType].field_0x18[mIsWolf][mCurMode]) {
mCamParam.Change(param_0);
}
mWork.chase.field_0x9c = field_0x7ac.field_0x30;
}
if (mCamParam.Fovy() != 0xff) {
val19 = (s8)mCamParam.Fovy();
}
if (mCamParam.Arg0() != 0xff) {
val9 = (s8)mCamParam.Arg0() * 100.0f;
}
if (mCamParam.Arg1() != 0xff) {
val14 = (s8)mCamParam.Arg1();
}
if (mCamParam.Arg2() != -1) {
val4 = mCamParam.Arg2();
}
} else if (field_0x7ac.field_0x30 == 0xff && mWork.chase.field_0x9c != 0xff) {
mCamParam.Fovy(0xff);
mCamParam.Arg0(0xff);
mCamParam.Arg1(0xff);
mCamParam.Arg2(-1);
if (param_0 == mCamTypeData[mCurType].field_0x18[mIsWolf][mCurMode]) {
mCamParam.Change(param_0);
}
mWork.chase.field_0x9c = 0xff;
}
if (field_0x940 == 1) {
val7 = val9;
val8 = val9 - val9 * 0.2f;
val2 = val3 = val4;
val12= val13 = val14;
val17 = val18 = val19;
}
bool bVar10, bVar8;
bool bVar9 = false;
bool bVar3 = false;
bool bVar1 = false;
if (mIsWolf == 0) {
if (isPlayerCharging(mPadID)) {
bVar1 = true;
}
if (check_owner_action(mPadID, 0x8000000)) {
bVar3 = true;
}
if (check_owner_action1(mPadID, 0x2000000)) {
clrFlag(0x80);
cXyz* left_foot_pos = player->getLeftFootPosP();
cXyz* right_foot_pos = player->getRightFootPosP();
if (left_foot_pos->y < right_foot_pos->y) {
val0 = -val0;
}
} else if (mThrowTimer != 0 && !chkFlag(0x100000)) {
f32 throw_ctr_adjust = mCamSetup.ThrowCtrAdjust();
val2 += throw_ctr_adjust;
val3 += throw_ctr_adjust;
f32 throw_v_angle = mCamSetup.ThrowVAngle();
if (val12 < throw_v_angle) {
val12 = throw_v_angle;
}
if (val13 < throw_v_angle) {
val13 = throw_v_angle;
}
f32 throw_cushion = mCamSetup.ThrowCushion();
val16 = throw_cushion;
val5 = throw_cushion;
field_0x1b0 = cSAngle::_0;
mWork.chase.field_0x94 = true;
} else if ((player->getGrabActorID() != fpcM_ERROR_PROCESS_ID_e || mThrowTimer != 0)
&& chkFlag(0x100000)) {
val9 = mCamSetup.ThrowCtrAdjust();
if (mThrowTimer != 0) {
val9 *= (f32)mThrowTimer / mCamSetup.ThrowTimer();
}
val2 += val9;
val3 += val9;
} else if (player->checkCanoeRideTandem()) {
val1 -= 100.0f;
} else if (check_owner_action(mPadID, 0x100000)) {
val9 = mMonitor.field_0x10 / 22.0f;
if (val9 > 1.0f) {
val9 = 1.0f;
}
val1 *= val9;
}
if (mWork.chase.field_0x94) {
if (push_any_key()) {
mWork.chase.field_0x94 = false;
}
if (mThrowTimer == 0) {
bVar9 = true;
}
} else if (mWork.chase.field_0x92 && mWork.chase.field_0x1a > 14) {
f32 min = 550.0f;
if (val8 < min) {
val8 = min;
}
min *= 1.1f;
if (val7 < min) {
val7 = min;
}
}
} else {
if (isPlayerCharging(mPadID)) {
bVar1 = true;
}
if (field_0x194 != 0) {
val2 += 20.0f;
val3 += 20.0f;
}
if (check_owner_action1(mPadID, 0x1000000)) {
mWork.chase.field_0x73 = true;
mWork.chase.field_0x18 = 20;
} else if (mWork.chase.field_0x18 != 0) {
mWork.chase.field_0x73 = true;
mWork.chase.field_0x18--;
} else {
mWork.chase.field_0x73 = false;
}
if ((check_owner_action1(mPadID, 0x800000) || mWork.chase.field_0x73) && !chkFlag(0x100000)) {
val2 = val3 = val1 = -70.0f;
bVar1 = true;
f32 search_ball_scale = player->getSearchBallScale();
search_ball_scale *= 1.5f;
if (val8 < search_ball_scale) {
val8 = search_ball_scale;
}
search_ball_scale *= 1.1f;
if (val7 < search_ball_scale) {
val7 = search_ball_scale;
}
if (check_owner_action1(mPadID, 0x800000) && !mWork.chase.field_0x73) {
val10 = 1.0f;
val12 = val13 = 40.0f;
} else {
val8 = val7 * 0.75f;
val12 = 30.0f;
val16 = val13 = 1.0f;
}
val17 = val18 = 90.0f / field_0x92c;
}
if (mWork.chase.field_0x73) {
val22 = 0.0001f;
val16 = 0.0001f;
val10 = 0.0001f;
val21 = 0.0001f;
}
if (mCurMode == 1 && val8 < 300.0f && val7 > 300.0f) {
val8 = 300.0f;
}
}
dAttention_c* attention = dComIfGp_getAttention();
if (field_0x940 == 1 && !mCamParam.Flag(param_0, 0x20)) {
field_0x1b0 = cSAngle::_0;
}
if (mCurMode == 1) {
val16 = 0.25f;
}
bool bVar33 = false;
if (check_owner_action1(mPadID, 0x10000)) {
cXyz hs_sub_chain_top_pos = daAlink_getAlinkActorClass()->getHsSubChainTopPos();
if (hs_sub_chain_top_pos.y - attentionPos(mpPlayerActor).y > 100.0f) {
bVar33 = true;
}
}
if (check_owner_action(mPadID, 0x100)) {
val7 -= 50.0f;
val8 -= 50.0f;
if (mIsWolf == 1) {
val1 = 1.0f;
} else {
val1 = -30.0f;
}
ang1.Val(-80.0f);
ang2.Val(80.0f);
val2 = 40.0f;
val3 = 30.0f;
if (player_angle_delta > cSAngle::_270 && player_angle_delta < cSAngle::_90) {
val12 = 30.0f;
val13 = 30.0f;
} else {
if (val12 < 10.0f) {
val12 = 10.0f;
}
if (val13 < 10.0f) {
val13 = 10.0f;
}
}
val6 = 0.05f;
val16 = 0.15f;
} else if (check_owner_action(mPadID, 0x2000208)) {
val1 -= 50.0f;
val6 = 0.25f;
val7 -= 50.0f;
val8 -= 50.0f;
ang1.Val(-60.0f);
ang2.Val(60.0f);
if (val2 > 30.0f) {
val2 = 30.0f;
}
if (val3 > 30.0f) {
val3 = 30.0f;
}
field_0x1b0 = cSAngle::_0;
val16 = 0.15f;
} else if (bVar33) {
field_0x1b0 = cSAngle::_0;
mBG.field_0xc0.field_0x44 = 0;
}
if (mIsWolf == 1 || check_owner_action(mPadID, 0x8000000)) {
if (val2 < -30.0f) {
val2 = -30.0f;
}
if (val3 < -30.0f) {
val3 = -30.0f;
}
}
cXyz player_attention_pos = attentionPos(mpPlayerActor);
lineBGCheck(&player_attention_pos, &field_0x5c.mEye, 0x40b7);
if (mCurCamStyleTimer == 0) {
mWork.chase.field_0x38 = val0;
} else if (chkFlag(0x100000) && !check_owner_action1(mPadID, 0x2000000)
&& check_owner_action(mPadID, 0xa50c0)) {
if (mPadInfo.mMainStick.mLastPosX < -0.2f) {
mWork.chase.field_0x71 = true;
}
if (mPadInfo.mMainStick.mLastPosX > 0.2f) {
mWork.chase.field_0x71 = false;
}
f32 tmp;
if (mWork.chase.field_0x71) {
tmp = -45.0f;
} else {
tmp = 45.0f;
}
mWork.chase.field_0x38 += (tmp - mWork.chase.field_0x38) * 0.04f;
} else {
mWork.chase.field_0x38 += (val0 - mWork.chase.field_0x38) * 0.06f;
}
if (field_0x940 == 1 || val7 <= val8) {
mWork.chase.field_0xa4 = 0.0f;
} else if (!mCamParam.Flag(param_0, 0x400)) {
val14 = field_0x5c.mDirection.R();
if (val14 < val8) {
val9 = val8;
} else if (val14 > val7) {
val9 = val7;
} else {
val9 = val14;
}
f32 tmp = (val7 - val9) / (val7 - val8);
if (mCurCamStyleTimer == 0) {
mWork.chase.field_0xa4 = tmp;
} else {
mWork.chase.field_0xa4 += (tmp - mWork.chase.field_0xa4) * 0.75f;
}
}
f32 tmp = val2 + mWork.chase.field_0xa4 * (val3 - val2);
if (mCurCamStyleTimer == 0) {
mWork.chase.field_0x3c = tmp;
} else {
mWork.chase.field_0x3c += (tmp - mWork.chase.field_0x3c) * 0.08f;
}
cXyz vec(mWork.chase.field_0x38, mWork.chase.field_0x3c, val1);
if (mCurCamStyleTimer == 0) {
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
mWork.chase.field_0x0 = 'CHAS';
if (mBG.field_0xc0.field_0x44 != 0 && !check_owner_action(mPadID, 0x200)) {
mWork.chase.field_0x20 = 0.0f;
} else {
mWork.chase.field_0x20 = 1.0f;
}
mWork.chase.field_0x10 = 30;
mWork.chase.field_0x28 = val8;
mWork.chase.field_0x2c = val7;
mWork.chase.field_0x18 = 0;
mWork.chase.field_0x1a = 0;
mWork.chase.field_0x14 = 0;
mWork.chase.field_0x54 = 0.01f;
mWork.chase.field_0x7c = 0.01f;
mWork.chase.field_0x78 = 0.01f;
mWork.chase.field_0x80 = 0.01f;
mWork.chase.field_0x74 = 0.01f;
mWork.chase.field_0x84 = val6;
mWork.chase.field_0x88 = val5;
mWork.chase.field_0x44 = 0;
mWork.chase.field_0x70 = true;
mWork.chase.field_0x34 = field_0x5c.mFovy;
mWork.chase.field_0x48 = 0.0f;
mWork.chase.field_0x72 = false;
mWork.chase.field_0x91 = false;
mWork.chase.field_0x92 = false;
mWork.chase.field_0x30 = positionOf(mpPlayerActor).y;
mWork.chase.field_0x95 = false;
mWork.chase.field_0x4c = 1.0f;
mWork.chase.field_0xa8 = 0;
if (dComIfGp_evmng_cameraPlay()) {
int timer;
getEvIntData(&timer, "Timer", 20);
mWork.chase.field_0x4 = timer != 0 ? timer : 1;
mWork.chase.field_0x95 = true;
} else {
cXyz pos = relationalPos(mpPlayerActor, &vec);
cSGlobe globe = mDirection.Invert();
globe.R(100000.0f);
cXyz pos2 = mEye + globe.Xyz();
cM3dGLin lin(pos2, mEye);
f32 dist;
if (cM3d_Len3dSqPntAndSegLine(&lin, &pos, &pos2, &dist)) {
if (field_0x110.field_0x8.field_0x1e <= 0) {
mCenter = pos2;
mDirection.Val(mEye - mCenter);
}
field_0x5c.mCenter = pos2;
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
}
cSAngle ang;
if ((chkFlag(0x100000) || bVar3 || bVar6) && std::fabsf(mPadInfo.mCStick.mLastPosX) < 0.05f) {
ang.Val(directionOf(mpPlayerActor).Inv());
} else {
ang.Val(field_0x5c.mDirection.U());
}
cSGlobe globe2((val8 + val7) * 0.5f, cSAngle((val12 + val13) * 0.5f), ang);
cXyz pos3 = pos + globe2.Xyz();
f32 dist1 = cXyz(mEye - pos3).abs() * 2.5f;
dist = val3 + (val2 - val3) * mWork.chase.field_0xa4;
pos3 = pos;
pos.y += dist;
f32 dist2 = cXyz(mCenter - pos3).abs() * 8.0f;
f32 abs_dist_max = std::fabsf(dist1 > dist2 ? dist1 : dist2);
f32 tmp2 = val18 + (val17 - val18) * mWork.chase.field_0xa4;
f32 fovy_diff = std::fabsf(mFovy - tmp2);
f32 sin = cSAngle(mFovy > tmp2 ? mFovy : tmp2).Sin();
f32 tmp3 = 100.0f * (sin * sin) * fovy_diff;
f32 tmp5;
if (abs_dist_max > tmp3) {
tmp5 = abs_dist_max;
} else {
tmp5 = tmp3;
}
f32 tmp6 = std::fabsf(tmp5);
tmp6 *= 1.2f;
tmp6 *= 0.00625f;
val3 = JMAFastSqrt(tmp6);
mWork.chase.field_0x4 = (int)(val3 * 2.2f) + 1;
if (mWork.chase.field_0x4 < 5) {
mWork.chase.field_0x4 = 5;
}
}
if (player->checkGoronSideMove()) {
mWork.chase.field_0x4 = 20;
} else if (mCurType == specialType[CAM_TYPE_LV9_GZELDA_TRI]) {
mWork.chase.field_0x4 = 45;
} else if (chkFlag(0x20)) {
int tmp2 = mWork.chase.field_0x4;
int tmp = tmp2 / 6;
mWork.chase.field_0x4 = tmp2 + (tmp > 15 ? 15 : tmp < 5 ? 5 : tmp);
} else if (player->checkMagneBootsOn()) {
cXyz* magne_boots_top_vec = player->getMagneBootsTopVec();
cXyz vec2 = mDirection.Xyz().norm();
if (VECDotProduct(magne_boots_top_vec, &vec2) < -0.1f) {
vec2 = (vec2 + *magne_boots_top_vec) * 0.5f;
field_0x5c.mDirection.Val(vec2);
field_0x5c.mDirection.R(val8);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
mWork.chase.field_0x4 = 1;
field_0x158.field_0x0 = 1;
}
} else if (Stage == 0x6a && player->checkCameraLargeDamage()) {
field_0x5c.mCenter = relationalPos(mpPlayerActor, &vec);
field_0x5c.mDirection.Val(val8, cSAngle(val13), mDirection.U());
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = val18;
field_0x158.field_0x0 = 1;
mWork.chase.field_0x4 = 1;
} else if (mCurMode == 0 && !mWork.chase.field_0x95 && mWork.chase.field_0x4 < 10 && !chkFlag(0x50000)
&& (chkFlag(0x8000) || field_0x168 == 0)) {
field_0x158.field_0x0 = 1;
mWork.chase.field_0x4 = 1;
}
mWork.chase.field_0x50 = field_0x5c.mDirection.V().Degree();
mWork.chase.field_0x58 = field_0x5c.mCenter;
mWork.chase.field_0x64 = field_0x5c.mEye;
mWork.chase.field_0x34 = field_0x5c.mFovy;
if (chkFlag(0x200)) {
f32 dist = field_0x5c.mDirection.R();
mWork.chase.field_0x2c = dist;
mWork.chase.field_0x28 = dist;
}
mWork.chase.field_0x8 = mWork.chase.field_0x4 * (mWork.chase.field_0x4 + 1) >> 1;
mWork.chase.field_0xc = 0.0f;
mWork.chase.field_0x1c = 0;
mWork.chase.field_0x8c = 0;
mWork.chase.field_0x90 = false;
}
cXyz pos = relationalPos(mpPlayerActor, &vec);
fopAc_ac_c* copy_rod_camera = player->getCopyRodCameraActor();
if (copy_rod_camera != NULL) {
cXyz attention_pos = attentionPos(mpPlayerActor);
if (!lineBGCheck(&attention_pos, &field_0x5c.mEye, 0x40b7)) {
field_0x188 = copy_rod_camera;
setFlag(0x2000);
}
}
if (player->checkHorseRide()) {
pos.y -= 100.0f;
}
jutOutCheck(&pos, 5.0f);
cXyz vec2(0.0f, 0.0f, mMonitor.field_0xc * 10.0f);
cXyz vec3 = attentionPos(mpPlayerActor) + dCamMath::xyzRotateY(vec2, player_direction);
dBgS_CamLinChk lin_chk;
if (lineBGCheck(&field_0x5c.mEye, &vec3, &lin_chk, 0x40b7)) {
cM3dGPla plane;
dComIfG_Bgsp().GetTriPla(lin_chk, &plane);
vec3 = lin_chk.GetCross();
vec3 += *plane.GetNP();
val22 *= 3.0f;
}
if (field_0x158.field_0x0 == 0) {
mWork.chase.field_0x96 = player_direction.Inv();
if (mBG.field_0xc0.field_0x1 != 0) {
dComIfG_Bgsp().MoveBgMatrixCrrPos(mBG.field_0x5c.field_0x4, true,
&mWork.chase.field_0x58, NULL, NULL);
}
mWork.chase.field_0xc = mWork.chase.field_0x4 - (int)mCurCamStyleTimer;
f32 rate = mWork.chase.field_0xc / mWork.chase.field_0x8;
mWork.chase.field_0x58 = pos;
if (mWork.chase.field_0x95) {
rate = 0.75f;
if (push_any_key() && mMonitor.field_0xc < 0.1f && mCurCamStyleTimer > 20) {
field_0x158.field_0x0 = 1;
}
}
field_0x5c.mCenter += (pos - field_0x5c.mCenter) * rate;
f32 dist = dCamMath::xyzHorizontalDistance(pos, mWork.chase.field_0x58);
if (dist < std::fabsf(vec.x > vec.z ? vec.x : vec.z) + 20.0f) {
cXyz attention_pos = attentionPos(mpPlayerActor);
attention_pos.y -= 15.0f;
dBgS_CamLinChk lin_chk;
if (lineBGCheck(&attention_pos, &field_0x5c.mCenter, &lin_chk, 0x40b7)) {
cM3dGPla plane;
dComIfG_Bgsp().GetTriPla(lin_chk, &plane);
field_0x5c.mCenter = lin_chk.GetCross();
field_0x5c.mCenter += *plane.GetNP();
}
}
f32 dVar43 = limitf(field_0x5c.mDirection.R(), val8, val7);
cSAngle ang = val12 + mWork.chase.field_0xa4 * (val13 - val12);
if (!mWork.chase.field_0x95) {
ang += field_0x1b0;
}
mWork.chase.field_0x50 = ang.Degree();
cSGlobe globe(dVar43, ang, cSAngle(field_0x8c.Inv()));
field_0x5c.mDirection.R(field_0x5c.mDirection.R() + (globe.R() - field_0x5c.mDirection.R()) * rate);
field_0x5c.mDirection.V(field_0x5c.mDirection.V() + (globe.V() - field_0x5c.mDirection.V()) * rate);
if (chkFlag(0x100000) || bVar3 || bVar6) {
field_0x5c.mDirection.U(field_0x5c.mDirection.U() + (mWork.chase.field_0x96 - field_0x5c.mDirection.U()) * rate);
}
mWork.chase.field_0x64 = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mEye = mWork.chase.field_0x64;
if (mCurCamStyleTimer >= mWork.chase.field_0x4 - 1) {
field_0x158.field_0x0 = 1;
}
mWork.chase.field_0x28 = mWork.chase.field_0x2c = field_0x5c.mDirection.R();
field_0x5c.mFovy += (val17 + mWork.chase.field_0xa4 * (val18 - val17) - field_0x5c.mFovy) * rate;
mWork.chase.field_0x8 -= mWork.chase.field_0xc;
mWork.chase.field_0x8c = 0;
mWork.chase.field_0x90 = false;
return true;
}
mWork.chase.field_0x95 = false;
if (field_0x1f8 == 1 && mWork.chase.field_0xa0 != field_0x940) {
mWork.chase.field_0x1c = 20;
mWork.chase.field_0xa0 = field_0x940;
}
if (mWork.chase.field_0x1c != 0) {
dVar52 = dCamMath::rationalBezierRatio(1.0f - (mWork.chase.field_0x1c - 1) / 20.0f, 0.5f);
}
if (player->checkThrowDamage()) {
mWork.chase.field_0x91 = true;
fopAc_ac_c* target = dComIfGp_getAttention()->LockonTarget(0);
if (target != NULL && fopAcM_GetName(target) == PROC_E_HZ) {
setFlag(0x2000);
field_0x188 = target;
}
} else {
mWork.chase.field_0x91 = false;
}
bVar10 = false;
bool bVar11 = false;
bool bVar34 = false;
cXyz player_pos = positionOf(mpPlayerActor);
player_pos.y += 10.0f;
groundHeight(&player_pos);
footHeightOf(mpPlayerActor);
if (mBG.field_0xc0.field_0x44 != 0 && !check_owner_action(mPadID, 0x200)) {
mWork.chase.field_0x20 = 0.0f;
mWork.chase.field_0x10 = 0;
} else if (mWork.chase.field_0x10 < 30) {
bVar10 = true;
mWork.chase.field_0x10++;
mWork.chase.field_0x20 += (JumpCushion - mWork.chase.field_0x20) * dCamMath::rationalBezierRatio(mWork.chase.field_0x10 / 30.0f, 1.25f);
} else if (!bVar2) {
bVar11 = true;
if (mBG.field_0x5c.field_0x0 && dComIfG_Bgsp().GetGroundCode(mBG.field_0x5c.field_0x4) == 4) {
bVar34 = true;
} else if (player->checkCokkoGlide()) {
bVar10 = true;
bVar11 = false;
}
val10 = 0.01f;
mWork.chase.field_0x20 += (1.0f - mWork.chase.field_0x20) * 0.1f;
}
if (check_owner_action(mPadID, 0x2800008)) {
if (mFakeAngleSys.field_0x0 == 0) {
setUSOAngle();
mWork.chase.field_0x98 = directionOf(mpPlayerActor);
} else {
cSAngle ang = mWork.chase.field_0x98 - directionOf(mpPlayerActor);
if (ang.Abs() > cSAngle(50.0f)) {
mFakeAngleSys.field_0x0 = 0;
}
}
}
if (mWork.chase.field_0x91) {
mWork.chase.field_0x84 = 0.35f;
} else if (check_owner_action(mPadID, 0x2000108)
&& !(player_angle_delta > cSAngle::_270 && player_angle_delta < cSAngle::_90))
{
mWork.chase.field_0x84 = 0.1f;
} else {
mWork.chase.field_0x84 += (val6 - mWork.chase.field_0x84) * 0.4f;
}
if (mWork.chase.field_0x91) {
mWork.chase.field_0x88 = 0.25f;
} else if (bVar10 || bVar11) {
mWork.chase.field_0x88 = val5 * 0.1f + (0.9f - val5 * 0.1f) * mWork.chase.field_0x20;
if (chkFlag(0x100000) && mWork.chase.field_0x84 > 0.25f) {
mWork.chase.field_0x84 = mWork.chase.field_0x20 * 0.75f + 0.25f;
}
} else if (mWork.chase.field_0x1c != 0) {
mWork.chase.field_0x88 = dVar52;
} else if (bVar6 && mDoCPd_c::getTrigA(mPadID)) {
mWork.chase.field_0x88 = 0.01f;
} else if (bVar6) {
mWork.chase.field_0x88 += (val5 - mWork.chase.field_0x88) * 0.1f;
} else {
mWork.chase.field_0x88 += (val5 - mWork.chase.field_0x88) * 0.4f;
}
cXyz vec4(mWork.chase.field_0x84, mWork.chase.field_0x88, mWork.chase.field_0x84);
bVar8 = false;
bool bVar5 = false;
if (chkFlag(0x80) && mDirection.R() < val8) {
bVar5 = true;
}
if (!chkFlag(0x100000) && !check_owner_action(mPadID, 0x2800108)) {
isPlayerCharging(mPadID);
}
if (bVar5 && mMonitor.field_0xc < 0.1f && !chkFlag(0x100000)
&& !check_owner_action(mPadID, 0x2800108) && !check_owner_action1(mPadID, 0x2110000))
{
bVar8 = true;
}
if (mCamParam.Flag(param_0, 0x1000)) {
f32 fVar55 = 0.0f;
if (push_any_key()) {
mWork.chase.field_0x8c = 0;
mWork.chase.field_0x90 = false;
} else if (mWork.chase.field_0x8c < mCamSetup.WaitRollTimer()) {
mWork.chase.field_0x8c++;
} else {
fopAc_ac_c* target = attention->LockonTarget(0);
if (target != NULL) {
cXyz delta = positionOf(target) - positionOf(mpPlayerActor);
cSAngle ang = -field_0x5c.mDirection.U();
delta = dCamMath::xyzRotateY(delta, ang);
cXyz vec5 = delta;
if (std::fabsf(vec5.y) < 200.0f) {
vec5.y = 0.0f;
vec5.x *= 0.5f;
f32 tmp = vec5.abs();
if (tmp < 500.0f) {
fVar55 = -delta.x * 0.55f * (1.0f - tmp / 500.0f);
}
}
}
}
mWork.chase.field_0x40 += (fVar55 - mWork.chase.field_0x40) * 0.01f;
cSGlobe globe(mWork.chase.field_0x40, field_0x5c.mDirection.V(), field_0x5c.mDirection.U() + cSAngle::_270);
pos += globe.Xyz();
}
field_0x5c.mCenter += (pos - field_0x5c.mCenter) * vec4;
cSGlobe globe = field_0x5c.mEye - field_0x5c.mCenter;
if (mWork.chase.field_0x1a > 0 && mWork.chase.field_0x1a <= 14) {
f32 tmp = mWork.chase.field_0x1a / 14.0f;
if (tmp > 1.0f) {
tmp = 1.0f;
}
f32 rate = dCamMath::rationalBezierRatio(tmp, charge_b_ratio);
mWork.chase.field_0x70 = true;
mWork.chase.field_0x48 = (1.0f - mWork.chase.field_0x48) * rate;
} else if (bVar6) {
f32 target = 1.0f;
f32 tmp = dCamMath::rationalBezierRatio(mPadInfo.mMainStick.mLastPosX, val23);
if (!mDoCPd_c::getHoldA(mPadID)) {
target = 1.0f - ((1.0f - val24) + val24 * cSAngle(tmp * 180.0f).Cos());
target *= mPadInfo.mMainStick.mLastValue;
}
mWork.chase.field_0x24 += (target - mWork.chase.field_0x24) * 0.4f;
if (mWork.chase.field_0x70) {
mWork.chase.field_0x48 = 0.05f;
}
mWork.chase.field_0x70 = false;
mWork.chase.field_0x48 += (val24 * mWork.chase.field_0x24 - mWork.chase.field_0x48) * 0.2f;
} else if (chkFlag(0x100000) || bVar3) {
if (mWork.chase.field_0x70) {
mWork.chase.field_0x48 = 0.05f;
}
mWork.chase.field_0x70 = false;
f32 tmp = 0.2f;
mWork.chase.field_0x48 += (1.0f - mWork.chase.field_0x48) * tmp;
} else {
mWork.chase.field_0x70 = true;
if (mFakeAngleSys.field_0x0 != 0) {
mWork.chase.field_0x48 = 0.0f;
} else if (mPadInfo.mMainStick.mLastPosY >= 0.0f) {
f32 tmp = dCamMath::rationalBezierRatio(mPadInfo.mMainStick.mLastPosX, val23);
mWork.chase.field_0x48 = 1.0f - (1.0f - val24 + val24 * cSAngle(tmp * 180.0f).Cos());
} else {
f32 tmp = dCamMath::rationalBezierRatio(mPadInfo.mMainStick.mLastPosX, val23 * 2.0f);
mWork.chase.field_0x48 = 1.0f - (1.0f - val24 + val24 * cSAngle(tmp * 180.0f).Cos());
}
mWork.chase.field_0x48 *= mPadInfo.mMainStick.mLastValue;
mWork.chase.field_0x48 *= val22;
if (check_owner_action(mPadID, 0x2000008)) {
if (mWork.chase.field_0x14 == 0) {
if (check_owner_action(mPadID, 8)) {
mWork.chase.field_0x14 = 1;
} else if (player_angle_delta > cSAngle::_270 && player_angle_delta < cSAngle::_90) {
mWork.chase.field_0x14 = 1;
} else {
mWork.chase.field_0x14 = -1;
}
} else if (mWork.chase.field_0x14 < 0) {
mWork.chase.field_0x14--;
} else if (mWork.chase.field_0x14 < 30) {
mWork.chase.field_0x48 = mWork.chase.field_0x14 / 30.0f * 0.5f;
mWork.chase.field_0x14++;
} else {
mWork.chase.field_0x48 = 0.5f;
}
} else {
mWork.chase.field_0x14 = 0;
}
}
cSAngle ang3;
f32 dVar39 = mWork.chase.field_0x48 * globe.V().Cos();
if (chkFlag(0x80000)) {
cXyz vec5 = field_0x90;
cSGlobe globe = vec5 - field_0x5c.mCenter;
ang3 = globe.U();
dVar39 = sAngleX(field_0x9c).Cos() * 0.3f + 0.35f;
} else if (mWork.chase.field_0x90) {
ang3 = player_direction.Inv();
dVar39 = mCamSetup.WaitRollSpeed();
} else if (bVar8) {
ang3 = field_0x5c.mDirection.U();
} else if (bVar3) {
ang3 = player_direction.Inv();
} else if (chkFlag(0x100000) || bVar6) {
if (player->checkChainBlockPushPull()) {
cSGlobe globe = field_0x5c.mCenter - attentionPos(player->getChainGrabActor());
ang3 = globe.U();
} else if ((mIsWolf != 1 || mCurMode != 1) && !mCamParam.Flag(param_0, 0x100)) {
ang3 = player_direction.Inv();
} else {
ang3 = mWork.chase.field_0x96;
}
} else {
ang3 = player_direction.Inv();
}
f32 last_pos_x = mPadInfo.mCStick.mLastPosX;
std::fabsf(last_pos_x);
std::fabsf(mPadInfo.mCStick.mLastPosY);
mWork.chase.field_0x93 = false;
if (!mCamParam.Flag(param_0, 0x40) && std::fabsf(last_pos_x) > 0.05f) {
mWork.chase.field_0xac += (dCamMath::rationalBezierRatio(last_pos_x, 0.5f) * 8.0f - mWork.chase.field_0xac) * mWork.chase.field_0x4c;
ang3 = globe.U() + cSAngle(mWork.chase.field_0xac);
dVar39 = std::fabsf(last_pos_x) - 0.05f;
if (mCamSetup.CheckFlag(0x1000) && mFakeAngleSys.field_0x0 == 0) {
setUSOAngle();
}
if (mCamSetup.CheckFlag2(0x40)) {
mWork.chase.field_0x93 = true;
mWork.chase.field_0x9a = ang3;
} else if (chkFlag(0x100000)) {
mWork.chase.field_0x93 = true;
mWork.chase.field_0x9a = ang3;
}
clrFlag(0x20000);
} else if (check_owner_action1(mPadID, 0x2010000) && mCurMode == 0) {
mWork.chase.field_0x9a = mDirection.U().Val();
mWork.chase.field_0x93 = true;
} else if (mIsWolf == 1 && isPlayerCharging(mPadID)) {
mWork.chase.field_0x9a = mDirection.U().Val();
mWork.chase.field_0x93 = true;
} else {
mWork.chase.field_0xac = 0.0f;
}
if (check_owner_action1(mPadID, 0x1000000) || mWork.chase.field_0x91) {
mWork.chase.field_0x9a = mDirection.U().Val();
mWork.chase.field_0x93 = true;
}
if (mWork.chase.field_0x93) {
field_0x5c.mDirection.U(mWork.chase.field_0x9a);
} else {
field_0x5c.mDirection.U(globe.U() + (ang3 - globe.U()) * dVar39);
}
cSAngle ang4;
if (bVar1 && !bVar7) {
mWork.chase.field_0x50 = charge_latitude;
if (mWork.chase.field_0x1a < 14) {
mWork.chase.field_0x78 = dCamMath::rationalBezierRatio(mWork.chase.field_0x1a / 14.0f, charge_b_ratio);
setFlag(0x4000000);
mWork.chase.field_0x1a++;
} else {
if (player->checkCutLargeTurnState()) {
mWork.chase.field_0x92 = true;
}
mWork.chase.field_0x78 = 1.0f;
}
} else if (mWork.chase.field_0x1a >= 14 && mWork.chase.field_0x1a < 34) {
mWork.chase.field_0x50 = charge_latitude;
mWork.chase.field_0x1a++;
mWork.chase.field_0x78 = 1.0f;
} else {
if (mWork.chase.field_0x1a != 0) {
mWork.chase.field_0x78 = 0.0f;
}
mWork.chase.field_0x1a = 0;
if (mCurMode == 1) {
f32 tmp = val12 + (val13 - val12) * mWork.chase.field_0xa4;
mWork.chase.field_0x78 = 0.5f;
mWork.chase.field_0x50 += (tmp - mWork.chase.field_0x50) * mWork.chase.field_0x48;
} else {
check_owner_action1(mPadID, 0x800000);
if (check_owner_action1(mPadID, 0x1000000) || mWork.chase.field_0x73) {
mWork.chase.field_0x78 = 0.75f;
mWork.chase.field_0x50 = val12;
} else if (chkFlag(0x10000)) {
mWork.chase.field_0x50 += (val12 - mWork.chase.field_0x50) * mWork.chase.field_0x20;
mWork.chase.field_0x78 = val16;
} else if (chkFlag(0x80000) || bVar8 || bVar9) {
mWork.chase.field_0x78 = 0.0f;
mWork.chase.field_0x50 = field_0x5c.mDirection.V().Degree();
} else if ((!bVar10 && !bVar11 && (!bVar2 || mCurMode != 0 || field_0x940 != 0)) || bVar12) {
f32 tmp = val12 + (val13 - val12) * mWork.chase.field_0xa4;
tmp += field_0x1b0.Degree();
mWork.chase.field_0x50 += (tmp - mWork.chase.field_0x50) * val16;
mWork.chase.field_0x78 += (JumpCushion - mWork.chase.field_0x78) * 0.05f;
} else if (bVar2) {
mWork.chase.field_0x50 = globe.V().Degree();
mWork.chase.field_0x78 = 0.95f;
} else if (isPlayerFlying(player)) {
if (mWork.chase.field_0x30 < positionOf(mpPlayerActor).y) {
mWork.chase.field_0x78 = dCamMath::rationalBezierRatio(mWork.chase.field_0x20, val15);
} else {
mWork.chase.field_0x78 += (0.75f - mWork.chase.field_0x78) * 0.15f;
}
mWork.chase.field_0x50 = globe.V().Degree();
} else {
mWork.chase.field_0x50 = globe.V().Degree();
mWork.chase.field_0x78 = dCamMath::rationalBezierRatio(mWork.chase.field_0x20, val15);
if (mWork.chase.field_0x91) {
ang1.Val(-50.0f);
mWork.chase.field_0x78 = 0.75f;
}
}
}
}
if (mWork.chase.field_0x1a == 0) {
mWork.chase.field_0x92 = false;
}
mWork.chase.field_0x30 = positionOf(mpPlayerActor).y;
ang4.Val(mWork.chase.field_0x50);
if (ang4 < ang1) {
ang4.Val(ang1);
} else if (ang4 > ang2) {
ang4.Val(ang2);
}
if (mWork.chase.field_0x1c != 0) {
mWork.chase.field_0x78 = dVar52;
}
field_0x5c.mDirection.V(field_0x5c.mDirection.V() + (ang4 - field_0x5c.mDirection.V()) * mWork.chase.field_0x78);
f32 fVar55 = globe.R();
if (mWork.chase.field_0x1c != 0) {
val11 = 1.0f;
}
mWork.chase.field_0x28 += (val8 - mWork.chase.field_0x28) * val11;
mWork.chase.field_0x2c += (val7 - mWork.chase.field_0x2c) * val11;
bool bVar6a = false;
bool bVar2a = false;
if (bVar11 && !check_owner_action(mPadID, 0x100000)) {
fVar55 = field_0x5c.mDirection.R() + (fVar55 - field_0x5c.mDirection.R()) * 0.4f;
if (!bVar34 && fVar55 > val7 * 1.5f) {
fVar55 = val7 * 1.5f;
}
} else if (fVar55 < mWork.chase.field_0x28) {
fVar55 = mWork.chase.field_0x28;
bVar6a = true;
} else if (fVar55 > mWork.chase.field_0x2c) {
fVar55 = mWork.chase.field_0x2c;
bVar2a = true;
}
if (bVar10) {
mWork.chase.field_0x74 += (mWork.chase.field_0x20 - mWork.chase.field_0x74) * 0.01f;
} else if (bVar11) {
mWork.chase.field_0x74 += (mWork.chase.field_0x20 - mWork.chase.field_0x74) * 0.01f;
} else if (mWork.chase.field_0x1c != 0) {
mWork.chase.field_0x74 = dVar52;
} else if (bVar6a) {
mWork.chase.field_0x74 += (val10 - mWork.chase.field_0x74) * 0.01f;
} else if (bVar2a) {
mWork.chase.field_0x74 += (val10 - mWork.chase.field_0x74) * 0.01f;
} else {
mWork.chase.field_0x74 = 1.0f;
}
field_0x5c.mDirection.R();
field_0x5c.mDirection.R(field_0x5c.mDirection.R() + (fVar55 - field_0x5c.mDirection.R()) * mWork.chase.field_0x74);
mWork.chase.field_0x64 = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mEye = mWork.chase.field_0x64;
if (mWork.chase.field_0x1c != 0) {
mWork.chase.field_0x80 = dVar52;
} else {
mWork.chase.field_0x80 += (val21 - mWork.chase.field_0x80) * 0.01f;
}
field_0x5c.mFovy += ((val17 + (val18 - val17) * mWork.chase.field_0xa4) - field_0x5c.mFovy) * mWork.chase.field_0x80;
if (mWork.chase.field_0x1c != 0) {
mWork.chase.field_0x1c--;
}
return 1;
}
/* 8016C384-8016E410 166CC4 208C+00 1/0 0/0 0/0 .text lockonCamera__9dCamera_cFl */
// NONMATCHING this is an absolute mess because too many things are being inlined
bool dCamera_c::lockonCamera(s32 param_0) {
f32 lockon_change_cushion = mCamSetup.LockonChangeCushion();
cSAngle charge_latitude = cSAngle(mCamSetup.ChargeLatitude());
f32 charge_b_ratio = mCamSetup.ChargeBRatio();
int lockon_change_timer = mCamSetup.LockonChangeTimer();
f32 val1 = mCamParam.Val(param_0, 1);
f32 val5 = mCamParam.Val(param_0, 5);
f32 val6 = mCamParam.Val(param_0, 6);
f32 val25 = mCamParam.Val(param_0, 25);
f32 val26 = mCamParam.Val(param_0, 26);
f32 val4 = mCamParam.Val(param_0, 4);
f32 val13 = mCamParam.Val(param_0, 13);
f32 val15 = mCamParam.Val(param_0, 15);
f32 val16 = mCamParam.Val(param_0, 16);
f32 val27 = mCamParam.Val(param_0, 27);
f32 val22 = mCamParam.Val(param_0, 22);
f32 val23 = mCamParam.Val(param_0, 23);
f32 val24 = mCamParam.Val(param_0, 24);
f32 val10 = mCamParam.Val(param_0, 10);
f32 val11 = mCamParam.Val(param_0, 11);
f32 val20 = mCamParam.Val(param_0, 20);
f32 val21 = mCamParam.Val(param_0, 21);
dAttention_c* attention = dComIfGp_getAttention();
daAlink_c* player = (daAlink_c*)mpPlayerActor;
if (dComIfGp_evmng_cameraPlay()) {
fopAc_ac_c* target = getEvActor("Target");
if (target != NULL) {
mpLockonTarget = target;
}
}
if (mCurCamStyleTimer == 0) {
if (field_0x110.field_0x8.field_0x1e <= 0) {
field_0x5c.mDirection = mDirection;
field_0x5c.mCenter = mCenter;
field_0x5c.mEye = mEye;
}
mWork.lockon.field_0x0 = 'LOCK';
mWork.lockon.field_0xc = 0;
mWork.lockon.field_0x10 = 1.0f;
mWork.lockon.field_0x18 = false;
mWork.lockon.field_0x28 = false;
mWork.lockon.field_0x1c = field_0x5c.mCenter;
cXyz attention_pos = attentionPos(mpPlayerActor);
mWork.lockon.field_0x34.Val(field_0x5c.mCenter - attention_pos);
if (field_0x5c.mCenter.x == attention_pos.x && field_0x5c.mCenter.z == attention_pos.z) {
mWork.lockon.field_0x34.U(directionOf(mpPlayerActor));
}
mWork.lockon.field_0x58 = 0.0f;
mWork.lockon.field_0x54 = 0.0f;
mWork.lockon.field_0x5c = mCamSetup.Cushion4Base();
mWork.lockon.field_0x60 = 1.0f;
mWork.lockon.field_0x14 = 0;
mWork.lockon.field_0x29 = false;
mWork.lockon.field_0x2c = 0;
mWork.lockon.field_0x30 = 0;
mWork.lockon.field_0x40 = false;
mWork.lockon.field_0x44 = 0;
mWork.lockon.field_0x48 = field_0x5c.mDirection.R();
mWork.lockon.field_0x50 = field_0x5c.mDirection.V();
mWork.lockon.field_0x4c = 1.0f;
mWork.lockon.field_0x2a = false;
mWork.lockon.field_0x3c = fpcM_ERROR_PROCESS_ID_e;
if (player->checkCutHeadProc() && mpLockonTarget != NULL) {
mWork.lockon.field_0x3c = fopAcM_GetID(mpLockonTarget);
}
if (mpLockonTarget != NULL) {
if (fopAcM_GetName(mpLockonTarget) == PROC_Obj_Bemos
|| fopAcM_GetName(mpLockonTarget) == PROC_Obj_Lv6bemos2)
{
setUSOAngle();
}
} else if (mCamParam.Flag(param_0, 0x2000)) {
fopAc_ac_c* target = getParamTargetActor(mCurType);
if (target != NULL) {
mWork.lockon.field_0x3c = fopAcM_GetID(target);
}
}
if (mCurType == specialType[CAM_TYPE_LV7_BOSS]) {
cSAngle ang = -10.0f;
if (field_0x5c.mDirection.V() < ang) {
field_0x5c.mDirection.V(cSAngle(-10.0f));
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
}
}
} else {
field_0x158.field_0x0 = true;
}
if (player->checkCutHeadProc() && mWork.lockon.field_0x3c != fpcM_ERROR_PROCESS_ID_e) {
mpLockonTarget = fopAcM_SearchByID(mWork.lockon.field_0x3c);
if (mpLockonTarget != NULL) {
dComIfGp_getAttention()->keepLock(30);
} else {
dComIfGp_getAttention()->keepLock(0);
}
}
if (mpLockonTarget == NULL && mWork.lockon.field_0x3c != fpcM_ERROR_PROCESS_ID_e) {
mpLockonTarget = fopAcM_SearchByID(mWork.lockon.field_0x3c);
}
bool bVar1 = false;
if (check_owner_action(mPadID, 6)) {
lockon_change_timer = 5;
} else if (mCurType == specialType[CAM_TYPE_LV9_GZELDA_TRI]) {
lockon_change_timer = 60;
} else if (mCurType == specialType[CAM_TYPE_TEPPEI_HOOK]) {
lockon_change_timer = 40;
}
if (mBG.field_0xc0.field_0x1) {
dComIfG_Bgsp().MoveBgMatrixCrrPos(mBG.field_0x5c.field_0x4, true,
&mWork.lockon.field_0x1c, NULL, NULL);
}
if (player->checkCopyRodThrowAfter()) {
mWork.lockon.field_0x28 = true;
} else if (!attention->LockonTruth() && check_owner_action(mPadID, 0x400000)) {
mWork.lockon.field_0x28 = true;
} else {
mWork.lockon.field_0x28 = false;
}
if (mWork.lockon.field_0x28) {
if (chkFlag(0x80080)) {
mWork.lockon.field_0x48 = cXyz(field_0x90 - field_0x5c.mCenter).abs();
val11 = mWork.lockon.field_0x48;
}
val10 = mWork.lockon.field_0x48;
if (val23 < 40.0f) {
val23 = 20.0f;
}
if (val24 < 20.0f) {
val24 = 20.0f;
}
val13 = 0.75f;
val15 = mWork.lockon.field_0x50.Degree();
val16 = 20.0f;
val27 = 0.1f;
val22 = 0.4f;
}
if (mpLockonTarget != NULL && mLockOnActorID != fpcM_ERROR_PROCESS_ID_e
&& fopAcM_GetName(mpLockonTarget) != PROC_E_HZ)
{
val15 = 60.0f;
val16 = 20.0f;
val26 = -20.0f;
}
if (mpLockonTarget != NULL) {
if (fopAcM_GetName(mpLockonTarget) == PROC_COW) {
val22 = 0.8f;
val27 = 0.8f;
val23 = 5.0f;
val24 = 10.0f;
} else if (fopAcM_GetName(mpLockonTarget) == PROC_Obj_Cdoor) {
val23 = 15.0f;
val24 = 5.0f;
}
}
if (player->checkThrowDamage()) {
bVar1 = true;
val15 = -10.0f;
val16 = 0.0f;
val10 = 300.0f;
val11 = 250.0f;
val5 = 0.05f;
val6 = 0.1f;
}
if (!check_owner_action(mPadID, 0) && !check_owner_action1(mPadID, 0x1200000)) {
bVar1 = true;
}
if (dComIfGp_getAttention()->LockEdge()) {
mCurCamStyleTimer = 0;
field_0x160 = 0;
mWork.lockon.field_0x2a = false;
}
cSGlobe globe;
f32 lockon_release_distance = attention->LockonReleaseDistanse();
f32 fVar42;
if (mpLockonTarget != NULL) {
cXyz target_attention_pos = attentionPos(mpLockonTarget);
cXyz player_attention_pos = attentionPos(mpPlayerActor);
if (mCurMode == 6) {
target_attention_pos.x = positionOf(mpLockonTarget).x;
target_attention_pos.z = positionOf(mpLockonTarget).z;
}
if (check_owner_action(mPadID, 0x2000008)) {
cXyz vec(0.0f, 0.0f, -90.0f);
player_attention_pos += dCamMath::xyzRotateY(vec, directionOf(mpPlayerActor));
}
globe.Val(target_attention_pos - player_attention_pos);
globe.R(globe.R() + mpLockonTarget->attention_info.field_0xa);
fVar42 = globe.R() / lockon_release_distance;
if (fVar42 > 1.0f) {
fVar42 = 1.0f;
}
dCamMath::xyzHorizontalDistance(target_attention_pos, player_attention_pos);
} else {
globe.Val(mCamSetup.ParallelDist(), cSAngle::_0, directionOf(mpPlayerActor));
fVar42 = 1.0f;
}
cSAngle ang1 = globe.U();
cSAngle ang2 = rangef(val23, val24, fVar42);
if (player->checkHorseRide()) {
ang1.Val(directionOf(mpPlayerActor));
}
bool bVar2 = false;
check_owner_action(mPadID, 0x100);
if (check_owner_action(mPadID, 0x2000008)) {
bVar2 = true;
}
if (player->checkMagneBootsOn() && cBgW_CheckBWall(player->getMagneBootsTopVec()->y)) {
bVar2 = true;
}
f32 fVar14;
if (mCurCamStyleTimer < lockon_change_timer && !mWork.lockon.field_0x2a) {
fVar14 = dCamMath::rationalBezierRatio((f32)mCurCamStyleTimer / lockon_change_timer, 0.5f);
ang2 *= fVar14;
} else if (mCurCamStyleTimer >= lockon_change_timer) {
mWork.lockon.field_0x2a = true;
fVar14 = 1.0f;
}
cSAngle ang3(field_0x5c.mDirection.U().Inv() - ang1);
if (mCurCamStyleTimer != 0 && mCurCamStyleTimer < lockon_change_timer) {
if (mWork.lockon.field_0x2c == 0) {
ang1 -= ang2;
ang3 = -ang3;
} else {
ang1 += ang2;
}
} else if (ang3 < cSAngle::_0) {
mWork.lockon.field_0x2c = 0;
ang1 -= ang2;
ang3 = -ang3;
} else {
mWork.lockon.field_0x2c = 1;
ang1 += ang2;
}
cXyz attention_pos = attentionPos(mpPlayerActor);
bool bVar4 = false;
if (chkFlag(0x80080)) {
cXyz attention_pos = attentionPos(mpPlayerActor);
if (!pointInSight(&attention_pos)) {
if (mWork.lockon.field_0x14 == 0) {
mWork.lockon.field_0x30 = mWork.lockon.field_0x2c == 1 ? 0 : 1;
}
bVar4 = true;
mWork.lockon.field_0x14 = 30;
}
}
if (mWork.lockon.field_0x14 != 0) {
mWork.lockon.field_0x14--;
if (mWork.lockon.field_0x14 == 0 && mPadInfo.mMainStick.mLastValue <= 0.1f) {
mWork.lockon.field_0x14 = 1;
}
bVar4 = true;
}
f32 fVar43 = 1.0f - std::fabsf(mPadInfo.mCStick.mLastPosY);
f32 fVar44;
if (bVar1) {
if (mCurCamStyleTimer == 0) {
mWork.lockon.field_0x5c = 0.01f;
}
fVar44 = 0.25f;
} else if (mBG.field_0xc0.field_0x44 == 0) {
fVar44 = mCamSetup.Cushion4Jump();
} else {
fVar44 = fVar14 * mCamSetup.Cushion4Base();
}
mWork.lockon.field_0x5c += (fVar44 - mWork.lockon.field_0x5c) * mCamSetup.CusCus();
mWork.lockon.field_0x1c.x = attention_pos.x;
mWork.lockon.field_0x1c.z = attention_pos.z;
f32 dVar37;
if (bVar4) {
dVar37 = rangef(val25, val26, fVar42) + 25.0f;
} else {
dVar37 = rangef(val25, val26, fVar42);
}
mWork.lockon.field_0x1c.y +=
((attention_pos.y + dVar37) - mWork.lockon.field_0x1c.y) * mWork.lockon.field_0x5c;
if (mCurCamStyleTimer == 0) {
cXyz vec = mWork.lockon.field_0x1c;
mWork.lockon.field_0x34.Val(field_0x5c.mCenter - vec);
if (field_0x5c.mCenter.x == vec.x && field_0x5c.mCenter.z == vec.z) {
mWork.lockon.field_0x34.U(directionOf(mpPlayerActor));
}
}
f32 fVar44a;
if (mpLockonTarget != NULL) {
f32 dVar28 = ang3.Cos();
f32 dVar37 = cSAngle(globe.V()).Cos();
if (dVar28 < 0.0f) {
dVar37 = -dVar37;
}
f32 tmp = std::fabs(dVar28) < std::fabs(dVar37) ? dVar28 : dVar37;
f32 tmp2 = val4 < 0.5f ? val4 : 1.0f - val4;
fVar44a = val4 * globe.R() - val1 * (tmp * tmp2) * globe.R();
} else {
fVar44a = globe.R() * 0.5f;
fVar44a += fVar44a * ang3.Cos();
}
cSAngle ang4 = globe.U();
mWork.lockon.field_0x58 += (val6 - mWork.lockon.field_0x58) * mCamSetup.CusCus();
mWork.lockon.field_0x54 += (val5 - mWork.lockon.field_0x54) * mCamSetup.CusCus();
cSAngle u, v;
cSAngle ang5 = globe.V() - mWork.lockon.field_0x34.V();
f32 r;
if (bVar4) {
r = mWork.lockon.field_0x34.R();
r *= std::fabsf(ang5.Cos()) * 0.75f;
u.Val(mWork.lockon.field_0x34.U() + (ang4 - mWork.lockon.field_0x34.U()) * mWork.lockon.field_0x58);
v.Val(mWork.lockon.field_0x34.V() + ang5 * 0.05f);
} else {
r = mWork.lockon.field_0x34.R();
r += (fVar44a - r) * mWork.lockon.field_0x54 * std::fabsf(ang5.Cos());
u.Val(mWork.lockon.field_0x34.U() + (ang4 - mWork.lockon.field_0x34.U()) * mWork.lockon.field_0x58);
v.Val(mWork.lockon.field_0x34.V() + ang5 * mWork.lockon.field_0x58);
}
mWork.lockon.field_0x34.Val(r, v, u);
field_0x5c.mCenter = mWork.lockon.field_0x1c + mWork.lockon.field_0x34.Xyz();
dBgS_CamLinChk lin_chk;
if (mpLockonTarget != NULL && lineBGCheck(&attention_pos, &field_0x5c.mCenter, &lin_chk, 0x40b7)) {
cXyz target_attention_pos = attentionPos(mpLockonTarget);
dBgS_CamLinChk lin_chk2;
int iVar5 = 0;
if (lineBGCheckBoth(&attention_pos, &field_0x5c.mEye, &lin_chk2, 0x40b7)) {
iVar5 |= 1;
} else if (lineBGCheckBoth(&target_attention_pos, &field_0x5c.mEye, &lin_chk2, 0x40b7)) {
iVar5 |= 2;
}
if (iVar5 != 0) {
cM3dGPla plane;
dComIfG_Bgsp().GetTriPla(lin_chk, &plane);
field_0x5c.mCenter = lin_chk.GetCross();
field_0x5c.mCenter += *plane.GetNP() * 5.0f;
if (fopAcM_GetName(mpLockonTarget) != PROC_E_HZ) {
ForceLockOff(mLockOnActorID);
}
}
}
cSGlobe globe2 = field_0x5c.mEye - field_0x5c.mCenter;
cSAngle u2 = field_0x5c.mDirection.U();
cSAngle v2 = field_0x5c.mDirection.V();
f32 r2 = field_0x5c.mDirection.R();
cSAngle ang6 = ang3 - ang2;
f32 curve_weight = mCamSetup.CurveWeight();
f32 fVar47 = mPadInfo.mCStick.mLastPosX;
if (mCamParam.Flag(param_0, 0x40)) {
fVar47 = 0.0f;
}
if (mPadInfo.mCStick.mLastPosY > mCamSetup.mCStick.SwTHH()) {
if (field_0x1fc != 1) {
mWork.lockon.field_0x40 = false;
mWork.lockon.field_0x4c = 0.0f;
}
field_0x1fc = 1;
} else {
field_0x1fc = 0;
}
bool bVar3 = false;
f32 fVar31;
if (std::fabsf(fVar47) > 0.05f) {
cSAngle ang = globe2.U() + cSAngle(dCamMath::rationalBezierRatio(fVar47, 0.5f) * 7.5f);
fVar31 = std::fabsf(fVar47) - 0.05f;
mWork.lockon.field_0x42 = ang;
mWork.lockon.field_0x4c = 0.0f;
bVar3 = true;
} else if (mCamParam.Flag(param_0, 0x100)) {
if (mCurMode == 0) {
mWork.lockon.field_0x40 = true;
cSAngle ang = globe2.U() - directionOf(mpPlayerActor);
mWork.lockon.field_0x42 = field_0x5c.mDirection.U() +
(globe2.U() - field_0x5c.mDirection.U()) * val22 * ang.Sin();
}
if (mCurMode != 2) {
ang1.Val(directionOf(mpPlayerActor));
}
} else if (mWork.lockon.field_0x40) {
fVar31 = 1.0f;
mWork.lockon.field_0x4c = 1.0f;
} else {
mWork.lockon.field_0x40 = false;
mWork.lockon.field_0x4c += (1.0f - mWork.lockon.field_0x4c) * 0.01f;
}
if (mWork.lockon.field_0x40 || bVar3) {
u2 = globe2.U() + (mWork.lockon.field_0x42 - globe2.U()) * fVar31;
} else if (bVar4) {
cSAngle ang;
if (mWork.lockon.field_0x30 == 1) {
ang.Val(15.0f);
} else {
ang.Val(-15.0f);
}
u2 += ((globe.U().Inv() + ang) - u2) * 0.05f;
} else if (check_owner_action1(mPadID, 0x1200000)) {
u2 = globe2.U();
} else {
f32 fVar45;
if (mpLockonTarget == NULL) {
fVar45 = fVar14 * 0.15f;
} else if (ang3 < ang2) {
f32 ratio = dCamMath::rationalBezierRatio(-((f32)ang6.Val() / ang2.Val()), curve_weight);
fVar45 = val27 * ratio;
} else {
cSAngle ang = ang2 + (cSAngle::_180 - ang2) * 0.5f;
if (ang6 > ang) {
ang6 = cSAngle::_180 - ang6;
ang = cSAngle::_180 - ang;
}
f32 ratio = dCamMath::rationalBezierRatio((f32)ang6.Val() / ang.Val(), curve_weight);
fVar45 = val27 + (val22 - val27) * ratio;
}
if (!mWork.lockon.field_0x2a) {
int iVar27 = lockon_change_timer >> 1;
if (mCurCamStyleTimer < iVar27) {
fVar45 = lockon_change_cushion * ((f32)mCurCamStyleTimer / iVar27);
} else {
fVar45 = fVar45 * ((f32)(mCurCamStyleTimer - iVar27) / iVar27)
+ lockon_change_cushion * (1.0f - (f32)(mCurCamStyleTimer - iVar27) / iVar27);
}
}
ang6 = ang1.Inv() - field_0x5c.mDirection.U();
std::fabsf(ang6.Degree());
u2 += ang6 * fVar45 * mWork.lockon.field_0x4c;
}
if (bVar2) {
cSAngle ang7 = ang1.Inv();
cSAngle ang8 = ang7 - u2;
if (ang8 < cSAngle::_270) {
u2 = ang7 - cSAngle::_270;
} else if (ang8 > cSAngle::_90) {
u2 = ang7 - cSAngle::_90;
}
}
if (isPlayerCharging(mPadID)) {
if (mWork.lockon.field_0xc <= 20) {
f32 tmp = mWork.lockon.field_0xc / 20.0f;
v2 += (charge_latitude - v2) * dCamMath::rationalBezierRatio(tmp, charge_b_ratio);
setFlag(0x4000000);
mWork.lockon.field_0xc++;
} else {
v2 = charge_latitude;
}
} else {
mWork.lockon.field_0xc = 0;
if (!mBG.field_0xc0.field_0x44 && !bVar1) {
v2 += (globe2.V() - v2) * fVar43 * std::fabsf(field_0x5c.mDirection.V().Cos());
} else {
cSAngle ang7 = mWork.lockon.field_0x34.V();
ang7 *= cSAngle(mWork.lockon.field_0x34.U() - field_0x5c.mDirection.U()).Cos();
ang7 *= val13;
cSAngle ang8 = rangef(val15, val16, fVar42);
ang8 *= 1.0f - val13;
v2 += ((ang7 + ang8) - v2) * 0.15f * fVar14;
}
s16 val = v2.Val();
if (!mCamSetup.CheckLatitudeRange(&val)) {
v2.Val(val);
}
}
if (bVar4) {
r2 += (280.0f - r2) * 0.05f;
} else {
f32 radius = globe2.R();
if (defaultRadius(val10, val11, &radius)) {
r2 = radius + (rangef(val10, val11, fVar42) - radius) * 0.02f;
} else {
r2 += (radius - r2) * 0.4f * fVar14;
}
}
field_0x5c.mDirection.Val(r2, v2, u2);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += (rangef(val20, val21, fVar42) - field_0x5c.mFovy) * 0.15f * fVar14;
if (mpLockonTarget != NULL) {
setFlag(0x2000);
field_0x188 = mpLockonTarget;
if (attention->GetLockonCount() >= 2 && mCamParam.Flag(param_0, 0x1000)) {
field_0x18c = attention->LockonTarget(1);
}
}
if (player->checkHorseRide()) {
daHorse_c* horse = dComIfGp_getHorseActor();
if (horse != NULL && horse->getLashDashStart()) {
onHorseDush();
mWork.lockon.field_0x44 = 16;
} else if (mWork.lockon.field_0x44 != 0) {
mWork.lockon.field_0x44--;
}
}
return true;
}
/* 8016E448-8016E4A4 168D88 005C+00 1/1 0/0 0/0 .text getMsgCmdSpeaker__9dCamera_cFv */
fopAc_ac_c* dCamera_c::getMsgCmdSpeaker() {
dComIfG_MesgCamInfo_c* info = dComIfGp_getMesgCameraInfo();
fopAc_ac_c* actor = NULL;
if (info->mBasicID >= 1 && info->mBasicID <= 10) {
int idx = info->mBasicID - 1;
actor = info->mActor[idx];
}
if (info->mID >= 1 && info->mID <= 10) {
int idx = info->mID - 1;
actor = info->mActor[idx];
}
return actor;
}
/* 8016E4A4-8016E4F4 168DE4 0050+00 1/1 0/0 0/0 .text getMsgCmdCut__9dCamera_cFl */
s32 dCamera_c::getMsgCmdCut(s32 param_0) {
dComIfG_MesgCamInfo_c* info = dComIfGp_getMesgCameraInfo();
if (!(info->mBasicID >= 1 && info->mBasicID <= 10) && info->mBasicID > 0) {
param_0 = info->mBasicID;
}
if (!(info->mID >= 1 && info->mID <= 10) && info->mID > 0) {
param_0 = info->mID;
}
return param_0;
}
/* 8016E4F4-80174E18 168E34 6924+00 2/0 0/0 0/0 .text talktoCamera__9dCamera_cFl */
bool dCamera_c::talktoCamera(s32 param_0) {
f32 val0 = mCamParam.Val(param_0, 0);
f32 val2 = mCamParam.Val(param_0, 2);
f32 val1 = mCamParam.Val(param_0, 1);
f32 val3 = mCamParam.Val(param_0, 3);
f32 val7 = mCamParam.Val(param_0, 7);
f32 val8 = mCamParam.Val(param_0, 8);
f32 val16 = mCamParam.Val(param_0, 16);
f32 val15 = mCamParam.Val(param_0, 15);
f32 val12 = mCamParam.Val(param_0, 12);
f32 val6 = mCamParam.Val(param_0, 6);
f32 val23 = mCamParam.Val(param_0, 23);
f32 val24 = mCamParam.Val(param_0, 24);
f32 val17 = mCamParam.Val(param_0, 17);
f32 val18 = mCamParam.Val(param_0, 18);
f32 fVar21 = 300.0f;
fopAc_ac_c* ride_actor = NULL;
bool uVar18 = true;
daAlink_c* player = (daAlink_c*)mpPlayerActor;
if (mCurCamStyleTimer == 0) {
mWork.talk.field_0x0 = 'TALK';
mWork.talk.field_0x44 = 0;
mWork.talk.field_0x38 = -1;
mWork.talk.field_0x48 = 20;
mWork.talk.field_0x3c = 0;
mWork.talk.field_0x40 = -1;
mWork.talk.field_0x5c = 999.9f;
mWork.talk.field_0x60 = 999.9f;
mWork.talk.field_0x7c = 1.0f;
mWork.talk.field_0xb4 = cXyz::Zero;
mWork.talk.field_0x89 = false;
mWork.talk.field_0x88 = false;
mWork.talk.field_0x8c = field_0x88;
field_0x88 &= ~8;
if (!dComIfGp_evmng_cameraPlay()) {
mWork.talk.field_0x84 = 0;
mWork.talk.field_0x86 = 0;
mWork.talk.field_0x54 = val7;
mWork.talk.field_0x64 = val8;
mWork.talk.field_0x68 = val17;
mWork.talk.field_0x58 = val17;
mWork.talk.field_0x6c = val18;
mWork.talk.field_0x70 = mpPlayerActor;
mWork.talk.field_0x74 = mpLockonTarget;
} else {
int val;
getEvIntData(&val, "Smoothless", 0);
mWork.talk.field_0x84 = val;
getEvIntData(&val, "Mode", 0);
mWork.talk.field_0x86 = val;
if (getEvFloatData(&mWork.talk.field_0x54, "Radius", val7)) {
getEvFloatData(&mWork.talk.field_0x64, "RadiusNear", mWork.talk.field_0x54);
} else {
getEvFloatData(&mWork.talk.field_0x64, "RadiusNear", val8);
}
getEvFloatData(&mWork.talk.field_0x5c, "Longitude", 999.9f);
if (getEvFloatData(&mWork.talk.field_0x68, "Fovy", val17)) {
getEvFloatData(&mWork.talk.field_0x6c, "FovyNear", mWork.talk.field_0x68);
} else {
getEvFloatData(&mWork.talk.field_0x6c, "FovyNear", val18);
}
mWork.talk.field_0x58 = mWork.talk.field_0x68;
getEvFloatData(&mWork.talk.field_0x60, "Latitude", 999.9f);
mWork.talk.field_0x70 = getEvActor("Listener", "@STARTER");
mWork.talk.field_0x74 = getEvActor("Speaker", "@TALKPARTNER");
}
mWork.talk.field_0x78 = mWork.talk.field_0x74;
mWork.talk.field_0x80 = val2;
}
fopAc_ac_c* speaker;
fopAc_ac_c* listener;
fopAc_ac_c* msg_speaker = getMsgCmdSpeaker();
if (msg_speaker != NULL) {
listener = mWork.talk.field_0x70;
speaker = msg_speaker;
} else if (dComIfGp_evmng_cameraPlay()) {
listener = mWork.talk.field_0x70;
speaker = mWork.talk.field_0x74;
} else {
listener = mpPlayerActor;
speaker = mpLockonTarget;
}
if (listener == speaker) {
speaker = NULL;
}
if (listener == NULL || speaker == NULL) {
field_0x158.field_0x0 = true;
return false;
}
if (mWork.talk.field_0x78 != speaker) {
mCurCamStyleTimer = 0;
field_0x158.field_0x0 = false;
mWork.talk.field_0x44 = 0;
mWork.talk.field_0x78 = speaker;
}
bool bVar3 = false;
if (fopAcM_GetName(speaker) == PROC_NI || fopAcM_GetName(speaker) == PROC_BD
|| fopAcM_GetName(speaker) == PROC_SQ || fopAcM_GetName(speaker) == PROC_FR
|| fopAcM_GetName(speaker) == PROC_DO || fopAcM_GetName(speaker) == PROC_NPC_NE)
{
bVar3 = true;
mWork.talk.field_0x54 = 260.0f;
mWork.talk.field_0x64 = 210.0f;
mWork.talk.field_0x68 = 45.0f;
mWork.talk.field_0x58 = 45.0f;
mWork.talk.field_0x6c = 48.0f;
val24 = 80.0f;
val23 = 40.0f;
}
if (fopAcM_GetName(speaker) == PROC_Tag_Mwait && ((daTagMwait_c*)speaker)->checkEndMessage()) {
mWork.talk.field_0x3c = 35;
speaker = daPy_py_c::getMidnaActor();
}
if (mWork.talk.field_0x86 != 0) {
mWork.talk.field_0x3c = mWork.talk.field_0x86;
}
mWork.talk.field_0x3c = getMsgCmdCut(mWork.talk.field_0x3c);
if (mWork.talk.field_0x3c != mWork.talk.field_0x40) {
mWork.talk.field_0x44 = 0;
mWork.talk.field_0x40 = mWork.talk.field_0x3c;
}
cSAngle stack_134c = val16;
cSAngle stack_1350 = val15;
cSAngle stack_1354 = val24;
cSAngle stack_1358 = val23;
if (mCurCamStyleTimer == 0) {
cSAngle stack_135c;
cXyz stack_13c;
cSGlobe stack_12c0 = positionOf(speaker) - positionOf(listener);
cXyz stack_148;
cXyz stack_154;
if (mCamParam.Flag(param_0, 0x400) || player->checkCanoeRide()
|| player->checkHorseRide() || check_owner_action(mPadID, 0x100000))
{
stack_148 = attentionPos(listener);
stack_154 = attentionPos(speaker);
if (player->checkCanoeRide() && listener == mpPlayerActor) {
stack_148.y += 40.0f;
}
} else {
stack_13c = attentionPos(listener) - positionOf(listener);
stack_135c.Val(stack_12c0.U() - directionOf(listener));
stack_148 = positionOf(listener) + dCamMath::xyzRotateY(stack_13c, stack_135c);
stack_13c = attentionPos(speaker) - positionOf(speaker);
stack_135c.Val(stack_12c0.U().Inv() - directionOf(speaker));
stack_154 = positionOf(speaker) + dCamMath::xyzRotateY(stack_13c, stack_135c);
}
if (mIsWolf == 1) {
if (listener == mpPlayerActor) {
stack_148.y += 80.0f;
}
if (speaker == mpPlayerActor) {
stack_154.y += 80.0f;
}
}
mWork.talk.field_0x28 = field_0x5c.mDirection;
mWork.talk.field_0xb4 = stack_148 - stack_154;
mWork.talk.field_0x30.Val(mWork.talk.field_0xb4);
mWork.talk.field_0xb4.normalize();
stack_148 += mWork.talk.field_0xb4 * listener->attention_info.field_0xa;
stack_154 -= mWork.talk.field_0xb4 * speaker->attention_info.field_0xa;
if (mWork.talk.field_0x30.R() < 88.0f) {
mWork.talk.field_0x30.R(88.0f);
}
f32 dVar25 = dCamMath::xyzHorizontalDistance(stack_148, stack_154);
f32 fVar1 = dVar25 - 88.0f;
fVar21 -= 88.0f;
mWork.talk.field_0x7c = fVar1 > fVar21 ? 1.0f : fVar1 / fVar21;
mWork.talk.field_0x80 = val3 + (val2 - val3) * mWork.talk.field_0x7c;
cXyz stack_160(val0, mWork.talk.field_0x80, val1);
f32 dVar21 = mWork.talk.field_0x64 + (mWork.talk.field_0x54 - mWork.talk.field_0x64) * mWork.talk.field_0x7c;
if (dVar21 < dVar25) {
dVar21 = dVar25;
}
mWork.talk.field_0x28.R(dVar21);
if (mWork.talk.field_0x84 != 0) {
mWork.talk.field_0x48 = 1;
} else {
mWork.talk.field_0x48 = (int)(JMAFastSqrt(std::fabsf(field_0x5c.mDirection.R() - mWork.talk.field_0x28.R())) / 2.0f);
if (mWork.talk.field_0x48 < 2) {
mWork.talk.field_0x48 = 2;
}
if (mWork.talk.field_0x48 > 22) {
mWork.talk.field_0x48 = 22;
}
mWork.talk.field_0x48 += 8;
}
cSAngle stack_1360;
cSAngle stack_1364;
if (mWork.talk.field_0x5c >= -180.0f && mWork.talk.field_0x5c <= 360.0f) {
stack_1360.Val(mWork.talk.field_0x5c);
stack_1364 = stack_1360 - mWork.talk.field_0x30.U();
mWork.talk.field_0x28.U(stack_1360);
} else if (fopAcM_GetName(speaker) == PROC_OBJ_KANBAN2
|| fopAcM_GetName(speaker) == PROC_TAG_KMSG
|| fopAcM_GetName(speaker) == PROC_KNOB20
|| fopAcM_GetName(speaker) == PROC_Obj_NamePlate) {
stack_1360.Val(directionOf(speaker));
stack_1364 = stack_1360 - mWork.talk.field_0x30.U();
mWork.talk.field_0x28.U(stack_1360);
} else {
stack_1360.Val(field_0x5c.mDirection.U());
stack_1364 = stack_1360 - mWork.talk.field_0x30.U();
if (stack_1364 > cSAngle::_90) {
stack_1364 = cSAngle::_90 - (stack_1364 - cSAngle::_90);
}
if (stack_1364 < cSAngle::_270) {
stack_1364 = cSAngle::_270 - (stack_1364 - cSAngle::_270);
}
if (stack_1364 > stack_1354) {
stack_1364 = stack_1354;
}
if (stack_1364 > cSAngle::_0 && stack_1364 < stack_1358) {
stack_1364 = stack_1358;
}
if (stack_1364 < -stack_1354) {
stack_1364 = -stack_1354;
}
if (stack_1364 < cSAngle::_0 && stack_1364 > -stack_1358) {
stack_1364 = -stack_1358;
}
mWork.talk.field_0x28.U(mWork.talk.field_0x30.U() + stack_1364);
}
{
cSAngle stack_1368 = mWork.talk.field_0x28.U();
cXyz stack_16c = stack_148;
cXyz stack_178 = stack_154;
cXyz stack_184 = stack_178 - stack_16c;
cSGlobe stack_12c8 = stack_184;
stack_184.normalize();
stack_16c -= stack_184 * listener->attention_info.field_0xa;
stack_178 += stack_184 * speaker->attention_info.field_0xa;
cXyz stack_190;
cXyz stack_19c = stack_178 - stack_16c;
if (lineBGCheck(&stack_16c, &stack_178, &stack_190, 0x40b7)) {
stack_178 = stack_190 - stack_19c.norm() * 10.0f;
stack_19c = stack_178 - stack_16c;
}
cXyz stack_1a8 = stack_16c + stack_19c * 0.5f;
cXyz stack_1b4 = stack_160;
cSAngle stack_136c = stack_1368 - stack_12c8.U();
if (stack_136c < cSAngle::_0) {
stack_1b4.x = -stack_1b4.x;
}
cSGlobe stack_12d0 = stack_1b4;
stack_12d0.U(stack_12c8.U() + stack_12d0.U());
stack_12c8.R(stack_12c8.R() * 0.5f * stack_136c.Cos() * 0.25f);
mWork.talk.field_0x4 = stack_1a8 + stack_12c8.Xyz() + stack_12d0.Xyz();
mWork.talk.field_0xc0 = stack_178;
}
cSAngle stack_1370;
if (mWork.talk.field_0x60 != 999.9f) {
stack_1370.Val(mWork.talk.field_0x60);
} else {
stack_1370 = mWork.talk.field_0x30.V() * (stack_1364.Cos() + 0.1f) * val6 + cSAngle(val12);
if (stack_1370 > stack_134c) {
stack_1370 = stack_134c;
}
if (stack_1370 < stack_1350) {
stack_1370 = stack_1350;
}
}
mWork.talk.field_0x28.V(stack_1370);
cSAngle stack_1374;
if (player->checkRide()) {
ride_actor = player->getRideActor();
}
if (mWork.talk.field_0x30.U() - mWork.talk.field_0x28.U() > cSAngle::_0) {
stack_1374 = cSAngle(10.0f);
} else {
stack_1374 = cSAngle(-10.0f);
}
mWork.talk.field_0x10 = mWork.talk.field_0x4 + mWork.talk.field_0x28.Xyz();
mWork.talk.field_0x58 = mWork.talk.field_0x6c + (mWork.talk.field_0x68 - mWork.talk.field_0x6c) * mWork.talk.field_0x7c;
bool bVar13 = false;
if (fopAcM_GetName(speaker) == PROC_MIDNA && field_0x194) {
mWork.talk.field_0x4 = attentionPos(speaker);
mWork.talk.field_0x4.y -= 35.0f;
f32 fVar36 = mWork.talk.field_0x30.U() - mWork.talk.field_0x28.U() > cSAngle::_0 ? -40.0f : 40.0f;
mWork.talk.field_0x28.U(cSAngle(fVar36) + directionOf(listener));
mWork.talk.field_0x28.V(cSAngle(10.0f));
mWork.talk.field_0x28.R(200.0f);
mWork.talk.field_0x10 = mWork.talk.field_0x4 + mWork.talk.field_0x28.Xyz();
mWork.talk.field_0x48 = 16;
mWork.talk.field_0x58 = 55.0f;
mWork.talk.field_0x88 = true;
bVar13 = true;
}
if (bVar3) {
mWork.talk.field_0x4.y = attentionPos(speaker).y - 10.0f;
}
if (mCamParam.Flag(param_0, 0x100)) {
mWork.talk.field_0x28.U(field_0x5c.mDirection.U());
}
cSAngle stack_1378;
int i;
bool bVar2 = false;
cXyz stack_1c0 = cXyz::Zero;
for (i = 0; i < 36; i++) {
stack_1378 = mWork.talk.field_0x28.U() - mWork.talk.field_0x30.U();
if (std::fabsf(stack_1378.Degree()) < 10.0f) {
mWork.talk.field_0x28.U(mWork.talk.field_0x28.U() + stack_1374);
} else {
if (!bVar13) {
f32 radius = radiusActorInSight(listener, speaker, &mWork.talk.field_0x4,
&mWork.talk.field_0x10, mWork.talk.field_0x58,
0, 0.1f);
if (radius > 0.0f) {
mWork.talk.field_0x28.R(mWork.talk.field_0x28.R() + radius);
mWork.talk.field_0x10 = mWork.talk.field_0x4 + mWork.talk.field_0x28.Xyz();
}
}
if (!lineBGCheck(&stack_148, &mWork.talk.field_0x10, mWork.talk.field_0x8c)
&& !lineBGCheck(&mWork.talk.field_0x4, &mWork.talk.field_0x10, mWork.talk.field_0x8c)
&& !lineCollisionCheck(stack_148, mWork.talk.field_0x10, listener, speaker, ride_actor))
{
if (!lineBGCheck(&stack_154, &mWork.talk.field_0x10, mWork.talk.field_0x8c)
&& !lineCollisionCheck(stack_154, mWork.talk.field_0x10, listener, speaker, ride_actor))
{
bVar2 = true;
break;
}
stack_1c0 = mWork.talk.field_0x10;
}
mWork.talk.field_0x28.U(mWork.talk.field_0x28.U() + stack_1374);
if (mWork.talk.field_0x60 != 999.9f) {
stack_1370.Val(mWork.talk.field_0x60);
} else {
stack_1370 = mWork.talk.field_0x30.V()
* (cSAngle(mWork.talk.field_0x30.U() - mWork.talk.field_0x28.U()).Cos() + 0.1f)
* val6 + cSAngle(val12);
if (stack_1370 > stack_134c) {
stack_1370 = stack_134c;
}
if (stack_1370 < stack_1350) {
stack_1370 = stack_1350;
}
}
mWork.talk.field_0x28.V(stack_1370);
if (!mWork.talk.field_0x88) {
mWork.talk.field_0x4 = relationalPos2(listener, speaker, &stack_160, 0.25f,
mWork.talk.field_0x28.U());
}
mWork.talk.field_0x10 = mWork.talk.field_0x4 + mWork.talk.field_0x28.Xyz();
}
}
if (!bVar2) {
stack_1c0.set(0.0f, 15.0f, -20.0f);
mWork.talk.field_0x4 = relationalPos(mpPlayerActor, &stack_1c0);
stack_1c0.set(60.0f, 70.0f, -200.0f);
mWork.talk.field_0x10 = relationalPos(mpPlayerActor, &stack_1c0);
mWork.talk.field_0x28.Val(mWork.talk.field_0x10 - mWork.talk.field_0x4);
}
mWork.talk.field_0xcc = stack_148;
mWork.talk.field_0xd8 = stack_154;
mWork.talk.field_0x4c = mWork.talk.field_0x48 * (mWork.talk.field_0x48 + 1) >> 1;
if (mWork.talk.field_0x38 == -1) {
if (mWork.talk.field_0x30.U() - mWork.talk.field_0x28.U() > cSAngle::_0) {
mWork.talk.field_0x38 = 0;
} else {
mWork.talk.field_0x38 = 1;
}
}
}
if ((fopAcM_GetName(speaker) == PROC_Tag_Mhint && ((daTagMhint_c*)speaker)->checkNoAttention())
|| (fopAcM_GetName(speaker) == PROC_Tag_Mstop && ((daTagMstop_c*)speaker)->checkNoAttention()))
{
bool bVar13 = false;
if (mIsWolf == 1 && check_owner_action(mPadID, 0x100000)) {
bVar13 = true;
}
if (mCurCamStyleTimer == 0) {
if (!bVar13) {
mWork.talk.field_0x28.U(cSAngle(15.0f) + directionOf(listener));
mWork.talk.field_0x28.V(cSAngle(5.0f));
mWork.talk.field_0x28.R(140.0f);
} else {
mWork.talk.field_0x28.U(cSAngle(30.0f) + directionOf(listener));
mWork.talk.field_0x28.V(cSAngle(25.0f));
mWork.talk.field_0x28.R(180.0f);
}
mWork.talk.field_0x10 = mWork.talk.field_0x4 + mWork.talk.field_0x28.Xyz();
mWork.talk.field_0x48 = 16;
mWork.talk.field_0x58 = 55.0f;
}
mWork.talk.field_0x4 = positionOf(listener);
if (!bVar13) {
mWork.talk.field_0x4.y += 110.0f;
} else {
mWork.talk.field_0x4.y += 10.0f;
}
}
cXyz stack_1cc = cXyz::Zero;
bool bVar13 = false;
if (is_player(listener) && mIsWolf == 1) {
cXyz stack_1d8(0.0f, 0.0f, 45.0f);
stack_1cc = dCamMath::xyzRotateY(stack_1d8, directionOf(listener));
bVar13 = true;
}
cXyz stack_1e4;
cXyz stack_1f0;
cXyz stack_1fc;
cXyz stack_208;
fopAc_ac_c* actor1;
fopAc_ac_c* actor2;
int iVar5 = mWork.talk.field_0x3c;
switch (iVar5) {
case 0:
break;
case 50:
mWork.talk.field_0x48 = 1;
mWork.talk.field_0x4c = 1.0f;
iVar5 = 0;
break;
case 20:
case 21:
case 62:
if (iVar5 != 20) {
actor1 = listener;
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (fopAcM_GetName(speaker) == PROC_NPC_KKRI) {
stack_1f0.y = attentionPos(speaker).y - 40.0f;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
} else {
actor1 = speaker;
stack_1e4 = talkEyePos(speaker);
stack_1f0 = talkEyePos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
}
field_0x5c.mCenter = stack_208;
if (mWork.talk.field_0x44 == 0) {
cXyz stack_214 = stack_1fc;
stack_214.y = stack_1e4.y;
cXyz stack_220 = stack_208;
stack_220.y = stack_1f0.y;
field_0x5c.mDirection.Val(stack_214 - stack_220);
if (iVar5 == 62) {
field_0x5c.mDirection.U(directionOf(speaker));
}
field_0x5c.mDirection.R(125.0f);
mWork.talk.field_0x1c.y = stack_1f0.y - 25.0f - stack_208.y;
field_0x158.field_0x0 = true;
}
field_0x5c.mCenter.y = stack_208.y + mWork.talk.field_0x1c.y;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = 60.0f;
hideActor(actor1);
break;
case 39:
case 40:
case 64:
if (iVar5 != 39) {
actor1 = speaker;
actor2 = listener;
} else {
actor1 = listener;
actor2 = speaker;
}
if (mWork.talk.field_0x44 == 0) {
if (iVar5 != 39) {
stack_1e4 = talkEyePos(actor2);
stack_1f0 = talkEyePos(actor1);
stack_1fc = talkBasePos(actor2);
stack_208 = talkBasePos(actor1);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
} else {
stack_1e4 = talkEyePos(actor2);
stack_1f0 = talkEyePos(actor1);
stack_1fc = talkBasePos(actor2);
stack_208 = talkBasePos(actor1);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
}
field_0x5c.mCenter = stack_208;
cXyz stack_22c = stack_1fc;
stack_22c.y = stack_1e4.y;
cXyz stack_238 = stack_208;
stack_238.y = stack_1f0.y;
field_0x5c.mDirection.Val(stack_22c - stack_238);
if (iVar5 == 64) {
field_0x5c.mDirection.U(directionOf(speaker));
}
field_0x5c.mDirection.R(125.0f);
field_0x5c.mDirection.V(cSAngle(35.0f));
mWork.talk.field_0x1c.y = stack_1f0.y - 25.0f - stack_208.y;
field_0x158.field_0x0 = true;
field_0x5c.mCenter.y = stack_208.y + mWork.talk.field_0x1c.y;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = 60.0f;
}
hideActor(actor2);
break;
case 16:
case 17:
case 61:
if (iVar5 != 16) {
actor1 = listener;
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
} else {
actor1 = speaker;
stack_1e4 = talkEyePos(speaker);
stack_1f0 = talkEyePos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
}
field_0x5c.mCenter = stack_208;
if (mWork.talk.field_0x44 == 0) {
cXyz stack_244 = stack_1fc;
stack_244.y = stack_1e4.y;
cXyz stack_250 = stack_208;
stack_250.y = stack_1f0.y;
field_0x5c.mDirection.Val(stack_244 - stack_250);
if (iVar5 == 61) {
field_0x5c.mDirection.U(directionOf(speaker));
}
field_0x5c.mDirection.R(76.0f);
mWork.talk.field_0x1c.y = stack_1f0.y - 10.0f - stack_208.y;
field_0x158.field_0x0 = true;
}
field_0x5c.mCenter.y = stack_208.y + mWork.talk.field_0x1c.y;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = 50.0f;
hideActor(actor1);
break;
case 22:
case 23:
case 63:
if (iVar5 != 22) {
actor1 = listener;
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
} else {
actor1 = speaker;
stack_1e4 = talkEyePos(speaker);
stack_1f0 = talkEyePos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
}
field_0x5c.mCenter = stack_208;
if (mWork.talk.field_0x44 == 0) {
cXyz stack_25c = stack_1fc;
stack_25c.y = stack_1e4.y;
cXyz stack_268 = stack_1f0;
stack_268.y = stack_1f0.y;
field_0x5c.mDirection.Val(stack_25c - stack_268);
if (iVar5 == 63) {
field_0x5c.mDirection.U(directionOf(speaker));
}
field_0x5c.mDirection.R(125.0f);
mWork.talk.field_0x1c.y = stack_1f0.y - 15.0f - stack_208.y;
field_0x158.field_0x0 = true;
}
field_0x5c.mCenter.y = stack_208.y + mWork.talk.field_0x1c.y;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = 45.0f;
hideActor(actor1);
break;
case 41:
case 42:
case 65: {
if (iVar5 != 41) {
actor1 = speaker;
actor2 = listener;
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
} else {
actor1 = listener;
actor2 = speaker;
stack_1e4 = talkEyePos(speaker);
stack_1f0 = talkEyePos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
}
mWork.talk.field_0x90 = stack_208;
if (mWork.talk.field_0x44 == 0) {
cXyz stack_274 = stack_1fc;
stack_274.y = stack_1e4.y;
cXyz stack_280 = stack_1f0;
stack_280.y = stack_1f0.y;
mWork.talk.field_0xa8.Val(stack_274 - stack_280);
mWork.talk.field_0xa8.R(190.0f);
if (iVar5 == 0x41) {
mWork.talk.field_0xa8.U(directionOf(speaker));
}
mWork.talk.field_0x1c.y = stack_1f0.y - 40.0f - stack_208.y;
field_0x158.field_0x0 = true;
}
mWork.talk.field_0x90.y = stack_208.y + mWork.talk.field_0x1c.y;
mWork.talk.field_0x9c = mWork.talk.field_0x90 + mWork.talk.field_0xa8.Xyz();
mWork.talk.field_0xb0 = 45.0f;
cXyz stack_28c = attentionPos(actor1);
if (lineBGCheck(&stack_28c, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineCollisionCheck(stack_28c, mWork.talk.field_0x9c, listener, speaker, NULL))
{
iVar5 = 0;
} else {
field_0x5c.mCenter = mWork.talk.field_0x90;
field_0x5c.mEye = mWork.talk.field_0x9c;
field_0x5c.mDirection = mWork.talk.field_0xa8;
field_0x5c.mFovy = mWork.talk.field_0xb0;
hideActor(actor2);
}
break;
}
case 14:
case 15: {
if (iVar5 == 14) {
actor1 = speaker;
actor2 = listener;
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
cSGlobe stack_12d8 = mWork.talk.field_0x30;
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
} else {
actor1 = listener;
actor2 = speaker;
stack_1e4 = talkEyePos(speaker);
stack_1f0 = talkEyePos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
}
field_0x5c.mCenter = stack_208;
field_0x5c.mCenter.y = stack_1f0.y - 10.0f - mWork.talk.field_0x7c * 10.0f;
if (mWork.talk.field_0x44 == 0) {
field_0x5c.mDirection.Val(stack_1e4 - stack_1f0);
field_0x5c.mDirection.R(field_0x5c.mDirection.R() - 5.0f);
field_0x158.field_0x0 = true;
}
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
f32 tmp1 = 35.0f;
f32 tmp2 = 85.0f;
field_0x5c.mFovy = tmp2 + (tmp1 - tmp2) * mWork.talk.field_0x7c;
cXyz stack_298 = attentionPos(actor1);
hideActor(actor2);
break;
}
case 18:
case 19: {
int uVar17;
if (iVar5 == 18) {
actor1 = listener;
uVar17 = mWork.talk.field_0x38;
stack_1e4 = talkEyePos(speaker);
stack_1f0 = talkEyePos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
} else {
actor1 = speaker;
uVar17 = mWork.talk.field_0x38 ? 0 : 1;
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
}
if (mWork.talk.field_0x44 == 0) {
field_0x158.field_0x0 = true;
cXyz stack_2a4(0.0f, -15.0f, 15.0f);
cSGlobe stack_12e0 = stack_1e4 - attentionPos(actor1);
cSGlobe stack_12e8 = stack_2a4;
stack_12e8.U(stack_12e8.U() + stack_12e0.U());
mWork.talk.field_0x1c = stack_208 + stack_12e8.Xyz();
mWork.talk.field_0x1c.y += stack_1f0.y - stack_208.y;
f32 fVar36;
if (uVar17) {
fVar36 = -80.0f;
} else {
fVar36 = 75.0f;
}
cSAngle stack_137c = fVar36;
mWork.talk.field_0x90 = mWork.talk.field_0x1c;
mWork.talk.field_0xa8.Val(120.0f, cSAngle::_0, stack_137c + directionOf(actor1));
}
mWork.talk.field_0x9c = mWork.talk.field_0x90 + mWork.talk.field_0xa8.Xyz();
mWork.talk.field_0xb0 = 50.0f;
cXyz stack_2b0 = attentionPos(actor1);
if (lineBGCheck(&stack_2b0, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineCollisionCheck(stack_2b0, mWork.talk.field_0x9c, listener, speaker, NULL))
{
iVar5 = 0;
} else {
field_0x5c.mCenter = mWork.talk.field_0x90;
field_0x5c.mEye = mWork.talk.field_0x9c;
field_0x5c.mDirection = mWork.talk.field_0xa8;
field_0x5c.mFovy = mWork.talk.field_0xb0;
}
break;
}
case 24:
case 25: {
int uVar17;
if (iVar5 == 24) {
actor1 = listener;
uVar17 = mWork.talk.field_0x38;
stack_1e4 = talkEyePos(speaker);
stack_1f0 = talkEyePos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
} else {
actor1 = speaker;
uVar17 = mWork.talk.field_0x38 ? 0 : 1;
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
}
if (mWork.talk.field_0x44 == 0) {
field_0x158.field_0x0 = true;
cXyz stack_2bc(0.0f, -10.0f, 20.0f);
cSGlobe stack_12f0 = stack_1e4 - attentionPos(actor1);
cSGlobe stack_12f8 = stack_2bc;
stack_12f8.U(stack_12f8.U() + stack_12f0.U());
mWork.talk.field_0x1c = stack_1f0 + stack_12f8.Xyz();
f32 fVar36;
if (uVar17) {
fVar36 = -45.0f;
} else {
fVar36 = 45.0f;
}
cSAngle stack_1380 = fVar36;
mWork.talk.field_0x90 = mWork.talk.field_0x1c;
mWork.talk.field_0xa8.Val(120.0f, cSAngle(25.0f), stack_1380 + directionOf(actor1));
}
mWork.talk.field_0x9c = mWork.talk.field_0x90 + mWork.talk.field_0xa8.Xyz();
mWork.talk.field_0xb0 = 45.0f;
cXyz stack_2c8 = attentionPos(actor1);
if (lineBGCheck(&stack_2c8, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineCollisionCheck(stack_2c8, mWork.talk.field_0x9c, listener, speaker, NULL))
{
iVar5 = 0;
} else {
field_0x5c.mCenter = mWork.talk.field_0x90;
field_0x5c.mEye = mWork.talk.field_0x9c;
field_0x5c.mDirection = mWork.talk.field_0xa8;
field_0x5c.mFovy = mWork.talk.field_0xb0;
}
break;
}
case 26:
case 27: {
int uVar17;
if (iVar5 != 26) {
actor1 = listener;
actor2 = speaker;
uVar17 = mWork.talk.field_0x38;
stack_1e4 = talkEyePos(speaker);
stack_1f0 = talkEyePos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
} else {
actor1 = speaker;
actor2 = listener;
uVar17 = mWork.talk.field_0x38 ? 0 : 1;
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
}
if (mWork.talk.field_0x44 == 0) {
field_0x158.field_0x0 = true;
cXyz stack_2d4(0.0f, -30.0f, 20.0f);
if (bVar3 && iVar5 == 27) {
stack_2d4.y = -5.0f;
}
cSGlobe stack_1300 = attentionPos(actor2) - attentionPos(actor1);
cSGlobe stack_1308 = stack_2d4;
stack_1308.U(stack_1308.U() + stack_1300.U());
mWork.talk.field_0x1c = stack_1f0 + stack_1308.Xyz();
f32 fVar36;
if (uVar17) {
fVar36 = -30.0f;
} else {
fVar36 = 35.0f;
}
cSAngle stack_1384 = fVar36;
if (bVar3) {
fVar36 = 0.0f;
} else {
fVar36 = -35.0f;
}
cSAngle stack_1388 = fVar36;
mWork.talk.field_0x90 = mWork.talk.field_0x1c;
mWork.talk.field_0xa8.Val(90.0f, cSAngle(-35.0f), stack_1384 + directionOf(actor1));
}
mWork.talk.field_0x9c = mWork.talk.field_0x90 + mWork.talk.field_0xa8.Xyz();
mWork.talk.field_0xb0 = 55.0f;
cXyz stack_2e0 = attentionPos(actor1);
if (lineBGCheck(&stack_2e0, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineCollisionCheck(stack_2e0, mWork.talk.field_0x9c, listener, speaker, NULL))
{
iVar5 = 0;
} else {
field_0x5c.mCenter = mWork.talk.field_0x90;
field_0x5c.mEye = mWork.talk.field_0x9c;
field_0x5c.mDirection = mWork.talk.field_0xa8;
field_0x5c.mFovy = mWork.talk.field_0xb0;
}
break;
}
case 11:
case 12:
case 30:
case 31: {
fopAc_ac_c* actor;
int uVar17;
if (iVar5 != 11 && iVar5 != 30) {
actor = speaker;
uVar17 = mWork.talk.field_0x38;
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
} else {
actor = listener;
uVar17 = mWork.talk.field_0x38 ? 0 : 1;
stack_1e4 = talkEyePos(speaker);
stack_1f0 = talkEyePos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (bVar3) {
stack_1e4.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_208 += stack_1cc;
}
}
if (mWork.talk.field_0x44 == 0) {
f32 fVar36 = (stack_1f0.y - talkBasePos(actor).y) * 1.2f;
f32 fVar37 = (stack_1e4.y - stack_1f0.y) * 0.45f;
f32 fVar38 = fVar36 * 0.7f + fVar37;
cXyz stack_2ec(25.0f, 10.0f, mWork.talk.field_0x30.R() * 0.45f);
cXyz stack_2f8(75.0f, fVar37, -75.0f);
if (uVar17) {
stack_2ec.x = -stack_2ec.x;
stack_2f8.x = -stack_2f8.x;
}
cSGlobe stack_1310 = stack_1e4 - stack_1f0;
cSGlobe stack_1318 = stack_2ec;
stack_1318.U(stack_1318.U() + stack_1310.U());
mWork.talk.field_0x90 = attentionPos(actor) + stack_1318.Xyz();
mWork.talk.field_0x90.y = stack_208.y + fVar38;
stack_1318.Val(stack_2f8);
stack_1318.U(stack_1318.U() + stack_1310.U().Inv());
stack_1318.V(stack_1318.V() * 0.25f + stack_1310.V() * 0.75f);
mWork.talk.field_0x9c = stack_1e4 + stack_1318.Xyz();
mWork.talk.field_0xa8.Val(mWork.talk.field_0x9c - mWork.talk.field_0x90);
field_0x158.field_0x0 = true;
if (iVar5 == 11 || iVar5 == 12) {
mWork.talk.field_0xb0 = 55.0f;
} else {
mWork.talk.field_0xb0 = 65.0f;
}
}
cXyz stack_304 = attentionPos(actor);
if (lineBGCheck(&stack_304, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineCollisionCheck(stack_304, mWork.talk.field_0x9c, listener, speaker, NULL))
{
iVar5 = 0;
} else {
field_0x5c.mCenter = mWork.talk.field_0x90;
field_0x5c.mEye = mWork.talk.field_0x9c;
field_0x5c.mDirection = mWork.talk.field_0xa8;
field_0x5c.mFovy = mWork.talk.field_0xb0;
}
break;
}
case 13: {
if (mWork.talk.field_0x44 == 0) {
field_0x158.field_0x0 = true;
}
field_0x5c.mCenter = mWork.talk.field_0x4;
field_0x5c.mDirection.Val(400.0f, cSAngle(35.0f), mWork.talk.field_0x28.U());
if (field_0x5c.mDirection.V() > stack_134c) {
field_0x5c.mDirection.V(stack_134c);
}
if (field_0x5c.mDirection.V() < stack_1350) {
field_0x5c.mDirection.V(stack_1350);
}
cXyz stack_310 = attentionPos(listener);
cXyz stack_31c = attentionPos(speaker);
cSAngle stack_138c;
if (mWork.talk.field_0x38) {
stack_138c = 20.0f;
} else {
stack_138c = -20.0f;
}
for (int i = 0; i < 18; i++) {
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
if (!lineBGCheck(&stack_310, &field_0x5c.mEye, mWork.talk.field_0x8c)
&& !lineBGCheck(&stack_31c, &field_0x5c.mEye, mWork.talk.field_0x8c)
&& !lineCollisionCheck(stack_310, field_0x5c.mEye, listener, speaker, NULL)
&& !lineCollisionCheck(stack_31c, field_0x5c.mEye, listener, speaker, NULL))
{
break;
}
field_0x5c.mDirection.U(field_0x5c.mDirection.U() + stack_138c);
}
field_0x5c.mFovy = 60.0f;
break;
}
case 32:
if (mWork.talk.field_0x44 == 0) {
field_0x158.field_0x0 = true;
field_0x5c.mCenter = mWork.talk.field_0x4;
cSAngle stack_1390;
if (mWork.talk.field_0x38) {
stack_1390 = mWork.talk.field_0x30.U() + cSAngle::_90;
} else {
stack_1390 = mWork.talk.field_0x30.U() + cSAngle::_270;
}
field_0x5c.mDirection.Val(400.0f, cSAngle(15.0f), stack_1390);
if (field_0x5c.mDirection.V() > stack_134c) {
field_0x5c.mDirection.V(stack_134c);
}
if (field_0x5c.mDirection.V() < stack_1350) {
field_0x5c.mDirection.V(stack_1350);
}
cXyz stack_328 = attentionPos(listener);
cXyz stack_334 = attentionPos(speaker);
cSAngle stack_1394 = cSAngle::_0;
for (int i = 0; i < 18; i++) {
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
if (!lineBGCheck(&stack_328, &field_0x5c.mEye, mWork.talk.field_0x8c)
&& !lineBGCheck(&stack_334, &field_0x5c.mEye, mWork.talk.field_0x8c)
&& !lineCollisionCheck(stack_328, field_0x5c.mEye, listener, speaker, NULL)
&& !lineCollisionCheck(stack_334, field_0x5c.mEye, listener, speaker, NULL))
{
break;
}
if ((i & 1) == 0) {
stack_1394 += cSAngle(20.0f);
field_0x5c.mDirection.U(stack_1390 + stack_1394);
} else {
field_0x5c.mDirection.U(stack_1390 - stack_1394);
}
}
field_0x5c.mFovy = 60.0f;
}
break;
case 28: {
if (mWork.talk.field_0x44 == 0) {
field_0x158.field_0x0 = true;
}
cXyz stack_340 = talkBasePos(speaker);
cXyz stack_34c = talkBasePos(listener);
cXyz stack_358 = stack_340 - stack_34c;
cSGlobe stack_1320 = stack_358;
cSAngle stack_1398;
f32 dVar21 = dCamMath::xyzHorizontalDistance(stack_340, stack_34c) * 2.0f * 0.5f;
cDegree stack_1348 = field_0x92c * 60.0f * 0.5f;
dVar21 /= stack_1348.Tan();
if (mWork.talk.field_0x38) {
stack_1398 = cSAngle::_270;
} else {
stack_1398 = cSAngle::_90;
}
mWork.talk.field_0x90 = talkBasePos(listener) + stack_358 * 0.5f;
mWork.talk.field_0x90.y = (talkEyePos(speaker).y + talkEyePos(listener).y) * 0.5f - 30.0f;
mWork.talk.field_0xa8.Val(dVar21, cSAngle::_0, stack_1320.U() + stack_1398);
mWork.talk.field_0x9c = mWork.talk.field_0x90 + mWork.talk.field_0xa8.Xyz();
mWork.talk.field_0xb0 = 60.0f;
if (lineBGCheck(&stack_340, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineBGCheck(&stack_34c, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineCollisionCheck(stack_340, mWork.talk.field_0x9c, listener, speaker, NULL)
|| lineCollisionCheck(stack_34c, mWork.talk.field_0x9c, listener, speaker, NULL))
{
iVar5 = 0;
} else {
field_0x5c.mCenter = mWork.talk.field_0x90;
field_0x5c.mEye = mWork.talk.field_0x9c;
field_0x5c.mDirection = mWork.talk.field_0xa8;
field_0x5c.mFovy = mWork.talk.field_0xb0;
}
break;
}
case 29: {
mWork.talk.field_0x90 = talkBasePos(speaker);
if (mWork.talk.field_0x44 == 0) {
cXyz stack_364 = talkBasePos(listener);
stack_364.y = talkEyePos(listener).y;
cXyz stack_370 = talkBasePos(speaker);
if (bVar3) {
stack_370.y = attentionPos(speaker).y;
}
stack_370.y = talkEyePos(speaker).y;
mWork.talk.field_0xa8.Val(stack_364 - stack_370);
mWork.talk.field_0xa8.R(200.0f);
mWork.talk.field_0x1c.y = attentionPos(speaker).y - 68.0f - talkBasePos(speaker).y;
field_0x158.field_0x0 = true;
}
mWork.talk.field_0x90.y = mWork.talk.field_0x1c.y + talkBasePos(speaker).y;
mWork.talk.field_0x9c = mWork.talk.field_0x90 + mWork.talk.field_0xa8.Xyz();
mWork.talk.field_0xb0 = 55.0f;
cXyz stack_37c = attentionPos(speaker);
if (lineBGCheck(&stack_37c, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineCollisionCheck(stack_37c, mWork.talk.field_0x9c, listener, speaker, NULL))
{
iVar5 = 0;
} else {
field_0x5c.mCenter = mWork.talk.field_0x90;
field_0x5c.mEye = mWork.talk.field_0x9c;
field_0x5c.mDirection = mWork.talk.field_0xa8;
field_0x5c.mFovy = mWork.talk.field_0xb0;
hideActor(listener);
}
break;
}
case 37:
if (mWork.talk.field_0x44 == 0) {
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
stack_1fc = talkBasePos(listener);
stack_208 = talkBasePos(speaker);
if (bVar3) {
stack_1f0.y = attentionPos(speaker).y;
}
if (bVar13) {
stack_1fc += stack_1cc;
}
field_0x5c.mCenter = stack_208;
cXyz stack_388 = stack_1fc;
stack_388.y = stack_1e4.y;
cXyz stack_394 = stack_208;
stack_394.y = stack_1f0.y;
field_0x5c.mDirection.Val(stack_388 - stack_394);
field_0x5c.mDirection.V(field_0x5c.mDirection.V() + cSAngle(5.0f));
field_0x5c.mDirection.R(750.0f);
mWork.talk.field_0x1c.y = stack_1f0.y - stack_208.y;
field_0x158.field_0x0 = true;
field_0x5c.mCenter.y = stack_208.y + mWork.talk.field_0x1c.y;
cXyz stack_3a0 = attentionPos(listener);
cXyz stack_3ac = attentionPos(speaker);
cSAngle stack_139c;
if (mWork.talk.field_0x38) {
field_0x5c.mDirection.U(field_0x5c.mDirection.U() + cSAngle(10.0f));
stack_139c = 20.0f;
} else {
field_0x5c.mDirection.U(field_0x5c.mDirection.U() - cSAngle(10.0f));
stack_139c = -20.0f;
}
int i;
fopAc_ac_c* midna = daPy_py_c::getMidnaActor();
for (i = 0; i < 18; i++) {
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
if (!lineBGCheck(&stack_3a0, &field_0x5c.mEye, mWork.talk.field_0x8c)
&& !lineBGCheck(&stack_3ac, &field_0x5c.mEye, mWork.talk.field_0x8c)
&& !lineCollisionCheck(stack_3a0, field_0x5c.mEye, listener, midna, NULL)
&& !lineCollisionCheck(stack_3ac, field_0x5c.mEye, listener, midna, NULL))
{
break;
}
field_0x5c.mDirection.U(field_0x5c.mDirection.U() + stack_139c);
}
field_0x5c.mFovy = 60.0f;
}
break;
case 38: {
stack_1e4 = talkEyePos(listener);
stack_1f0 = talkEyePos(speaker);
cSGlobe stack_1328 = stack_1e4 - stack_1f0;
if (mWork.talk.field_0x44 == 0) {
field_0x158.field_0x0 = true;
cSGlobe stack_1330 = stack_1328;
stack_1330.R(stack_1328.R() * 0.5f);
field_0x5c.mCenter = stack_1f0 + stack_1330.Xyz();
field_0x5c.mCenter.y = stack_1f0.y - 20.0f - mWork.talk.field_0x7c * 10.0f;
if (mWork.talk.field_0x38) {
stack_1330.Val(cXyz(-45.0f + mWork.talk.field_0x7c * 20.0f, 5.0f, -80.0f - mWork.talk.field_0x7c * 40.0f));
} else {
stack_1330.Val(cXyz(65.0f - mWork.talk.field_0x7c * 20.0f, 5.0f, -80.0f - mWork.talk.field_0x7c * 40.0f));
}
stack_1330.U(stack_1330.U() + directionOf(listener));
stack_1330.V(stack_1330.V() + stack_1328.V());
field_0x5c.mEye = stack_1e4 + stack_1330.Xyz();
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
f32 tmp1 = 25.0f;
f32 tmp2 = 40.0f;
field_0x5c.mFovy = tmp2 + (tmp1 - tmp2) * mWork.talk.field_0x7c;
}
break;
}
case 33: {
cXyz stack_3b8(0.0f, 25.0f, -70.0f);
cSGlobe stack_1338 = stack_3b8;
stack_1338.U(stack_1338.U() + directionOf(listener));
field_0x5c.mCenter = attentionPos(listener) + stack_1338.Xyz();
field_0x5c.mDirection.Val(140.0f, cSAngle(-20.0f), cSAngle(-40.0f) + directionOf(listener));
field_0x158.field_0x0 = true;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = 58.0f;
break;
}
case 34:
field_0x5c.mCenter = talkBasePos(listener);
if (mWork.talk.field_0x44 == 0) {
field_0x5c.mDirection.V(cSAngle(20.0f));
field_0x5c.mDirection.R(160.0f);
field_0x5c.mDirection.U(directionOf(listener).Inv());
mWork.talk.field_0x1c.y = 95.0f;
field_0x158.field_0x0 = true;
}
field_0x5c.mCenter.y += mWork.talk.field_0x1c.y;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = 58.0f;
break;
case 35:
case 36: {
stack_1e4 = attentionPos(speaker);
stack_1f0 = attentionPos(listener);
stack_1fc = talkBasePos(speaker);
stack_208 = talkBasePos(listener);
if (mWork.talk.field_0x44 == 0) {
field_0x158.field_0x0 = true;
}
cXyz stack_3c4(0.0f, 10.0f, -60.0f);
cSGlobe stack_1340 = stack_3c4;
stack_1340.U(stack_1340.U() + directionOf(listener));
mWork.talk.field_0x90 = stack_1f0 + stack_1340.Xyz();
cSAngle stack_13a0;
if (iVar5 == 36) {
stack_13a0.Val(-150.0f);
mWork.talk.field_0xa8.Val(200.0f, cSAngle::_0, stack_13a0 + directionOf(listener));
} else {
stack_13a0.Val(-35.0f);
mWork.talk.field_0xa8.Val(160.0f, cSAngle::_0, stack_13a0 + directionOf(listener));
}
mWork.talk.field_0xb0 = 60.0f;
mWork.talk.field_0x9c = mWork.talk.field_0x90 + mWork.talk.field_0xa8.Xyz();
cXyz stack_3d0 = attentionPos(listener);
if (lineBGCheck(&stack_3d0, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineCollisionCheck(stack_3d0, mWork.talk.field_0x9c, listener, speaker, NULL))
{
mWork.talk.field_0x90.y -= 20.0f;
mWork.talk.field_0xa8.Val(180.0f, cSAngle(35.0f), stack_13a0 + directionOf(listener));
mWork.talk.field_0x9c = mWork.talk.field_0x90 + mWork.talk.field_0xa8.Xyz();
if (lineBGCheck(&stack_3d0, &mWork.talk.field_0x9c, mWork.talk.field_0x8c)
|| lineCollisionCheck(stack_3d0, mWork.talk.field_0x9c, listener, speaker, NULL))
{
iVar5 = 0;
} else {
field_0x5c.mCenter = mWork.talk.field_0x90;
field_0x5c.mEye = mWork.talk.field_0x9c;
field_0x5c.mDirection = mWork.talk.field_0xa8;
field_0x5c.mFovy = mWork.talk.field_0xb0;
}
} else {
field_0x5c.mCenter = mWork.talk.field_0x90;
field_0x5c.mEye = mWork.talk.field_0x9c;
field_0x5c.mDirection = mWork.talk.field_0xa8;
field_0x5c.mFovy = mWork.talk.field_0xb0;
}
break;
}
default:
iVar5 = 0;
break;
}
if (mWork.talk.field_0x84 != 0) {
field_0x158.field_0x0 = true;
}
if (iVar5 == 0) {
if (field_0x158.field_0x0) {
field_0x5c.mCenter = mWork.talk.field_0x4;
field_0x5c.mDirection = mWork.talk.field_0x28;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = mWork.talk.field_0x58;
} else {
mWork.talk.field_0x50 = (f32)(mWork.talk.field_0x44 + 1) / mWork.talk.field_0x48;
f32 dVar21 = dCamMath::rationalBezierRatio(mWork.talk.field_0x50, 0.28f);
field_0x5c.mCenter += (mWork.talk.field_0x4 - field_0x5c.mCenter) * dVar21;
field_0x5c.mDirection.R(field_0x5c.mDirection.R()
+ (mWork.talk.field_0x28.R() - field_0x5c.mDirection.R()) * dVar21);
field_0x5c.mDirection.V(field_0x5c.mDirection.V()
+ (mWork.talk.field_0x28.V() - field_0x5c.mDirection.V()) * dVar21);
field_0x5c.mDirection.U(field_0x5c.mDirection.U()
+ (mWork.talk.field_0x28.U() - field_0x5c.mDirection.U()) * dVar21);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += (mWork.talk.field_0x58 - field_0x5c.mFovy) * dVar21;
mWork.talk.field_0x4c -= mWork.talk.field_0x50;
if (mWork.talk.field_0x44 >= mWork.talk.field_0x48 - 1) {
field_0x158.field_0x0 = true;
}
uVar18 = false;
}
}
mWork.talk.field_0x44++;
return uVar18;
}
/* 80174EA4-80174EAC 16F7E4 0008+00 0/0 1/1 0/0 .text CalcSubjectAngle__9dCamera_cFPsPs
*/
bool dCamera_c::CalcSubjectAngle(s16* param_0, s16* param_1) {
return false;
}
/* 80174EAC-80174ED4 16F7EC 0028+00 0/0 0/0 1/1 .text SaveZoomRatio__9dCamera_cFv */
bool dCamera_c::SaveZoomRatio() {
if (mCamParam.Algorythmn() != 4) {
return false;
}
field_0x73c = mWork.subject.field_0x24;
return true;
}
/* 80174ED4-80176074 16F814 11A0+00 1/0 0/0 0/0 .text subjectCamera__9dCamera_cFl */
bool dCamera_c::subjectCamera(s32 param_0) {
f32 val0 = mCamParam.Val(param_0, 0);
f32 val2 = mCamParam.Val(param_0, 2);
f32 val1 = mCamParam.Val(param_0, 1);
f32 val25 = mCamParam.Val(param_0, 25);
f32 val4 = mCamParam.Val(param_0, 4);
f32 val26 = mCamParam.Val(param_0, 26);
f32 val20 = mCamParam.Val(param_0, 20);
f32 val19 = mCamParam.Val(param_0, 19);
f32 val21 = mCamParam.Val(param_0, 21);
f32 val7 = mCamParam.Val(param_0, 7);
f32 val10 = mCamParam.Val(param_0, 10);
f32 val17 = mCamParam.Val(param_0, 17);
f32 val27 = mCamParam.Val(param_0, 27);
f32 val22 = mCamParam.Val(param_0, 22);
f32 val16 = mCamParam.Val(param_0, 16);
f32 val24 = mCamParam.Val(param_0, 24);
f32 val18 = mCamParam.Val(param_0, 18);
daAlink_c* player = (daAlink_c*)mpPlayerActor;
bool bVar13 = check_owner_action(mPadID, 0x1040) != 0;
bool bVar14 = check_owner_action(mPadID, 0x4000) != 0;
bool bVar15 = check_owner_action(mPadID, 0x400) != 0;
bool magne_boots_on = player->checkMagneBootsOn() != 0;
check_owner_action(mPadID, 0x80080);
bool bVar16 = check_owner_action(mPadID, 0x40) != 0;
if (mCurCamStyleTimer == 0) {
mWork.subject.field_0x0 = 'SUBN';
mWork.subject.field_0x2a.Val(field_0x5c.mDirection.U().Inv());
mWork.subject.field_0x28.Val(field_0x5c.mDirection.V());
mWork.subject.field_0x14 = 7;
if (check_owner_action1(mPadID, 0x2000000)) {
mWork.subject.field_0x14 = 2;
}
mWork.subject.field_0x10 = 0;
mWork.subject.field_0x24 = field_0x73c;
field_0x73c = 0.0f;
mWork.subject.field_0x18 = param_0;
mWork.subject.field_0x1c = false;
mWork.subject.field_0x20 = 0.0f;
mWork.subject.field_0x1d = false;
if (bVar13 || bVar15) {
mWork.subject.field_0x1d = directionOf(mpPlayerActor) - field_0x5c.mDirection.U() > cSAngle::_0;
} else if (bVar14) {
mWork.subject.field_0x1d = player->getHookshotLeft();
}
}
if (mWork.subject.field_0x1d) {
val0 = -val0;
}
cXyz stack_1bc;
cSAngle stack_448;
MtxP mtx, inv_mtx;
if (magne_boots_on) {
stack_1bc = *player->getMagneBootsTopVec();
mtx = player->getMagneBootsMtx();
inv_mtx = player->getMagneBootsInvMtx();
stack_448 = cSAngle(player->getMagneBootsModelShapeAngle());
} else {
stack_1bc = cXyz::BaseY;
mtx = mDoMtx_getIdentity();
inv_mtx = mDoMtx_getIdentity();
stack_448 = directionOf(mpPlayerActor);
}
cXyz stack_1c8, stack_1d4, stack_1e0;
s16 bow_angle_x, bow_angle_y;
cSAngle angle_x = player->getCameraAngleX();
cSAngle angle_y = player->getCameraAngleY();
cXyz* bow_pos = player->checkBowCameraArrowPosP(&bow_angle_x, &bow_angle_y);
if (check_owner_action(mPadID, 0x200000) && bow_pos != NULL) {
stack_1c8 = *bow_pos;
angle_x.Val(bow_angle_x);
angle_y.Val(bow_angle_y);
} else if (bVar14) {
if (player->getHookshotLeft()) {
stack_1c8 = player->getLeftHandPos();
} else {
stack_1c8 = player->getRightHandPos();
}
} else if (player->checkIronBallThrowReturnMode()) {
stack_1c8 = attentionPos(mpPlayerActor);
cXyz* iron_ball_pos = player->getIronBallCenterPos();
cSGlobe globe = stack_1c8 - *iron_ball_pos;
f32 tmp = cXyz(*iron_ball_pos - stack_1c8).abs();
if (tmp > 200.0f) {
angle_x = globe.V();
angle_y = globe.U().Inv();
} else {
angle_x = mWork.subject.field_0x28;
angle_y = mWork.subject.field_0x2a;
}
angle_x += cSAngle(5.0f);
} else if (bVar15) {
stack_1c8 = attentionPos(mpPlayerActor);
mWork.subject.field_0x28 = angle_x;
mWork.subject.field_0x2a = angle_y;
angle_x += cSAngle(5.0f);
} else {
stack_1c8 = *player->getSubjectEyePos();
}
mWork.subject.field_0x2e = angle_x;
mWork.subject.field_0x2c = angle_y;
if (magne_boots_on) {
cXyz player_pos = positionOf(mpPlayerActor);
mWork.subject.field_0x4 = field_0x5c.mCenter - player_pos;
mWork.subject.field_0x30 = field_0x5c.mEye - player_pos;
mDoMtx_multVecSR(inv_mtx, &mWork.subject.field_0x4, &mWork.subject.field_0x4);
mDoMtx_multVecSR(inv_mtx, &mWork.subject.field_0x30, &mWork.subject.field_0x30);
mWork.subject.field_0x4 += player_pos;
mWork.subject.field_0x30 += player_pos;
mWork.subject.field_0x48.Val(mWork.subject.field_0x30 - mWork.subject.field_0x4);
}
if (mCurCamStyleTimer == 0) {
mWork.subject.field_0x4 = field_0x5c.mCenter;
mWork.subject.field_0x30 = field_0x5c.mEye;
mWork.subject.field_0x48 = field_0x5c.mDirection;
mWork.subject.field_0x3c = mUp;
field_0x738 = val16;
}
bool bVar17 = false;
if (field_0x940 == -1) {
bVar17 = true;
}
if (mCurType == specialType[CAM_TYPE_SCOPE]) {
field_0x940 = 0;
mCamParam.SetFlag(0x10);
mCamParam.SetFlag(4);
} else if (mCurMode == 4) {
field_0x940 = -1;
if (mPadInfo.mCStick.mLastPosY < -mCamSetup.mCStick.SwTHH()) {
if (field_0x1f4 != -1 && field_0x940 == -1) {
field_0x940 = 0;
setComStat(0x2000);
}
field_0x1f4 = -1;
} else {
field_0x1f4 = 0;
}
} else if (bVar15 || player->checkIronBallThrowReturnMode()) {
val0 = 0.0f;
val2 = 40.0f;
val1 = 50.0f;
val7 = 270.0f;
val17 = 70.0f;
} else if (bVar14 || bVar13) {
if (field_0x940 == -1) {
bVar17 = true;
}
if (bVar17) {
val16 = mWork.subject.field_0x20;
mWork.subject.field_0x20 = val16 + (1.0f - val16) * 0.3f;
} else {
val16 = mWork.subject.field_0x20;
mWork.subject.field_0x20 = val16 + (0.0f - val16) * 0.3f;
}
mWork.subject.field_0x20 = 1.0f;
mCamParam.SetFlag(0x10);
mCamParam.SetFlag(4);
if (bVar14) {
val20 = player->getHookshotLeft() ? val20 : -val20;
val0 += (val20 - val0) * mWork.subject.field_0x20;
val2 += (val19 - val2) * mWork.subject.field_0x20;
val1 += (val21 - val1) * mWork.subject.field_0x20;
val7 += (val10 - val7) * mWork.subject.field_0x20;
} else if (bVar16) {
val0 += (19.0f - val0) * mWork.subject.field_0x20;
val2 += (0.0f - val2) * mWork.subject.field_0x20;
val1 += (val26 - val1) * mWork.subject.field_0x20;
val7 += (val10 - val7) * mWork.subject.field_0x20;
} else if (bVar13) {
val0 += (val25 - val0) * mWork.subject.field_0x20;
val2 += (val4 - val2) * mWork.subject.field_0x20;
val1 += (val26 - val1) * mWork.subject.field_0x20;
val7 += (val10 - val7) * mWork.subject.field_0x20;
} else {
val0 += (0.0f - val0) * mWork.subject.field_0x20;
val2 += (0.0f - val2) * mWork.subject.field_0x20;
val1 += (0.0f - val1) * mWork.subject.field_0x20;
val7 += (20.0f - val7) * mWork.subject.field_0x20;
}
}
if (mCurMode == 4 && getComStat(0x800)) {
val2 = 50.0f;
} else if (player->checkHawkWait()) {
val7 = 150.0f;
val2 = 20.0f;
}
if (mCamParam.Flag(param_0, 0x4000)) {
setFlag(0x800);
}
if (mCamParam.Flag(param_0, 0x20)) {
setFlag(0x10000000);
}
cXyz stack_1f8(val0, val2, val1);
stack_1d4 = dCamMath::xyzRotateX(stack_1f8, angle_x);
stack_1f8 = dCamMath::xyzRotateY(stack_1d4, angle_y);
f32 tmp = bVar15 ? 40.0f : 0.0f;
cXyz stack_204(0.0f, tmp, -val7);
stack_1d4 = dCamMath::xyzRotateX(stack_204, angle_x);
stack_204 = dCamMath::xyzRotateY(stack_1d4, angle_y);
if (magne_boots_on) {
mDoMtx_multVecSR(mtx, &stack_1f8, &stack_1f8);
mDoMtx_multVecSR(mtx, &stack_204, &stack_204);
}
f32 fVar1 = 1.0f;
if (player->checkIronBallThrowReturnMode()) {
fVar1 = 0.1f;
} else if (player->checkHorseRide() || player->checkCanoeRide()) {
fVar1 = 1.0f;
}
cXyz stack_210 = stack_1c8 + stack_1f8;
dBgS_CamLinChk lin_chk;
if (mIsWolf == 1) {
cXyz stack_21c = positionOf(mpPlayerActor);
stack_21c.y = stack_1c8.y;
if (lineBGCheck(&stack_21c, &stack_210, &lin_chk, 0x40b7)) {
cM3dGPla plane;
dComIfG_Bgsp().GetTriPla(lin_chk, &plane);
stack_210 = lin_chk.GetCross();
stack_210 += *plane.GetNP() * 5.0f;
}
}
stack_210 = field_0x5c.mCenter + (stack_210 - field_0x5c.mCenter) * fVar1;
cXyz stack_228 = stack_210 + stack_204;
stack_228 = field_0x5c.mEye + (stack_228 - field_0x5c.mEye) * fVar1;
if (magne_boots_on) {
setFlag(0x10);
stack_1e0 = stack_1bc;
} else {
stack_1e0 = cXyz::BaseY;
}
cXyz stack_234 = stack_228 - stack_210;
cXyz stack_240, stack_24c;
stack_234.normalize();
stack_240 = stack_210 + stack_234 * 40.0f;
if (lineBGCheck(&stack_240, &stack_210, &stack_24c, 0x40b7)) {
stack_228 = stack_24c + stack_234 * 10.0f;
}
if (field_0x158.field_0x0) {
field_0x5c.mCenter = stack_210;
field_0x5c.mEye = stack_228;
} else {
cSGlobe stack_43c = stack_228 - stack_210;
f32 tmp = 1.0f / (mWork.subject.field_0x14 - mWork.subject.field_0x10);
field_0x5c.mCenter += (stack_210 - field_0x5c.mCenter) * tmp;
field_0x5c.mDirection.R(field_0x5c.mDirection.R() + (stack_43c.R() - field_0x5c.mDirection.R()) * tmp);
field_0x5c.mDirection.V(field_0x5c.mDirection.V() + (stack_43c.V() - field_0x5c.mDirection.V()) * tmp);
field_0x5c.mDirection.U(field_0x5c.mDirection.U() + (stack_43c.U() - field_0x5c.mDirection.U()) * tmp);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += (val17 - field_0x5c.mFovy) * tmp;
mWork.subject.field_0x3c += (stack_1e0 - mWork.subject.field_0x3c) * tmp;
stack_1e0 = mWork.subject.field_0x3c.norm();
if (mWork.subject.field_0x10 == mWork.subject.field_0x14 - 1) {
field_0x158.field_0x0 = true;
}
mWork.subject.field_0x10++;
if (magne_boots_on) {
field_0x740.field_0x0 = field_0x5c.mCenter;
field_0x740.field_0xc = field_0x5c.mEye;
field_0x740.field_0x24 = field_0x5c.mDirection;
field_0x740.field_0x18 = stack_1e0;
}
return true;
}
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
field_0x740.field_0x0 = field_0x5c.mCenter;
field_0x740.field_0xc = field_0x5c.mEye;
field_0x740.field_0x24 = field_0x5c.mDirection;
field_0x740.field_0x18 = stack_1e0;
if (mCamParam.Flag(param_0, 0x400)) {
f32 dVar17 = 0.0f;
f32 dVar16 = 0.0f;
int iVar2 = 0;
if (mPadInfo.mCStick.mLastPosY > 0.01f) {
dVar17 = dCamMath::rationalBezierRatio(mPadInfo.mCStick.mLastPosY, mCamSetup.CurveWeight());
iVar2 = -1;
} else if (mPadInfo.mCStick.mLastPosY < -0.01f) {
dVar16 = dCamMath::rationalBezierRatio(-mPadInfo.mCStick.mLastPosY, mCamSetup.CurveWeight());
iVar2 = 1;
}
f32 tmp = mWork.subject.field_0x24 + val18 * (dVar17 - dVar16) * 0.1f;
if (tmp < 0.0f) {
mWork.subject.field_0x24 = 0.0f;
} else if (tmp > 1.0f) {
mWork.subject.field_0x24 = 1.0f;
} else {
mWork.subject.field_0x24 = tmp;
if (iVar2 == -1) {
mDoAud_seStartLevel(Z2SE_AL_HAWK_EYE_ZOOMIN, NULL, 0, 0);
} else if (iVar2 == 1) {
mDoAud_seStartLevel(Z2SE_AL_HAWK_EYE_ZOOMOUT, NULL, 0, 0);
}
}
if (mWork.subject.field_0x24 == 0.0f || mWork.subject.field_0x24 == 0.5f || mWork.subject.field_0x24 == 1.0f) {
dVar17 = 0.0f;
dVar16 = 0.0f;
}
f32 tmp2 = mWork.subject.field_0x24 * 8.0f + 1.0f;
f32 zoom_fovy = dCamMath::zoomFovy(val17 * 0.5f, tmp2) * 2.0f;
field_0x5c.mFovy += (zoom_fovy - field_0x5c.mFovy) * val22;
setComZoomScale(tmp2);
setComZoomForcus(1.0f - fabsf(dVar17 - dVar16) * -511.0f);
if (check_owner_action(mPadID, 0x200000)) {
setComStat(8);
}
} else {
field_0x5c.mFovy = val17;
}
return true;
}
/* 80176074-801767F8 1709B4 0784+00 1/0 0/0 0/0 .text magneCamera__9dCamera_cFl */
bool dCamera_c::magneCamera(s32 param_0) {
f32 val5 = mCamParam.Val(param_0, 5);
f32 val0 = mCamParam.Val(param_0, 0);
f32 val1 = mCamParam.Val(param_0, 1);
f32 val2 = mCamParam.Val(param_0, 2);
f32 val3 = mCamParam.Val(param_0, 3);
f32 val7 = mCamParam.Val(param_0, 7);
f32 val8 = mCamParam.Val(param_0, 8);
f32 val11 = mCamParam.Val(param_0, 11);
f32 val12 = mCamParam.Val(param_0, 12);
f32 val13 = mCamParam.Val(param_0, 13);
f32 val16 = mCamParam.Val(param_0, 16);
f32 val24 = mCamParam.Val(param_0, 24);
f32 val17 = mCamParam.Val(param_0, 17);
f32 val18 = mCamParam.Val(param_0, 18);
f32 val21 = mCamParam.Val(param_0, 21);
daAlink_c* player = (daAlink_c*)mpPlayerActor;
field_0x158.field_0x0 = mCurCamStyleTimer != 0;
cSAngle stack_234;
MtxP mtx, inv_mtx;
if (player->checkMagneBootsOn()) {
mtx = player->getMagneBootsMtx();
inv_mtx = player->getMagneBootsInvMtx();
stack_234 = player->getMagneBootsModelShapeAngle();
} else {
mtx = mDoMtx_getIdentity();
inv_mtx = mDoMtx_getIdentity();
stack_234 = directionOf(mpPlayerActor);
}
cXyz player_pos = positionOf(mpPlayerActor);
mWork.magne.field_0x4 = field_0x5c.mCenter - player_pos;
mWork.magne.field_0x10 = field_0x5c.mEye - player_pos;
mDoMtx_multVecSR(inv_mtx, &mWork.magne.field_0x4, &mWork.magne.field_0x4);
mDoMtx_multVecSR(inv_mtx, &mWork.magne.field_0x10, &mWork.magne.field_0x10);
mWork.magne.field_0x4 += player_pos;
mWork.magne.field_0x10 += player_pos;
if (mCurCamStyleTimer == 0) {
mWork.magne.field_0x0 = 'MAG_';
mWork.magne.field_0x1c.Val(mWork.magne.field_0x10 - mWork.magne.field_0x4);
}
f32 fVar1 = (mWork.magne.field_0x1c.R() - val8) / (val7 - val8);
if (fVar1 > 1.0f) {
fVar1 = 1.0f;
} else if (fVar1 < 0.0f) {
fVar1 = 0.0f;
}
cXyz stack_12c(val0, val3 + (val2 - val3) * fVar1, val1);
stack_12c = dCamMath::xyzRotateY(stack_12c, stack_234);
cXyz stack_138 = attentionPos(mpPlayerActor) - player_pos;
mDoMtx_multVecSR(inv_mtx, &stack_138, &stack_138);
stack_138 += player_pos;
mWork.magne.field_0x4 += ((stack_138 + stack_12c) - mWork.magne.field_0x4) * val5;
cSGlobe stack_230 = mWork.magne.field_0x10 - mWork.magne.field_0x4;
f32 fVar2 = stack_230.R();
if (fVar2 > val7) {
fVar2 = val7;
} else if (fVar2 < val8) {
fVar2 = val8;
}
f32 cstick_x = mPadInfo.mCStick.mLastPosX;
if (mCamParam.Flag(param_0, 0x40)) {
cstick_x = 0.0f;
}
cSAngle stack_238;
if (mCurMode == 1) {
stack_238 = stack_234.Inv();
} else if (fabsf(cstick_x) > 0.05f) {
f32 tmp = dCamMath::rationalBezierRatio(cstick_x, 0.5f) * 10.0f;
stack_238 = mWork.magne.field_0x1c.U() + cSAngle(tmp);
} else {
cSAngle stack_23c = stack_234.Inv() - stack_230.U();
f32 sin = stack_23c.Sin();
f32 tmp = fabsf(sin * mPadInfo.mMainStick.mLastValue);
f32 tmp2 = stack_23c.Cos() > 0.0f ? 8.0f : 4.0f;
stack_238 = stack_230.U() + cSAngle(sin * tmp2 * dCamMath::rationalBezierRatio(tmp, 1.0f));
}
cSAngle stack_240 = val13 + (val12 - val13) * fVar1;
mWork.magne.field_0x1c.Val(fVar2, stack_240, stack_238);
mWork.magne.field_0x10 = mWork.magne.field_0x4 + mWork.magne.field_0x1c.Xyz();
cXyz stack_144 = mWork.magne.field_0x4 - player_pos;
cXyz stack_150 = mWork.magne.field_0x10 - player_pos;
mDoMtx_multVecSR(mtx, &stack_144, &stack_144);
mDoMtx_multVecSR(mtx, &stack_150, &stack_150);
stack_144 += player_pos;
stack_150 += player_pos;
stack_230.Val(stack_150 - stack_144);
field_0x5c.mCenter = stack_144;
field_0x5c.mDirection.R(field_0x5c.mDirection.R()
+ (stack_230.R() - field_0x5c.mDirection.R()) * val11);
field_0x5c.mDirection.V(field_0x5c.mDirection.V()
+ (stack_230.V() - field_0x5c.mDirection.V()) * val16);
field_0x5c.mDirection.U(field_0x5c.mDirection.U()
+ (stack_230.U() - field_0x5c.mDirection.U()) * val24 * stack_230.V().Cos());
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += ((val18 + (val17 - val18) * fVar1) - field_0x5c.mFovy) * val21;
return true;
}
/* 801767F8-80176DF0 171138 05F8+00 1/0 0/0 0/0 .text colosseumCamera__9dCamera_cFl */
// NONMATCHING instruction order
bool dCamera_c::colosseumCamera(s32 param_0) {
f32 val0 = mCamParam.Val(param_0, 0);
f32 val2 = mCamParam.Val(param_0, 2);
f32 val1 = mCamParam.Val(param_0, 1);
f32 val3 = mCamParam.Val(param_0, 3);
f32 val7 = mCamParam.Val(param_0, 7);
f32 val8 = mCamParam.Val(param_0, 8);
f32 val11 = mCamParam.Val(param_0, 11);
f32 val10 = mCamParam.Val(param_0, 10);
f32 val12 = mCamParam.Val(param_0, 12);
f32 val13 = mCamParam.Val(param_0, 13);
f32 val17 = mCamParam.Val(param_0, 17);
f32 val18 = mCamParam.Val(param_0, 18);
if (Stage == 0x6b && positionOf(mpPlayerActor).y < -1.0f) {
return chaseCamera(mCamTypeData[specialType[CAM_TYPE_FIELD_S]].field_0x18[mIsWolf][0]);
}
if (mCurCamStyleTimer == 0) {
mWork.colosseum.field_0x14 = 0.0f;
mWork.colosseum.field_0x18 = 40;
if (field_0x7ac.field_0x30 != 0xff && mCamParam.Flag(param_0, 0x200)) {
mWork.colosseum.field_0x8.x = field_0x7ac.field_0x18.position.x;
mWork.colosseum.field_0x8.y = field_0x7ac.field_0x18.position.y;
mWork.colosseum.field_0x8.z = field_0x7ac.field_0x18.position.z;
} else if (mCamParam.Flag(param_0, 0x2000)) {
fopAc_ac_c* target = getParamTargetActor(mCurType);
mWork.colosseum.field_0x8.x = positionOf(target).x;
mWork.colosseum.field_0x8.y = attentionPos(mpPlayerActor).y;
mWork.colosseum.field_0x8.z = positionOf(target).z;
}
mEventData.field_0xf0.Init(5, 100);
}
if (mWork.colosseum.field_0x14 < 0.999f) {
mWork.colosseum.field_0x14 += 1.0f / mWork.colosseum.field_0x18;
} else {
field_0x158.field_0x0 = true;
mWork.colosseum.field_0x14 = 1.0f;
}
cXyz stack_e8 = mWork.colosseum.field_0x8;
if (!mCamParam.Flag(param_0, 0x1000)) {
stack_e8.y = attentionPos(mpPlayerActor).y;
}
cXyz stack_f4(val0, 0.0f, val1);
cXyz stack_100;
stack_100 = dCamMath::xyzRotateY(stack_f4, field_0x5c.mDirection.U().Inv());
stack_100 += attentionPos(mpPlayerActor);
cSGlobe stack_1bc = stack_100 - stack_e8;
f32 tmp;
if (stack_1bc.R() < val10) {
tmp = 0.0f;
stack_1bc.R(val10);
} else if (stack_1bc.R() > val11) {
tmp = 1.0f;
stack_1bc.R(val11);
} else {
tmp = (stack_1bc.R() - val10) / (val11 - val10);
stack_1bc.R(val10 + (val11 - val10) * tmp);
}
static f32 Dsp[5] = {0.0f, 0.0f, 0.25f, 1.0f, 1.0f};
f32 dVar7 = mEventData.field_0xf0.Spot(Dsp, tmp);
cXyz stack_10c;
stack_10c = stack_e8 + stack_1bc.Xyz();
if (!mCamParam.Flag(param_0, 0x800)) {
stack_10c.y = 0.0f;
}
stack_10c.y += val3 + (val2 - val3) * dVar7;
f32 fVar8 = val8 + (val7 - val8) * dVar7;
cSAngle stack_1c0 = val13 + (val12 - val13) * dVar7;
if (mCamParam.Flag(param_0, 0x1000)) {
stack_1c0 += stack_1bc.V();
}
cSAngle stack_1c4 = stack_1bc.U();
if (!field_0x158.field_0x0) {
field_0x5c.mCenter += (stack_10c - field_0x5c.mCenter) * mWork.colosseum.field_0x14;
field_0x5c.mDirection.R(field_0x5c.mDirection.R()
+ (fVar8 - field_0x5c.mDirection.R()) * mWork.colosseum.field_0x14);
field_0x5c.mDirection.V(field_0x5c.mDirection.V()
+ (stack_1c0 - field_0x5c.mDirection.V()) * mWork.colosseum.field_0x14);
field_0x5c.mDirection.U(field_0x5c.mDirection.U()
+ (stack_1c4 - field_0x5c.mDirection.U()) * mWork.colosseum.field_0x14);
} else {
field_0x5c.mCenter = stack_10c;
field_0x5c.mDirection.Val(fVar8, stack_1c0, stack_1c4);
}
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
f32 fVar9 = val18 + (val17 - val18) * dVar7;
field_0x5c.mFovy += (fVar9 - field_0x5c.mFovy) * mWork.colosseum.field_0x14;
return true;
}
/* 80176DF0-80176DF8 171730 0008+00 1/0 0/0 0/0 .text test1Camera__9dCamera_cFl */
bool dCamera_c::test1Camera(s32 param_0) {
return false;
}
/* 80176DF8-80176E00 171738 0008+00 1/0 0/0 0/0 .text test2Camera__9dCamera_cFl */
bool dCamera_c::test2Camera(s32 param_0) {
return false;
}
/* 80176E00-80178E50 171740 2050+00 1/0 0/0 0/0 .text towerCamera__9dCamera_cFl */
// NONMATCHING way too much getting inlined
bool dCamera_c::towerCamera(s32 param_0) {
cSAngle stack_444 = cSAngle(mCamSetup.ChargeLatitude());
cSAngle stack_448 = 80.0f;
cSAngle stack_44c = -60.0f;
cSAngle stack_450 = 60.0f;
f32 val0 = mCamParam.Val(param_0, 0);
f32 val2 = mCamParam.Val(param_0, 2);
f32 val1 = mCamParam.Val(param_0, 1);
f32 val5 = mCamParam.Val(param_0, 5);
f32 val6 = mCamParam.Val(param_0, 6);
f32 val3 = mCamParam.Val(param_0, 3);
f32 val26 = mCamParam.Val(param_0, 26);
f32 val7 = mCamParam.Val(param_0, 7);
f32 val8 = mCamParam.Val(param_0, 8);
f32 val10 = mCamParam.Val(param_0, 10);
f32 val11 = mCamParam.Val(param_0, 11);
f32 val12 = mCamParam.Val(param_0, 12);
f32 val13 = mCamParam.Val(param_0, 13);
f32 val16 = mCamParam.Val(param_0, 16);
f32 val17 = mCamParam.Val(param_0, 17);
f32 val18 = mCamParam.Val(param_0, 18);
f32 val20 = mCamParam.Val(param_0, 20);
f32 val21 = mCamParam.Val(param_0, 21);
cSAngle stack_454 = mCamParam.Val(param_0, 23);
cSAngle stack_458 = mCamParam.Val(param_0, 24);
f32 val22 = mCamParam.Val(param_0, 22);
f32 val27 = mCamParam.Val(param_0, 27);
f32 val4 = mCamParam.Val(param_0, 4);
f32 val9 = mCamParam.Val(param_0, 9);
f32 val14 = mCamParam.Val(param_0, 14);
f32 val19 = mCamParam.Val(param_0, 19);
if (field_0x940 == 1) {
val7 = val9;
val8 = val9 * 0.9f;
val2 = val3 = val4;
val12 = val13 = val14;
val17 = val18 = val19;
}
daAlink_c* player = (daAlink_c*)mpPlayerActor;
dComIfGp_getAttention();
if (mCurCamStyleTimer == 0) {
mWork.tower.field_0x54.x = field_0x7ac.field_0x18.position.x;
mWork.tower.field_0x54.y = field_0x7ac.field_0x18.position.y;
mWork.tower.field_0x54.z = field_0x7ac.field_0x18.position.z;
mWork.tower.field_0x60 = field_0x7ac.field_0x18.angle.y;
mWork.tower.field_0x64 = stack_454 <= cSAngle::_90 ? 1 : 0;
}
if (field_0x7ac.field_0x2c == 0xff) {
return chaseCamera(mCamTypeData[specialType[CAM_TYPE_FIELD_S]].field_0x18[mIsWolf][mCurMode]);
}
if (check_owner_action(mPadID, 0x8100000)) {
if (stack_44c < cSAngle(4.0f)) {
stack_44c.Val(4.0f);
}
if (val2 < -10.0f) {
val2 = -10.0f;
}
}
cSGlobe stack_41c = attentionPos(mpPlayerActor) - mWork.tower.field_0x54;
cSAngle stack_45c = directionOf(mpPlayerActor);
bool uVar2 = stack_41c.U() - field_0x5c.mDirection.U() > cSAngle::_0;
bool uVar1 = stack_41c.U() - stack_45c > cSAngle::_0;
if (mCurCamStyleTimer == 0) {
mWork.tower.field_0x0 = 'TOWR';
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
mWork.tower.field_0x18 = 0.0f;
mWork.tower.field_0x1c = mWork.tower.field_0x20 = mDirection.R();
mWork.tower.field_0x10 = mWork.tower.field_0x14 = 0;
mWork.tower.field_0x24 = mWork.tower.field_0x40 = mDirection.V().Degree();
mWork.tower.field_0x48 = field_0x5c.mCenter;
mWork.tower.field_0x7c = mWork.tower.field_0x74 = mWork.tower.field_0x78 = 0.01f;
mWork.tower.field_0x70 = 0.75f;
mWork.tower.field_0x80 = val6;
mWork.tower.field_0x84 = val5;
mWork.tower.field_0x38 = 0;
mWork.tower.field_0x6b = true;
mWork.tower.field_0x2c = mFovy;
mWork.tower.field_0x44 = mWork.tower.field_0x3c = 0.0f;
mWork.tower.field_0x6a = false;
cSAngle stack_460;
if (mCamParam.Flag(param_0, 0x100)) {
stack_460.Val(stack_41c.U() - field_0x5c.mDirection.U().Inv());
} else {
stack_460.Val(stack_41c.U() - directionOf(mpPlayerActor));
}
if (stack_460 > cSAngle::_0) {
mWork.tower.field_0x44 = 1.0f;
} else {
mWork.tower.field_0x44 = -1.0f;
}
mWork.tower.field_0x68 = false;
mWork.tower.field_0x28 = field_0x5c.mDirection.U();
mWork.tower.field_0x30 = 0.0f;
mWork.tower.field_0x34 = 0.0f;
mWork.tower.field_0x6c = false;
}
f32 fVar4 = limitf((field_0x5c.mDirection.R() - val8) / (val7 - val8), 0.0f, 1.0f);
cXyz stack_210;
if (mCamParam.Flag(param_0, 0x400)) {
cSAngle stack_464 = mWork.tower.field_0x60 - stack_41c.U();
mWork.tower.field_0x30 = val0 * stack_464.Sin();
} else if (chkFlag(0x100000) && check_owner_action(mPadID, 0xa50c0)) {
if (mPadInfo.mMainStick.mLastPosX < -0.2f) {
mWork.tower.field_0x6c = true;
}
if (mPadInfo.mMainStick.mLastPosX > 0.2f) {
mWork.tower.field_0x6c = false;
}
f32 tmp = mWork.tower.field_0x6c ? -45.0f : 45.0f;
mWork.tower.field_0x30 += (tmp - mWork.tower.field_0x30) * 0.04f;
} else {
mWork.tower.field_0x30 += (val0 - mWork.tower.field_0x30) * 0.06f;
}
stack_210.x = mWork.tower.field_0x30;
if (!mWork.tower.field_0x68) {
stack_210.y = val3 + (val2 - val3) * fVar4;
stack_210.z = val1 * fVar4;
} else {
stack_210.y = 20.0f;
stack_210.z = 1.0f;
}
bool bVar4 = Stage == 0x69 && player->checkSpinnerRide();
bool bVar3 = Stage == 0x65 && dComIfGp_evmng_cameraPlay();
bool bVar5 = Stage == 0x6b && check_owner_action1(mPadID, 0x10000);
if (mCurCamStyleTimer == 0) {
if (bVar3) {
mWork.tower.field_0x4 = 25;
} else if (bVar4) {
mWork.tower.field_0x4 = 5;
} else if (dComIfGp_evmng_cameraPlay()) {
int timer;
getEvIntData(&timer, "Timer", 20);
mWork.tower.field_0x4 = timer == 0 ? 1 : timer;
} else if (chkFlag(0x8000) && mCurMode == 1) {
field_0x158.field_0x0 = true;
mWork.tower.field_0x4 = 1;
} else {
cXyz stack_21c = relationalPos(mpPlayerActor, &stack_210);
f32 fVar19 = cXyz(mEye - stack_21c).abs() - val7;
f32 fVar18 = cXyz(mCenter - stack_21c).abs() - val7;
f32 fVar17 = fabsf(fVar19 > fVar18 ? fVar19 : fVar18);
f32 player_height = heightOf(mpPlayerActor);
f32 tmp = player_height < 10.0f ? 10.0f : player_height;
mWork.tower.field_0x4 = (int)(JMAFastSqrt(fVar17 / tmp) * 8.0f) + 1;
}
mWork.tower.field_0x8 = mWork.tower.field_0x4 * (mWork.tower.field_0x4 + 1) >> 1;
mWork.tower.field_0xc = 0.0f;
}
cXyz stack_228;
cSGlobe stack_424 = stack_210;
if (mCamParam.Flag(param_0, 0x1000)) {
stack_424.U(stack_424.U() + directionOf(mpPlayerActor));
} else {
stack_424.U(stack_424.U() + stack_41c.U());
}
if (mCamParam.Flag(param_0, 0x800) && mpLockonTarget != NULL) {
stack_228 = attentionPos(mpPlayerActor) + stack_424.Xyz()
+ (attentionPos(mpLockonTarget) - attentionPos(mpPlayerActor)) * val26;
field_0x188 = mpLockonTarget;
setFlag(0x2000);
} else {
stack_228 = attentionPos(mpPlayerActor) + stack_424.Xyz();
}
cXyz stack_234;
if (!field_0x158.field_0x0) {
if (mBG.field_0xc0.field_0x1) {
dComIfG_Bgsp().MoveBgMatrixCrrPos(mBG.field_0x5c.field_0x4, true,
&mWork.tower.field_0x48, NULL, NULL);
}
mWork.tower.field_0xc = mWork.tower.field_0x4 - (int)mCurCamStyleTimer;
f32 ratio = mWork.tower.field_0xc / mWork.tower.field_0x8;
mWork.tower.field_0x48 += (stack_228 - mWork.tower.field_0x48) * ratio;
field_0x5c.mCenter += (mWork.tower.field_0x48 - field_0x5c.mCenter) * val6;
stack_234 = attentionPos(mpPlayerActor);
stack_234.y -= 15.0f;
dBgS_CamLinChk lin_chk;
if (lineBGCheck(&stack_234, &field_0x5c.mCenter, &lin_chk, 0x40b7)) {
cM3dGPla plane;
dComIfG_Bgsp().GetTriPla(lin_chk, &plane);
field_0x5c.mCenter = lin_chk.GetCross();
field_0x5c.mCenter += *plane.GetNP();
}
f32 fVar18 = limitf(field_0x5c.mDirection.R(), val8, val7);
cSAngle stack_468 = field_0x5c.mDirection.V();
if (bVar5) {
stack_468 = cSAngle(val12);
}
if (stack_468 < stack_44c) {
stack_468 = stack_44c;
}
if (stack_468 > stack_450) {
stack_468 = stack_450;
}
cSGlobe stack_42c(fVar18, stack_468, cSAngle(field_0x8c.Inv()));
field_0x5c.mDirection.R(field_0x5c.mDirection.R()
+ (stack_42c.R() - field_0x5c.mDirection.R()) * ratio);
field_0x5c.mDirection.V(field_0x5c.mDirection.V()
+ (stack_42c.V() - field_0x5c.mDirection.V()) * ratio);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
if (mCurCamStyleTimer >= mWork.tower.field_0x4 - 1) {
field_0x158.field_0x0 = true;
}
mWork.tower.field_0x24 = field_0x5c.mDirection.V().Degree();
mWork.tower.field_0x1c = mWork.tower.field_0x20 = field_0x5c.mDirection.R();
field_0x5c.mFovy += (val17 - field_0x5c.mFovy) * ratio;
mWork.tower.field_0x8 -= mWork.tower.field_0xc;
return true;
}
cXyz stack_240 = positionOf(mpPlayerActor);
stack_240.y += 10.0f;
groundHeight(&stack_240);
if (mBG.field_0xc0.field_0x44) {
mWork.tower.field_0x18 = 0.0f;
mWork.tower.field_0x10 = 0;
} else if (mWork.tower.field_0x10 < 80) {
mWork.tower.field_0x10++;
mWork.tower.field_0x18 += (0.9f - mWork.tower.field_0x18)
* dCamMath::rationalBezierRatio(mWork.tower.field_0x10 / 80.0f, 1.25f);
}
cSAngle stack_46c = stack_45c - field_0x5c.mDirection.U();
cXyz stack_24c(mWork.tower.field_0x80, mWork.tower.field_0x84, mWork.tower.field_0x80);
field_0x5c.mCenter += (stack_228 - field_0x5c.mCenter) * stack_24c;
stack_234 = attentionPos(mpPlayerActor);
stack_234.y -= 15.0f;
cSGlobe stack_434 = field_0x5c.mEye - field_0x5c.mCenter;
f32 fVar18 = 1.0f;
if (val7 > val8) {
fVar18 = (field_0x5c.mDirection.R() - val8) / (val7 - val8);
if (fVar18 < 0.0f) {
fVar18 = 0.0f;
}
if (fVar18 > 1.0f) {
fVar18 = 1.0f;
}
}
bool spinner_path_move = player->checkSpinnerPathMove();
f32 fVar19 = mPadInfo.mCStick.mLastPosX;
f32 fVar20 = spinner_path_move ? 1.0f : mPadInfo.mMainStick.mLastValue;
cSAngle stack_470;
cSAngle stack_474 = stack_454 + (stack_454 - stack_458) * fVar20;
if (!mCamParam.Flag(param_0, 0x40) && std::fabsf(fVar19) > 0.05f) {
f32 tmp = dCamMath::rationalBezierRatio(fVar19, 0.5f) * 8.0f;
cSAngle stack_478 = field_0x5c.mDirection.U() + cSAngle(tmp);
f32 tmp2 = std::fabsf(fVar19) - 0.05f;
stack_470.Val(field_0x5c.mDirection.U() + (stack_478 - field_0x5c.mDirection.U()) * tmp2);
mWork.tower.field_0x6a = true;
mWork.tower.field_0x78 += (0.8f - mWork.tower.field_0x78) * 0.05f;
mWork.tower.field_0x28 = stack_470;
} else {
if (mWork.tower.field_0x6a) {
mWork.tower.field_0x78 = 0.0f;
mWork.tower.field_0x6a = false;
}
if (mCamParam.Flag(param_0, 0x800)) {
cSAngle stack_47c;
stack_47c.Val(stack_41c.U() - directionOf(mpPlayerActor));
f32 fVar19 = mMonitor.field_0x10 / playerMaxSpeed();
if (fVar19 > 1.0f) {
fVar19 = 1.0f;
}
if (stack_47c > cSAngle::_0) {
if (mWork.tower.field_0x44 < 1.0f) {
mWork.tower.field_0x44 += fVar19 * 0.025f;
}
} else {
if (mWork.tower.field_0x44 > -1.0f) {
mWork.tower.field_0x44 -= fVar19 * 0.025f;
}
}
mWork.tower.field_0x78 += (0.5f - mWork.tower.field_0x78) * 0.05f;
if (mWork.tower.field_0x64 == 0) {
cSAngle stack_480 = cSAngle::_180 - stack_474;
mWork.tower.field_0x28 = stack_41c.U().Inv() - stack_480 * mWork.tower.field_0x44;
} else {
cSAngle stack_484 = stack_474;
mWork.tower.field_0x28 = stack_41c.U() - stack_484 * mWork.tower.field_0x44;
}
} else if (mCamParam.Flag(param_0, 0x100)) {
if (!uVar2) {
cSAngle stack_488 = stack_434.U() - stack_41c.U();
f32 tmp = dCamMath::rationalBezierRatio(fVar18, val20);
if (stack_488 > stack_474) {
tmp = 1.0f;
}
stack_470.Val(stack_434.U() + ((stack_41c.U() + stack_474) - stack_434.U()) * tmp);
} else {
cSAngle stack_48c = stack_41c.U() - stack_434.U();
f32 tmp = dCamMath::rationalBezierRatio(fVar18, val20);
if (stack_48c > stack_474) {
tmp = 1.0f;
}
stack_470.Val(stack_434.U() + ((stack_41c.U() - stack_474) - stack_434.U()) * tmp);
}
mWork.tower.field_0x28 += (stack_470 - mWork.tower.field_0x28) * 0.33f;
if (check_owner_action(mPadID, 0x2000108)) {
val3 = 0.0f;
}
mWork.tower.field_0x78 = val27 + val22 * val3;
} else {
if (uVar1) {
stack_470.Val(stack_434.U() + ((stack_41c.U() + stack_474) - stack_434.U()) * 1.0f);
} else {
stack_470.Val(stack_434.U() + ((stack_41c.U() - stack_474) - stack_434.U()) * 1.0f);
}
mWork.tower.field_0x28 += (stack_470 - mWork.tower.field_0x28) * 0.33f;
if (check_owner_action(mPadID, 0x2000108) || mWork.tower.field_0x69 != uVar1) {
mWork.tower.field_0x78 = 0.0f;
} else {
mWork.tower.field_0x78 += ((val27 + val22 * val3) - mWork.tower.field_0x78) * 0.05f;
}
}
}
mWork.tower.field_0x69 = uVar1;
field_0x5c.mDirection.U(field_0x5c.mDirection.U()
+ (mWork.tower.field_0x28 - field_0x5c.mDirection.U()) * mWork.tower.field_0x78);
mWork.tower.field_0x24 += ((val13 + (val12 - val13) * fVar18) - mWork.tower.field_0x24) * val11;
if (!mCamParam.Flag(param_0, 0x4000)) {
field_0x1b0 = cSAngle::_0;
}
cSAngle stack_490;
if (mWork.tower.field_0x10 == 0) {
stack_490.Val(mWork.tower.field_0x24 + field_0x1b0.Degree());
mWork.tower.field_0x74 += (val16 - mWork.tower.field_0x74) * 0.01f;
} else {
stack_490 = stack_434.V();
mWork.tower.field_0x24 = stack_490.Degree();
mWork.tower.field_0x74 = dCamMath::rationalBezierRatio(mWork.tower.field_0x18, 0.7f);
}
if (stack_490 < stack_44c) {
stack_490.Val(stack_44c);
} else if (stack_490 > stack_450) {
stack_490.Val(stack_450);
}
field_0x5c.mDirection.V(field_0x5c.mDirection.V()
+ (stack_490 - field_0x5c.mDirection.V()) * mWork.tower.field_0x74);
f32 dVar20 = stack_434.R();
mWork.tower.field_0x1c += (val8 - mWork.tower.field_0x1c) * val11;
mWork.tower.field_0x20 += (val7 - mWork.tower.field_0x20) * val11;
if (dVar20 < mWork.tower.field_0x1c) {
mWork.tower.field_0x70 += (val10 - mWork.tower.field_0x70) * 0.01f;
dVar20 = mWork.tower.field_0x1c;
} else if (dVar20 > mWork.tower.field_0x20) {
mWork.tower.field_0x70 += (val10 - mWork.tower.field_0x70) * 0.01f;
dVar20 = mWork.tower.field_0x20;
} else {
mWork.tower.field_0x70 = 1.0f;
}
if (mCamParam.Flag(param_0, 0x400)) {
cSGlobe stack_43c(dVar20, field_0x5c.mDirection.V(), field_0x5c.mDirection.U());
cXyz stack_258;
cXyz stack_264 = field_0x5c.mCenter + stack_43c.Xyz();
mWork.tower.field_0x68 = false;
if (lineBGCheck(&stack_264, &field_0x5c.mCenter, &stack_258, 0x40b7)) {
mWork.tower.field_0x68 = true;
}
}
field_0x5c.mDirection.R(field_0x5c.mDirection.R()
+ (dVar20 - field_0x5c.mDirection.R()) * mWork.tower.field_0x70);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
if (mBG.field_0x0.field_0x0 && field_0x5c.mEye.y < mBG.field_0x0.field_0x58 + 5.0f) {
field_0x5c.mEye.y = mBG.field_0x0.field_0x58 + 5.0f;
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
}
mWork.tower.field_0x7c += (val21 - mWork.tower.field_0x7c) * 0.01f;
f32 tmp = val18 + (val17 - val18) * fVar18;
field_0x5c.mFovy += (tmp - field_0x5c.mFovy) * mWork.tower.field_0x7c;
return true;
}
/* 80178E50-80179590 173790 0740+00 1/0 0/0 0/0 .text hookshotCamera__9dCamera_cFl */
bool dCamera_c::hookshotCamera(s32 param_0) {
f32 val0 = mCamParam.Val(param_0, 0);
f32 val2 = mCamParam.Val(param_0, 2);
f32 val1 = mCamParam.Val(param_0, 1);
f32 val5 = mCamParam.Val(param_0, 5);
f32 val6 = mCamParam.Val(param_0, 6);
f32 val7 = mCamParam.Val(param_0, 7);
f32 val8 = mCamParam.Val(param_0, 8);
f32 val11 = mCamParam.Val(param_0, 11);
f32 val23 = mCamParam.Val(param_0, 23);
f32 val17 = mCamParam.Val(param_0, 17);
cXyz stack_9c[4] = {
cXyz(180.0f, 20.0f, -160.0f),
cXyz(160.0f, 60.0f, -200.0f),
cXyz(170.0f, -80.0f, -150.0f),
cXyz(100.0f, -120.0f, -240.0f),
};
cXyz stack_cc[4] = {
cXyz(40.0f, -150.0f, 340.0f),
cXyz(10.0f, -100.0f, 280.0f),
cXyz(80.0f, -50.0f, 200.0f),
cXyz(40.0f, -80.0f, -160.0f),
};
cXyz stack_d8;
cXyz stack_e4(val0, val2, val1);
if (mCurCamStyleTimer == 0) {
mWork.hookshot.field_0x0 = 'HOOK';
mWork.hookshot.field_0x8 = mCenter;
cXyz stack_f0 = positionOf(mpPlayerActor);
cXyz stack_fc = daAlink_getAlinkActorClass()->getHsChainTopPos();
csXyz stack_20c = daAlink_getAlinkActorClass()->getHsAngle();
cXyz stack_108 = stack_fc - stack_f0;
bool iVar2 = stack_20c.x < -0x3333;
cXyz* array;
if (iVar2) {
cSGlobe stack_214 = stack_108;
stack_20c.x = stack_214.V();
stack_20c.y = stack_214.U();
stack_20c.z = 0;
array = stack_cc;
} else {
array = stack_9c;
}
if (stack_108.abs() > val11 && mCamParam.Flag(param_0, 0x800)) {
cXyz stack_114;
cSGlobe stack_21c;
bool uVar6 = (field_0xa8 & 0x10) != 0;
for (int i = 0; i < 8; i++) {
stack_114 = array[i >> 1];
if (uVar6) {
stack_114.x = -stack_114.x;
}
stack_21c.Val(stack_114);
stack_21c.U(stack_21c.U() + stack_20c.y);
if (!iVar2) {
stack_21c.V(stack_21c.V() + stack_20c.x);
}
mWork.hookshot.field_0x14 = stack_fc + stack_21c.Xyz();
if (!lineBGCheck(&stack_f0, &mWork.hookshot.field_0x14, 7)) {
mWork.hookshot.field_0x20 = true;
break;
}
uVar6 = !uVar6;
}
}
field_0x158.field_0x0 = true;
return true;
}
f32 fovy;
if (mWork.hookshot.field_0x20 && mCurCamStyleTimer > 8 && mCamParam.Flag(param_0, 0x800)) {
stack_d8 = mWork.hookshot.field_0x14;
fovy = val17;
val23 = 1.0f;
} else {
stack_d8 = mEye;
fovy = val17;
}
cXyz stack_120(val6, val5, val6);
cXyz stack_12c = relationalPos(mpPlayerActor, &stack_e4);
if (mBG.field_0xc0.field_0x1) {
dComIfG_Bgsp().MoveBgMatrixCrrPos(mBG.field_0x5c.field_0x4, true,
&mWork.hookshot.field_0x8, NULL, NULL);
dComIfG_Bgsp().MoveBgMatrixCrrPos(mBG.field_0x5c.field_0x4, true,
&mWork.hookshot.field_0x14, NULL, NULL);
}
field_0x5c.mCenter += (stack_12c - field_0x5c.mCenter) * stack_120;
cSGlobe stack_224 = stack_d8 - field_0x5c.mCenter;
if (stack_224.R() < val8) {
stack_224.R(val8);
}
if (stack_224.R() > val7) {
stack_224.R(val7);
}
field_0x5c.mDirection.R(field_0x5c.mDirection.R()
+ (stack_224.R() - field_0x5c.mDirection.R()) * val23);
field_0x5c.mDirection.V(field_0x5c.mDirection.V()
+ (stack_224.V() - field_0x5c.mDirection.V()) * val23);
field_0x5c.mDirection.U(field_0x5c.mDirection.U()
+ (stack_224.U() - field_0x5c.mDirection.U()) * val23);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += (fovy - field_0x5c.mFovy) * val23;
return true;
}
/* ############################################################################################## */
/* 8042C9AC-8042C9B8 0596CC 000C+00 1/1 0/0 0/0 .bss @14159 */
static u8 lit_14159[12];
/* 80451040-80451044 -00001 0004+00 2/2 0/0 0/0 .sbss None */
/* 80451040 0002+00 data_80451040 _120$14158 */
/* 80451042 0002+00 data_80451042 None */
static u8 struct_80451040[4];
/* 80179590-8017A2A0 173ED0 0D10+00 1/0 0/0 0/0 .text railCamera__9dCamera_cFl */
bool dCamera_c::railCamera(s32 param_0) {
// NONMATCHING
}
/* ############################################################################################## */
/* 8042C9B8-8042C9C4 0596D8 000C+00 1/1 0/0 0/0 .bss @14615 */
static u8 lit_14615[12];
/* 80451044-80451048 -00001 0004+00 2/2 0/0 0/0 .sbss None */
/* 80451044 0002+00 data_80451044 _120$14614 */
/* 80451046 0002+00 data_80451046 None */
static u8 struct_80451044[4];
/* 8017A2A0-8017ADC0 174BE0 0B20+00 1/0 0/0 0/0 .text paraRailCamera__9dCamera_cFl */
bool dCamera_c::paraRailCamera(s32 param_0) {
// NONMATCHING
}
/* ############################################################################################## */
/* 8042C9C4-8042C9D0 0596E4 000C+00 0/1 0/0 0/0 .bss @14964 */
#pragma push
#pragma force_active on
static u8 lit_14964[12];
#pragma pop
/* 8042C9D0-8042C9E0 0596F0 000C+04 0/1 0/0 0/0 .bss @14968 */
#pragma push
#pragma force_active on
static u8 lit_14968[12 + 4 /* padding */];
#pragma pop
/* 80451048-8045104C -00001 0004+00 1/1 0/0 0/0 .sbss None */
/* 80451048 0002+00 data_80451048 LatMin$14963 */
/* 8045104A 0002+00 data_8045104A None */
static u8 struct_80451048[4];
/* 8045104C-80451050 00054C 0002+02 1/1 0/0 0/0 .sbss LatMax$14967 */
static u8 LatMax[2 + 2 /* padding */];
/* 804538C8-804538CC 001EC8 0004+00 1/1 0/0 0/0 .sdata2 @15474 */
SECTION_SDATA2 static f32 lit_15474 = 1200.0f;
/* 804538CC-804538D0 001ECC 0004+00 1/1 0/0 0/0 .sdata2 @15475 */
SECTION_SDATA2 static f32 lit_15475 = 3.0f / 5.0f;
/* 804538D0-804538D4 001ED0 0004+00 1/1 0/0 0/0 .sdata2 @15476 */
SECTION_SDATA2 static f32 lit_15476 = 800.0f;
/* 804538D4-804538D8 001ED4 0004+00 1/1 0/0 0/0 .sdata2 @15477 */
SECTION_SDATA2 static f32 lit_15477 = 28.0f;
/* 804538D8-804538DC 001ED8 0004+00 2/2 0/0 0/0 .sdata2 @15478 */
SECTION_SDATA2 static f32 lit_15478 = 320.0f;
/* 804538DC-804538E0 001EDC 0004+00 1/1 0/0 0/0 .sdata2 @15479 */
SECTION_SDATA2 static f32 lit_15479 = 6000.0f;
/* 804538E0-804538E4 001EE0 0004+00 1/1 0/0 0/0 .sdata2 @15480 */
SECTION_SDATA2 static f32 lit_15480 = 1000.0f;
/* 804538E4-804538E8 001EE4 0004+00 1/1 0/0 0/0 .sdata2 @15481 */
SECTION_SDATA2 static f32 lit_15481 = 23.0f;
/* 804538E8-804538EC 001EE8 0004+00 1/1 0/0 0/0 .sdata2 @15482 */
SECTION_SDATA2 static f32 lit_15482 = 780.0f;
/* 804538EC-804538F0 001EEC 0004+00 1/1 0/0 0/0 .sdata2 @15483 */
SECTION_SDATA2 static f32 lit_15483 = 1250.0f;
/* 804538F0-804538F4 001EF0 0004+00 1/1 0/0 0/0 .sdata2 @15484 */
SECTION_SDATA2 static f32 lit_15484 = 34.0f;
/* 804538F4-804538F8 001EF4 0004+00 1/1 0/0 0/0 .sdata2 @15485 */
SECTION_SDATA2 static f32 lit_15485 = 900.0f;
/* 804538F8-804538FC 001EF8 0004+00 1/1 0/0 0/0 .sdata2 @15486 */
SECTION_SDATA2 static f32 lit_15486 = 1.0500000715255737f;
/* 804538FC-80453900 001EFC 0004+00 1/1 0/0 0/0 .sdata2 @15487 */
SECTION_SDATA2 static f32 lit_15487 = 1.1500000953674316f;
/* 8017ADC0-8017D934 175700 2B74+00 1/0 0/0 0/0 .text rideCamera__9dCamera_cFl */
bool dCamera_c::rideCamera(s32 param_0) {
// NONMATCHING
}
/* 8017D934-8017D974 178274 0040+00 1/1 0/0 0/0 .text sAngleY__22@unnamed@d_camera_cpp@FR4cXyz */
static void func_8017D934(cXyz& param_0) {
// NONMATCHING
}
/* 8017D974-8017D97C 1782B4 0008+00 1/0 0/0 0/0 .text manualCamera__9dCamera_cFl */
bool dCamera_c::manualCamera(s32 param_0) {
return true;
}
/* ############################################################################################## */
/* 80453900-80453904 001F00 0004+00 1/1 0/0 0/0 .sdata2 @15772 */
SECTION_SDATA2 static f32 lit_15772 = -0.75f;
/* 80453904-80453908 001F04 0004+00 1/1 0/0 0/0 .sdata2 @15773 */
SECTION_SDATA2 static f32 lit_15773 = 4.0f / 3.0f;
/* 8017D97C-8017DFAC 1782BC 0630+00 1/0 0/0 0/0 .text observeCamera__9dCamera_cFl */
bool dCamera_c::observeCamera(s32 param_0) {
// NONMATCHING
}
/* 8017DFAC-8017E730 1788EC 0784+00 1/0 0/0 0/0 .text fixedFrameCamera__9dCamera_cFl */
bool dCamera_c::fixedFrameCamera(s32 param_0) {
// NONMATCHING
}
/* 8017E730-8017F25C 179070 0B2C+00 1/0 0/0 0/0 .text fixedPositionCamera__9dCamera_cFl
*/
bool dCamera_c::fixedPositionCamera(s32 param_0) {
// NONMATCHING
}
/* 8017F25C-8017F828 179B9C 05CC+00 1/0 0/0 0/0 .text oneSideCamera__9dCamera_cFl */
bool dCamera_c::oneSideCamera(s32 param_0) {
// NONMATCHING
}
/* 80393F68-80393F68 0205C8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039429F = "CAMERA";
SECTION_DEAD static char const* const stringBase_803942A6 = "KeepDist";
SECTION_DEAD static char const* const stringBase_803942AF = "Trim";
SECTION_DEAD static char const* const stringBase_803942B4 = "DEFAULT";
SECTION_DEAD static char const* const stringBase_803942BC = "Recover";
SECTION_DEAD static char const* const stringBase_803942C4 = "WaitAnyKey";
SECTION_DEAD static char const* const stringBase_803942CF = "BGCheck";
SECTION_DEAD static char const* const stringBase_803942D7 = "SavePos";
SECTION_DEAD static char const* const stringBase_803942DF = "LoadPos";
SECTION_DEAD static char const* const stringBase_803942E7 = "PlayerHide";
SECTION_DEAD static char const* const stringBase_803942F2 = "WideMode";
#pragma pop
/* 8017F828-8018050C 17A168 0CE4+00 2/1 0/0 0/0 .text eventCamera__9dCamera_cFl */
bool dCamera_c::eventCamera(s32 param_0) {
// 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::pauseEvCamera,
&dCamera_c::portalWarpEvCamera,
&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::stbWaitEvCamera,
&dCamera_c::currentEvCamera,
&dCamera_c::peepHoleEvCamera,
&dCamera_c::digHoleEvCamera,
&dCamera_c::hintTalkEvCamera,
&dCamera_c::bspTransEvCamera,
&dCamera_c::maptoolIdEvCamera,
};
static char* ActionNames[34] = {
"PAUSE",
"WAIT",
"TALK",
"FIXEDPOS",
"FIXEDFRM",
"UNITRANS",
"WATCHACTOR",
"RESTOREPOS",
"GETITEM",
"GAMEOVER",
"TURNTOACTOR",
"ROLLING",
"TACT",
"WINDDIR",
"PORTALWARP",
"STYLE",
"SAVE",
"LOAD",
"USEITEM0",
"USEITEM1",
"FIXEDFRMS",
"BSPLINE",
"POSSESSED",
"TWOACTOR0",
"STOKER",
"UNIBRAKE",
"UNIACCELE",
"STBWAIT",
"CURRENT",
"PEEPHOLE",
"DIGHOLE",
"HINTTALK",
"BSPTRANS",
"MAPTOOL",
};
(this->*l_func[0])();
}
/* ############################################################################################## */
/* 80393F68-80393F68 0205C8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_803942FB = "Continue";
#pragma pop
/* 8018050C-801806D4 17AE4C 01C8+00 1/0 0/0 0/0 .text currentEvCamera__9dCamera_cFv */
bool dCamera_c::currentEvCamera() {
// NONMATCHING
}
/* 801806D4-801806DC 17B014 0008+00 1/0 0/0 0/0 .text letCamera__9dCamera_cFl */
bool dCamera_c::letCamera(s32) {
return true;
}
/* 801806DC-80180738 17B01C 005C+00 2/2 0/0 0/0 .text setEventRecoveryTrans__9dCamera_cFs
*/
void dCamera_c::setEventRecoveryTrans(s16 param_0) {
// NONMATCHING
}
/* 80180738-80180A40 17B078 0308+00 1/1 0/0 0/0 .text runEventRecoveryTrans__9dCamera_cFv
*/
void dCamera_c::runEventRecoveryTrans() {
// NONMATCHING
}
/* 80180A40-80180AA8 17B380 0068+00 0/0 3/3 0/0 .text EventRecoverNotime__9dCamera_cFv */
void dCamera_c::EventRecoverNotime() {
field_0x110.field_0x4 = 1;
Reset(field_0x110.field_0x8.mCenter, field_0x110.field_0x8.mEye, field_0x110.field_0x8.mFovy, field_0x110.field_0x8.mBank);
}
/* 80180AA8-80180AE0 17B3E8 0038+00 0/0 0/0 24/24 .text Set__9dCamera_cF4cXyz4cXyz */
int dCamera_c::Set(cXyz i_center, cXyz i_eye) {
mCenter = i_center;
mEye = i_eye;
return 1;
}
/* 80180AE0-80180B40 17B420 0060+00 0/0 2/2 93/93 .text Set__9dCamera_cF4cXyz4cXyzfs */
int dCamera_c::Set(cXyz i_center, cXyz i_eye, f32 i_fovy, s16 i_bank) {
mCenter = i_center;
mEye = i_eye;
mFovy = i_fovy;
mBank.Val(i_bank);
return 1;
}
/* 80180B40-80180BA0 17B480 0060+00 0/0 0/0 11/11 .text Set__9dCamera_cF4cXyz4cXyzsf */
int dCamera_c::Set(cXyz i_center, cXyz i_eye, s16 i_bank, f32 i_fovy) {
mCenter = i_center;
mEye = i_eye;
mFovy = i_fovy;
mBank.Val(i_bank);
return 1;
}
/* 80180BA0-80180C18 17B4E0 0078+00 1/1 1/1 18/18 .text Reset__9dCamera_cF4cXyz4cXyzfs */
void dCamera_c::Reset(cXyz i_center, cXyz i_eye, f32 i_fovy, s16 i_bank) {
mCenter = i_center;
mEye = i_eye;
mFovy = i_fovy;
mBank = cSAngle(i_bank);
Reset();
}
/* 80180C18-80180C68 17B558 0050+00 0/0 0/0 64/64 .text Reset__9dCamera_cF4cXyz4cXyz */
void dCamera_c::Reset(cXyz i_center, cXyz i_eye) {
mCenter = i_center;
mEye = i_eye;
Reset();
}
/* 80180C68-80180D24 17B5A8 00BC+00 2/2 1/1 3/3 .text Reset__9dCamera_cFv */
int dCamera_c::Reset() {
field_0x5c.mCenter = mCenter;
field_0x5c.mEye = mEye;
field_0x5c.mFovy = mFovy;
field_0x5c.mBank = mBank;
mDirection.Val(mEye - mCenter);
field_0x5c.mDirection = mDirection;
field_0x8c = cSAngle(mDirection.U().Inv());
return 1;
}
/* 80180D24-80181000 17B664 02DC+00 2/2 0/0 0/0 .text shakeCamera__9dCamera_cFv */
// NONMATCHING - minor regalloc
f32 dCamera_c::shakeCamera() {
static f32 const wave[] = {0.4f, 0.9f, 2.1f, 3.2f};
f32 var_f31 = 0.0f;
if (mShake.field_0x10 < mShake.m_length) {
int var_r29 = mShake.field_0x10 >> 3;
int var_r27 = mShake.field_0x10 & 7;
int var_r26 = (mShake.field_0x4[var_r29] << 8) | mShake.field_0x4[var_r29 + 1];
int var_r28 = 1 << (15 - var_r27);
f32 var_f30 = 1.0f;
for (int i = 0; i < 4; i++) {
if (var_r28 & var_r26) {
var_f31 += var_f30 * wave[i];
} else {
var_f30 *= 0.43f;
}
var_r28 >>= 1;
}
mShake.field_0x10++;
var_f31 *= cM_rndFX(0.05f) + 0.95f;
f32 var_f29 = var_f31;
if (mShake.field_0x10 & 1) {
var_f31 = -var_f31;
}
cXyz sp64(mShake.m_pos);
sp64.x += cM_rndFX(0.045f);
sp64.z += cM_rndFX(0.045f);
sp64 = sp64 * var_f31;
if (field_0x6fc & 2) {
mShake.mEyeShake = sp64 * 1.0f;
mShake.field_0x24 = mShake.mEyeShake;
}
if (field_0x6fc & 0x40) {
mShake.mEyeShake = sp64 * 10.0f;
mShake.field_0x24 = mShake.mEyeShake;
}
if (field_0x6fc & 4) {
mShake.field_0x3c = var_f31 * cM_rndFX(0.12f);
}
if (field_0x6fc & 8) {
mShake.field_0x40 = cSAngle(var_f31 * cM_rndFX(0.15f));
}
if (field_0x6fc & 0x10) {
mDoGph_gInf_c::setBlureRate(var_f29 * 30.0f);
mDoGph_gInf_c::onBlure();
}
} else {
mShake.field_0x24 -= mShake.field_0x24 * 0.1f;
mShake.mEyeShake -= mShake.mEyeShake * 0.1f;
mShake.field_0x3c -= mShake.field_0x3c * 0.1f;
mShake.field_0x40 -= mShake.field_0x40 * 0.1f;
}
return var_f31;
}
/* 80453914-80453918 001F14 0004+00 1/1 0/0 0/0 .sdata2
* PatternLengthMax__Q29dCamera_c23@class$3669d_camera_cpp */
// supposed to be some anonymous static class member or something?
static const int PatternLengthMax[] = {0x00000004}; // array to make it go in correct section
/* 80181000-80181158 17B940 0158+00 0/0 1/1 0/0 .text StartShake__9dCamera_cFlPUcl4cXyz
*/
int dCamera_c::StartShake(s32 i_length, u8* i_pattern, s32 i_flags, cXyz i_pos) {
if (i_length < 0 || i_length > (PatternLengthMax[0] << 3)) {
i_length = (PatternLengthMax[0] << 3);
}
mShake.m_length = i_length;
if (i_flags & 0x20) {
field_0x6fc &= ~0x20;
mBlure.field_0x4 = mBlure.field_0x14;
}
int var_r31;
int var_r28 = i_length >> 3;
for (var_r31 = 0; var_r31 < PatternLengthMax[0]; var_r31++) {
mShake.field_0x0[var_r31] = mShake.field_0x4[var_r31] = 0;
}
for (var_r31 = 0; var_r31 < var_r28; var_r31++) {
mShake.field_0x0[var_r31] = mShake.field_0x4[var_r31] = i_pattern[var_r31];
}
var_r28 = i_length & 7;
mShake.field_0x0[var_r31] = (0xFF << (8 - var_r28)) & i_pattern[var_r31];
if (i_length == (PatternLengthMax[0] << 3)) {
mShake.field_0x4[var_r31] = mShake.field_0x0[var_r31] | (i_pattern[0] >> var_r28);
} else {
mShake.field_0x4[var_r31] = mShake.field_0x0[var_r31];
}
mShake.m_pos = i_pos.norm();
mShake.field_0x10 = 0;
field_0x6fc = i_flags;
return 1;
}
/* 80181158-80181170 17BA98 0018+00 0/0 1/1 0/0 .text StopShake__9dCamera_cFv */
int dCamera_c::StopShake() {
mShake.m_length = 0;
mShake.field_0x10 = 0;
field_0x6fc = 0;
return 1;
}
/* 80181170-801811B8 17BAB0 0048+00 1/1 2/2 10/10 .text StartBlure__9dCamera_cFiP10fopAc_ac_cff */
void dCamera_c::StartBlure(int param_0, fopAc_ac_c* i_actor, f32 i_alpha, f32 i_scale) {
mBlure.field_0x14 = param_0;
mBlure.mpActor = NULL;
mBlure.mAlpha = i_alpha;
mBlure.mScale.x = i_scale;
mBlure.mScale.y = i_scale;
mBlure.mScale.z = 0.0f;
mBlure.mpActor = i_actor;
mBlure.mPosition.x = 0.5f;
mBlure.mPosition.y = 0.5f;
mBlure.mPosition.z = 0.0f;
mBlure.field_0x8.x = 0;
mBlure.field_0x8.y = 0;
mBlure.field_0x8.z = 0;
mBlure.field_0x4 = param_0;
}
/* 801811B8-80181208 17BAF8 0050+00 0/0 0/0 1/1 .text ResetBlure__9dCamera_cFv */
void dCamera_c::ResetBlure() {
mBlure.mpActor = NULL;
mBlure.mAlpha = 0.75f;
mBlure.mPosition.x = 0.5f;
mBlure.mPosition.y = 0.5f;
mBlure.mPosition.z = 0.0f;
mBlure.mScale.x = 1.0f;
mBlure.mScale.y = 1.0f;
mBlure.mScale.z = 0.0f;
mBlure.field_0x8.x = 0;
mBlure.field_0x8.y = 0;
mBlure.field_0x8.z = 0;
mBlure.field_0x4 = 0;
mBlure.field_0x14 = 1;
}
/* 80181208-80181210 17BB48 0008+00 0/0 1/1 0/0 .text SetBlureAlpha__9dCamera_cFf */
void dCamera_c::SetBlureAlpha(f32 i_alpha) {
mBlure.mAlpha = i_alpha;
}
/* 80181210-80181220 17BB50 0010+00 0/0 1/1 0/0 .text SetBlureScale__9dCamera_cFfff */
void dCamera_c::SetBlureScale(f32 i_scalex, f32 i_scaley, f32 i_scalez) {
mBlure.mScale.x = i_scalex;
mBlure.mScale.y = i_scaley;
mBlure.mScale.z = i_scalez;
}
/* 80181220-80181278 17BB60 0058+00 0/0 1/1 0/0 .text SetBlurePosition__9dCamera_cFfff */
void dCamera_c::SetBlurePosition(f32 i_posx, f32 i_posy, f32 i_posz) {
SetBlureActor(NULL);
mBlure.mPosition.x = i_posx;
mBlure.mPosition.y = i_posy;
mBlure.mPosition.z = i_posz;
}
/* 80181278-80181280 -00001 0008+00 0/0 0/0 0/0 .text SetBlureActor__9dCamera_cFP10fopAc_ac_c */
void dCamera_c::SetBlureActor(fopAc_ac_c* i_actor) {
mBlure.mpActor = i_actor;
}
/* ############################################################################################## */
/* 80453918-8045391C 001F18 0004+00 1/1 0/0 0/0 .sdata2 @17392 */
SECTION_SDATA2 static f32 lit_17392 = 230.0f;
/* 80181280-80181490 17BBC0 0210+00 2/2 0/0 0/0 .text blureCamera__9dCamera_cFv */
void dCamera_c::blureCamera() {
// NONMATCHING
}
/* 80181490-80181500 17BDD0 0070+00 2/2 0/0 0/0 .text onHorseDush__9dCamera_cFv */
void dCamera_c::onHorseDush() {
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER2, 1, cXyz(0.0f, 1.0f, 0.0f));
StartBlure(55, mpPlayerActor, 0.75f, 1.0f);
}
/* 80181500-80181534 17BE40 0034+00 1/1 1/1 5/5 .text GetForceLockOnActor__9dCamera_cFv
*/
fopAc_ac_c* dCamera_c::GetForceLockOnActor() {
return fopAcM_SearchByID(mLockOnActorID);
}
/* 80181534-80181560 17BE74 002C+00 0/0 0/0 9/9 .text ForceLockOn__9dCamera_cFP10fopAc_ac_c */
int dCamera_c::ForceLockOn(fopAc_ac_c* i_actor) {
mForceLockTimer = 0;
mpLockOnActor = i_actor;
mLockOnActorID = fopAcM_GetID(i_actor);
return 1;
}
/* 80181560-8018159C 17BEA0 003C+00 1/1 0/0 0/0 .text ForceLockOff__9dCamera_cFUi */
int dCamera_c::ForceLockOff(fpc_ProcID i_id) {
if (i_id == mLockOnActorID || i_id == fpcM_ERROR_PROCESS_ID_e) {
mLockOnActorID = fpcM_ERROR_PROCESS_ID_e;
mpLockOnActor = NULL;
mForceLockTimer = 0;
return 1;
}
return 0;
}
/* 8018159C-801815CC 17BEDC 0030+00 0/0 0/0 7/7 .text ForceLockOff__9dCamera_cFP10fopAc_ac_c */
int dCamera_c::ForceLockOff(fopAc_ac_c* i_actor) {
if (i_actor == mpLockOnActor) {
mLockOnActorID = fpcM_ERROR_PROCESS_ID_e;
mpLockOnActor = NULL;
mForceLockTimer = 0;
return 1;
}
return 0;
}
/* 801815CC-801815F0 17BF0C 0024+00 0/0 0/0 5/5 .text dCam_getAngleY__FP12camera_class */
s16 dCam_getAngleY(camera_class* i_cam) {
return i_cam->mCamera.U();
}
/* 801815F0-80181614 17BF30 0024+00 0/0 0/0 5/5 .text dCam_getAngleX__FP12camera_class */
s16 dCam_getAngleX(camera_class* i_cam) {
return i_cam->mCamera.V();
}
/* 80181614-80181630 17BF54 001C+00 0/0 2/2 4/4 .text dCam_getControledAngleY__FP12camera_class */
s16 dCam_getControledAngleY(camera_class* i_cam) {
return i_cam->mCamera.U2();
}
/* 80181630-80181640 17BF70 0010+00 1/1 1/1 0/0 .text dCam_getCamera__Fv */
camera_class* dCam_getCamera() {
return dComIfGp_getCamera(0);
}
/* 80181640-80181664 17BF80 0024+00 0/0 43/43 91/91 .text dCam_getBody__Fv */
dCamera_c* dCam_getBody() {
return &dCam_getCamera()->mCamera;
}
/* 80181664-80181708 17BFA4 00A4+00 1/1 0/0 0/0 .text preparation__FP20camera_process_class */
static void preparation(camera_process_class* i_this) {
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 = mDoGph_gInf_c::getAspect();
camera->SetWindow(viewport->width, viewport->height);
fopCamM_SetAspect(a_this, aspect);
if (!daAlink_c::getE3Zhint()) {
dComIfGp_offCameraAttentionStatus(camera_id, 0x1002B);
}
}
/* 80181708-80181804 17C048 00FC+00 2/2 0/0 0/0 .text view_setup__FP20camera_process_class */
static void view_setup(camera_process_class* i_this) {
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->viewMtx, &view->lookat.eye, &view->lookat.center, &view->lookat.up, view->bank);
MTXCopy(view->viewMtx, view->viewMtxNoTrans);
view->viewMtxNoTrans[0][3] = 0.0f;
view->viewMtxNoTrans[1][3] = 0.0f;
view->viewMtxNoTrans[2][3] = 0.0f;
dComIfGd_setWindow(window);
dComIfGd_setViewport(viewport);
dComIfGd_setView(view);
f32 far;
if (getComStat(8)) {
far = view->far;
} else {
far = dStage_stagInfo_GetCullPoint(dComIfGp_getStageStagInfo());
}
mDoLib_clipper::setup(view->fovy, view->aspect, view->near, far);
}
/* 80181804-80181E20 17C144 061C+00 2/2 0/0 0/0 .text store__FP20camera_process_class */
static void store(camera_process_class* param_0) {
// NONMATCHING
}
/* 80181E20-80181E64 17C760 0044+00 1/1 0/0 0/0 .text Up__9dCamera_cFv */
cXyz dCamera_c::Up() {
if (chkFlag(0x10)) {
return field_0x740.field_0x18;
} else {
return mUp;
}
}
/* 80181E64-80181E98 17C7A4 0034+00 1/1 1/1 30/30 .text Eye__9dCamera_cFv */
cXyz dCamera_c::Eye() {
return mEye + mShake.mEyeShake;
}
/* 80181E98-80181ECC 17C7D8 0034+00 1/1 1/1 25/25 .text Center__9dCamera_cFv */
cXyz dCamera_c::Center() {
return mCenter + mShake.field_0x24;
}
/* 80181ECC-80181F70 17C80C 00A4+00 1/0 0/0 0/0 .text camera_execute__FP20camera_process_class */
static int camera_execute(camera_process_class* i_this) {
camera_class* a_this = (camera_class*)i_this;
preparation(i_this);
if (dDemo_c::getCamera() != NULL) {
a_this->mCamera.ResetView();
}
dComIfGp_offCameraAttentionStatus(0, 0x40);
if (a_this->mCamera.Active()) {
a_this->mCamera.Run();
} else {
a_this->mCamera.NotRun();
}
a_this->mCamera.CalcTrimSize();
store(i_this);
view_setup(i_this);
return 1;
}
/* 80181F70-801821E0 17C8B0 0270+00 1/0 0/0 0/0 .text camera_draw__FP20camera_process_class */
static int 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->TrimHeight();
window->setScissor(0.0f, trim_height, 608.0f, 448.0f - trim_height * 2.0f);
C_MTXPerspective(i_this->projMtx, i_this->fovy, i_this->aspect, i_this->near, i_this->far);
mDoMtx_lookAt(i_this->viewMtx, &i_this->lookat.eye, &i_this->lookat.center,
&i_this->lookat.up, i_this->bank);
j3dSys.setViewMtx(i_this->viewMtx);
cMtx_inverse(i_this->viewMtx, i_this->invViewMtx);
Z2GetAudience()->setAudioCamera(i_this->viewMtx, i_this->lookat.eye, i_this->lookat.center,
i_this->fovy, i_this->aspect, getComStat(0x80), camera_id,
false);
dBgS_GndChk gndchk;
gndchk.OnWaterGrp();
gndchk.SetPos(&i_this->lookat.eye);
f32 cross = dComIfG_Bgsp().GroundCross(&gndchk);
if (cross != -1000000000.0f) {
if (dComIfG_Bgsp().ChkGrpInf(gndchk, 0x100)) {
mDoAud_getCameraMapInfo(6);
} else {
mDoAud_getCameraMapInfo(dComIfG_Bgsp().GetMtrlSndId(gndchk));
}
mDoAud_setCameraGroupInfo(dComIfG_Bgsp().GetGrpSoundId(gndchk));
Vec spDC;
spDC.x = i_this->lookat.eye.x;
spDC.y = cross;
spDC.z = i_this->lookat.eye.z;
Z2AudioMgr::getInterface()->setCameraPolygonPos(&spDC);
} else {
Z2AudioMgr::getInterface()->setCameraPolygonPos(NULL);
}
MTXCopy(i_this->viewMtx, i_this->viewMtxNoTrans);
i_this->viewMtxNoTrans[0][3] = 0.0f;
i_this->viewMtxNoTrans[1][3] = 0.0f;
i_this->viewMtxNoTrans[2][3] = 0.0f;
cMtx_concatProjView(i_this->projMtx, i_this->viewMtx, i_this->projViewMtx);
body->Draw();
return 1;
}
/* 801821E0-80182260 17CB20 0080+00 1/0 0/0 0/0 .text init_phase1__FP12camera_class */
static int 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));
dComIfGp_setWindowNum(0);
i_this->field_0x238 = 0;
i_this->field_0x22f = 71;
i_this->mCamera.field_0xb0c = 0;
return cPhs_NEXT_e;
}
/* 80182260-80182454 17CBA0 01F4+00 1/0 0/0 0/0 .text init_phase2__FP12camera_class */
static int init_phase2(camera_class* i_this) {
camera_process_class* a_this = (camera_process_class*)i_this;
dCamera_c* body = &i_this->mCamera;
int camera_id = get_camera_id(i_this);
i_this->field_0x238++;
fopAc_ac_c* player = (fopAc_ac_c*)get_player_actor(i_this);
if (player == NULL) {
return cPhs_INIT_e;
}
dBgS_GndChk gndchk;
cXyz spA4(player->current.pos);
spA4.y += 50.0f;
gndchk.SetPos(&spA4);
if (dComIfG_Bgsp().GroundCross(&gndchk) == -1000000000.0f) {
#if DEBUG
if (i_this->field_0x238 < 100) {
if (i_this->field_0x238 % 100 == 0 && i_this->field_0x238 != 0) {
OS_REPORT("camera: can not found floor... %d\n", i_this->field_0x238);
}
return cPhs_INIT_e;
}
OS_REPORT("\ncamera: Warning: give up to get floor info !!\n\n");
#else
return cPhs_INIT_e;
#endif
}
fopAcM_setStageLayer(player);
dComIfGp_setWindowNum(1);
new (body) dCamera_c(i_this);
f32 var_f30 = 160000.0f;
if (dComIfGp_getStage()->getStagInfo() != NULL) {
dStage_stageDt_c* stage_dt = dComIfGp_getStage();
stage_dt->getStagInfo();
var_f30 = stage_dt->getStagInfo()->field_0x4;
}
get_window(camera_id)->getViewPort();
fopCamM_SetNear(i_this, 1.0f);
fopCamM_SetFar(i_this, var_f30);
fopCamM_SetFovy(i_this, 30.0f);
fopCamM_SetAspect(i_this, mDoGph_gInf_c::getAspect());
fopCamM_SetCenter(i_this, player->current.pos.x, player->current.pos.y, player->current.pos.z);
fopCamM_SetBank(i_this, 0);
store(a_this);
view_setup(a_this);
i_this->mCamera.field_0xb0c = 1;
i_this->field_0x238 = 0;
dComIfGp_getAttention()->Init(player, PAD_1);
return cPhs_NEXT_e;
}
/* 80182454-80182484 17CD94 0030+00 1/0 0/0 0/0 .text camera_create__FP12camera_class */
static int camera_create(camera_class* i_this) {
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);
}
/* 80182484-801824C0 17CDC4 003C+00 1/0 0/0 0/0 .text camera_delete__FP20camera_process_class */
// NONMATCHING - equivalent, instructions swapped
static int camera_delete(camera_process_class* i_this) {
dCamera_c* camera = &((camera_class*)i_this)->mCamera;
camera->~dCamera_c();
dComIfGp_setCamera(0, NULL);
return 1;
}
/* 801824C0-801824C8 17CE00 0008+00 1/0 0/0 0/0 .text is_camera_delete__FPv */
static int is_camera_delete(void* i_this) {
return 1;
}
/* 801824C8-80182560 17CE08 0098+00 1/1 0/0 0/0 .text Init__14dCamForcusLineFv */
void dCamForcusLine::Init() {
field_0x49 = 0;
field_0x48 = 1;
field_0x38 = cXyz(320.0f, 240.0f, 0.0f);
field_0x44.r = 0xFF;
field_0x44.g = 0xFF;
field_0x44.b = 0xFF;
field_0x44.a = 0x60;
field_0x4c = 100;
field_0x50 = 100;
field_0x54 = 100;
field_0x58 = 0x50;
field_0x5a = 0;
field_0x5c = 4;
field_0x5e = 4;
field_0x68 = 180.0f;
field_0x6c = 0.0f;
field_0x60 = 180.0f;
field_0x64 = 60.0f;
}
/* 80182560-801825E4 17CEA0 0084+00 1/1 0/0 0/0 .text Draw__14dCamForcusLineFv */
void dCamForcusLine::Draw() {
if (field_0x49) {
if (field_0x48 == 0) {
mEffectLine.initRnd(field_0x4c, field_0x50, field_0x54);
}
mEffectLine.update(field_0x38, field_0x44, field_0x58, field_0x5a, field_0x5c, field_0x5e, field_0x60, field_0x64, field_0x68, field_0x6c);
}
}
/* 801825E4-801825FC 17CF24 0018+00 2/2 0/0 0/0 .text Off__14dCamForcusLineFv */
bool dCamForcusLine::Off() {
field_0x49 = 0;
return field_0x49 == 0;
}
/* 803BA6E4-803BA6F8 -00001 0014+00 2/0 0/0 0/0 .data method */
static leafdraw_method_class method = {
(process_method_func)camera_create,
(process_method_func)camera_delete,
(process_method_func)camera_execute,
(process_method_func)is_camera_delete,
(process_method_func)camera_draw,
};
/* 803BA6F8-803BA73C -00001 0044+00 0/0 0/0 1/0 .data g_profile_CAMERA */
extern camera_process_profile_definition g_profile_CAMERA = {
fpcLy_CURRENT_e,
11,
fpcPi_CURRENT_e,
PROC_CAMERA,
&g_fpcLf_Method.base,
sizeof(dCamera_c),
0,
0,
&g_fopVw_Method,
0,
&g_fopCam_Method,
0,
0,
0,
0,
0,
&method,
0,
};
/* 803BA73C-803BA798 -00001 0044+18 0/0 0/0 1/0 .data g_profile_CAMERA2 */
extern camera_process_profile_definition g_profile_CAMERA2 = {
fpcLy_CURRENT_e,
11,
fpcPi_CURRENT_e,
PROC_CAMERA2,
&g_fpcLf_Method.base,
sizeof(dCamera_c),
0,
0,
&g_fopVw_Method,
1,
&g_fopCam_Method,
0,
0,
0,
0,
0,
&method,
0,
};