Files
tp/src/d/d_ev_camera.cpp
T
2025-05-27 02:50:32 -07:00

4164 lines
152 KiB
C++

//
// Generated By: dol2asm
// Translation Unit: d/d_ev_camera
//
#include "d/d_ev_camera.h"
#include "d/d_debug_viewer.h"
#include "d/d_demo.h"
#include "m_Do/m_Do_controller_pad.h"
#include "d/d_camera.h"
#include "d/d_camera.h"
#include "d/actor/d_a_midna.h"
#include "d/actor/d_a_player.h"
#include "m_Do/m_Do_lib.h"
#include "d/d_drawlist.h"
#include "d/actor/d_a_alink.h"
namespace {
/* 800889F8-80088A7C 083338 0084+00 1/1 0/0 0/0 .text isStageEvent__25@unnamed@d_ev_camera_cpp@Fi */
static bool isStageEvent(int param_0) {
dStage_MapEventInfo_c* info = dComIfGp_getStage()->getMapEventInfo();
if (info != NULL) {
for (int i = 0; i < info->num; i++) {
if (param_0 == info->m_entries[i].field_0x4) {
return true;
}
}
}
return false;
}
} // namespace
/* 80088A7C-80088BBC 0833BC 0140+00 0/0 15/15 2/2 .text StartEventCamera__9dCamera_cFiie */
int dCamera_c::StartEventCamera(int param_0, int param_1, ...) {
if (chkFlag(0x20000000)) {
return 0;
}
mEventData.field_0x14 = param_1;
mEventData.field_0x18 = param_0;
va_list args;
va_start(args, param_1);
for (int i = 0; i < 8; i++) {
char* param_name = va_arg(args, char*);
if (param_name != NULL) {
strcpy(mEventData.mEventParams[i].name, param_name);
mEventData.mEventParams[i].field_0x10 = va_arg(args, int);
mEventData.mEventParams[i].value = va_arg(args, int);
} else {
mEventData.mEventParams[i].name[0] = 0;
break;
}
}
va_end(args);
setFlag(0x20000000);
mCurCamStyleTimer = 0;
mEventData.field_0x0 = 0;
return 1;
}
/* 80088BBC-80088C24 0834FC 0068+00 0/0 3/3 4/4 .text EndEventCamera__9dCamera_cFi */
int dCamera_c::EndEventCamera(int param_1) {
if (!chkFlag(0x20000000)) {
return 0;
}
if (mEventData.field_0x14 == -1 || mEventData.field_0x14 == param_1) {
clrFlag(0x20000000);
mEventData.field_0x0 = 1;
if (dComIfGp_getEvent().runCheck()) {
dComIfGp_getEventManager().setCameraPlay(2);
}
return 1;
}
return 0;
}
/* 80088C24-80088CB0 083564 008C+00 10/10 0/0 0/0 .text searchEventArgData__9dCamera_cFPc */
int dCamera_c::searchEventArgData(char* i_eventName) {
int i;
bool found_event = false;
for (i = 0; i < 8; i++) {
if (*mEventData.mEventParams[i].name == 0) {
break;
}
if (strcmp(mEventData.mEventParams[i].name, i_eventName) == 0) {
found_event = true;
break;
}
}
return found_event ? i : -1;
}
/* 80088CB0-80088D90 0835F0 00E0+00 3/3 1/1 0/0 .text getEvIntData__9dCamera_cFPiPc */
bool dCamera_c::getEvIntData(int* i_data, char* i_event) {
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
return 0;
}
if (mEventData.mEventParams[index].field_0x10 < 0) {
*i_data = mEventData.mEventParams[index].value;
} else {
*i_data = *(int*)mEventData.mEventParams[index].value;
}
} else if (dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event) != 0) {
*i_data = *dComIfGp_evmng_getMyIntegerP(mEventData.field_0x4, i_event);
} else {
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: (int) not found\n", i_event);
}
#endif
mEventData.field_0x10 = 1;
return 0;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %d\n", i_event, *i_data);
}
#endif
return 1;
}
/* 80088D90-80088E58 0836D0 00C8+00 0/0 1/1 0/0 .text getEvFloatData__9dCamera_cFPfPc */
bool dCamera_c::getEvFloatData(f32* i_data, char* i_event) {
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
return 0;
}
*i_data = *(f32*)mEventData.mEventParams[index].value;
} else if (dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event) != 0) {
*i_data = *dComIfGp_evmng_getMyFloatP(mEventData.field_0x4, i_event);
} else {
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: (float) not found\n", i_event);
}
#endif
mEventData.field_0x10 = 1;
return 0;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %f\n", i_event, *i_data);
}
#endif
return 1;
}
/* 80088E58-80088F1C 083798 00C4+00 4/4 0/0 0/0 .text getEvFloatListData__9dCamera_cFPPfPc */
int dCamera_c::getEvFloatListData(f32** i_data, char* i_event) {
int num = 0;
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
return 0;
}
*i_data = (f32*)mEventData.mEventParams[index].value;
num = mEventData.mEventParams[index].field_0x10;
} else if ((num = dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event))) {
*i_data = dComIfGp_evmng_getMyFloatP(mEventData.field_0x4, i_event);
} else {
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: (float[]) not found\n", i_event);
}
#endif
mEventData.field_0x10 = 1;
return 0;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %f ... [%d]\n", i_event, **i_data, num);
}
#endif
return num;
}
/* 80088F1C-80088FE0 08385C 00C4+00 1/1 0/0 0/0 .text getEvXyzListData__9dCamera_cFPP4cXyzPc */
int dCamera_c::getEvXyzListData(cXyz** i_data, char* i_event) {
int num = 0;
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
return 0;
}
*i_data = (cXyz*)mEventData.mEventParams[index].value;
return mEventData.mEventParams[index].field_0x10;
} else if ((num = dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event))) {
*i_data = dComIfGp_evmng_getMyXyzP(mEventData.field_0x4, i_event);
} else {
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: (xyz[]) not found\n", i_event);
}
#endif
mEventData.field_0x10 = 1;
return 0;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %f %f %f ... [%d]\n", i_event, (*i_data)->x, (*i_data)->y, (*i_data)->z, num);
}
#endif
return num;
}
/* 80088FE0-8008908C 083920 00AC+00 1/1 0/0 0/0 .text getEvStringPntData__9dCamera_cFPc */
char* dCamera_c::getEvStringPntData(char* i_event) {
char* string = NULL;
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
return 0;
}
string = (char*)mEventData.mEventParams[index].value;
} else if (dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event)) {
string = dComIfGp_evmng_getMyStringP(mEventData.field_0x4, i_event);
} else {
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: (string) not found\n", i_event);
}
#endif
mEventData.field_0x10 = 1;
return 0;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %s\n", i_event, string);
}
#endif
return string;
}
/* 8008908C-80089154 0839CC 00C8+00 20/20 5/5 0/0 .text getEvIntData__9dCamera_cFPiPci */
bool dCamera_c::getEvIntData(int* i_data, char* i_event, int param_2) {
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
*i_data = param_2;
} else {
*i_data = *(int*)mEventData.mEventParams[index].value;
}
} else if (dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event) != 0) {
*i_data = *dComIfGp_evmng_getMyIntegerP(mEventData.field_0x4, i_event);
} else {
*i_data = param_2;
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %d (d)\n", i_event, *i_data);
}
#endif
return 0;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %d\n", i_event, *i_data);
}
#endif
return 1;
}
/* 80089154-8008922C 083A94 00D8+00 11/11 1/1 0/0 .text getEvFloatData__9dCamera_cFPfPcf */
bool dCamera_c::getEvFloatData(f32* i_data, char* i_event, f32 param_2) {
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
*i_data = param_2;
} else {
*i_data = *(f32*)mEventData.mEventParams[index].value;
}
} else if (dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event) != 0) {
*i_data = *dComIfGp_evmng_getMyFloatP(mEventData.field_0x4, i_event);
} else {
*i_data = param_2;
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %f (d)\n", i_event, *i_data);
}
#endif
return 0;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %f\n", i_event, *i_data);
}
#endif
return 1;
}
/* 8008922C-8008933C 083B6C 0110+00 10/10 0/0 0/0 .text getEvXyzData__9dCamera_cFP4cXyzPc4cXyz */
bool dCamera_c::getEvXyzData(cXyz* i_data, char* i_event, cXyz param_2) {
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
*i_data = param_2;
} else {
*i_data = *(cXyz*)mEventData.mEventParams[index].value;
}
} else if (dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event) != 0) {
*i_data = *dComIfGp_evmng_getMyXyzP(mEventData.field_0x4, i_event);
} else {
*i_data = param_2;
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %f %f %f (d)\n", i_event, i_data->x, i_data->y, i_data->z);
}
#endif
return 0;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %f %f %f\n", i_event, i_data->x, i_data->y, i_data->z);
}
#endif
return 1;
}
/* 8008933C-8008941C 083C7C 00E0+00 7/7 1/1 0/0 .text getEvStringData__9dCamera_cFPcPcPc */
bool dCamera_c::getEvStringData(char* i_data, char* i_event, char* param_2) {
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
strcpy(i_data, param_2);
} else {
strcpy(i_data, (char*)mEventData.mEventParams[index].value);
}
} else if (dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event) != 0) {
strcpy(i_data, dComIfGp_evmng_getMyStringP(mEventData.field_0x4, i_event));
} else {
strcpy(i_data, param_2);
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %s (d)\n", i_event, i_data);
}
#endif
return 0;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %s\n", i_event, i_data);
}
#endif
return 1;
}
/* 8008941C-800894C4 083D5C 00A8+00 1/1 0/0 0/0 .text getEvStringPntData__9dCamera_cFPcPc */
char* dCamera_c::getEvStringPntData(char* i_event, char* param_1) {
char* string = NULL;
if (chkFlag(0x20000000)) {
int index = searchEventArgData(i_event);
if (index == -1) {
string = param_1;
} else {
string = (char*)mEventData.mEventParams[index].value;
}
} else if (dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, i_event)) {
string = dComIfGp_evmng_getMyStringP(mEventData.field_0x4, i_event);
} else {
string = param_1;
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %s (d)\n", i_event, string);
}
#endif
return string;
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
OS_REPORT("camera: event: %16s: %s\n", i_event, string);
}
#endif
return string;
}
/* 800894C4-800895F4 083E04 0130+00 7/7 1/1 0/0 .text getEvActor__9dCamera_cFPc */
fopAc_ac_c* dCamera_c::getEvActor(char* i_event) {
char* string = getEvStringPntData(i_event);
if (string == NULL) {
return NULL;
}
fopAc_ac_c* actor;
if (*(u32*)string == '@PLA') {
actor = mpPlayerActor;
} else if (*(u32*)string == '@STA') {
actor = dComIfGp_event_getPt1();
} else if (*(u32*)string == '@PAR') {
actor = dComIfGp_event_getPt2();
} else if (*(u32*)string == '@TAL') {
actor = dComIfGp_event_getTalkPartner();
} else if (*(u32*)string == '@DOO') {
actor = dComIfGp_event_getDoorPartner();
} else if (*(u32*)string == '@TAR' || *(u32*)string == '@ITE') {
actor = dComIfGp_event_getItemPartner();
} else if (*(u32*)string == 'Link') {
actor = dComIfGp_getLinkPlayer();
} else {
actor = fopAcM_searchFromName4Event(string, -1);
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
if (actor != NULL) {
char name[16];
fopAcM_getNameString(actor, name);
OS_REPORT("camera: event: = %s\n", name);
} else {
OS_REPORT("camera: event: = (Who?)\n");
}
}
#endif
return actor;
}
/* 800895F4-80089730 083F34 013C+00 8/8 1/1 0/0 .text getEvActor__9dCamera_cFPcPc */
fopAc_ac_c* dCamera_c::getEvActor(char* i_event, char* param_1) {
char string[16];
string[0] = 0;
getEvStringData(string, i_event, param_1);
char* name_str = string;
fopAc_ac_c* actor;
if (*(u32*)string == '@PLA') {
actor = mpPlayerActor;
} else if (*(u32*)string == '@STA') {
actor = dComIfGp_event_getPt1();
} else if (*(u32*)string == '@PAR') {
actor = dComIfGp_event_getPt2();
} else if (*(u32*)string == '@TAL') {
actor = dComIfGp_event_getTalkPartner();
} else if (*(u32*)string == '@DOO') {
actor = dComIfGp_event_getDoorPartner();
} else if (*(u32*)string == '@TAR' || *(u32*)string == '@ITE') {
actor = dComIfGp_event_getItemPartner();
} else if (*(u32*)string == 'Link') {
actor = dComIfGp_getLinkPlayer();
} else {
actor = fopAcM_searchFromName4Event(name_str, -1);
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
if (actor != NULL) {
char name[16];
fopAcM_getNameString(actor, name);
OS_REPORT("camera: event: = %s\n", name);
} else {
OS_REPORT("camera: event: = (Who?)\n");
}
}
#endif
return actor;
}
/* 80089730-800897E8 084070 00B8+00 0/0 3/0 0/0 .text pauseEvCamera__9dCamera_cFv */
bool dCamera_c::pauseEvCamera() {
struct mWork::event* event = &mWork.event;
if (mCurCamStyleTimer == 0) {
Reset();
field_0x158.field_0x0 = 1;
event->field_0x0 = getEvIntData(&event->field_0x8, "Timer", -1);
getEvIntData(&event->field_0x4, "Stay", 0);
}
if (event->field_0x4 != 0) {
setFlag(1);
}
if (event->field_0x0 && mCurCamStyleTimer < event->field_0x8) {
return false;
}
return true;
}
namespace {
/* 804253B4-804253C0 0520D4 000C+00 2/3 0/0 0/0 .bss WolfAdditionVec__25@unnamed@d_ev_camera_cpp@*/
static cXyz WolfAdditionVec(0.0f, -70.0f, 70.0f);
}
/* 800897E8-8008A510 084128 0D28+00 0/0 1/0 0/0 .text fixedFrameEvCamera__9dCamera_cFv */
bool dCamera_c::fixedFrameEvCamera() {
struct mWork::fixedFrame* fframe_p = &mWork.fixedFrame;
if (mCurCamStyleTimer == 0) {
cXyz sp38, sp44;
getEvXyzData(&sp44, "Eye", mEye);
getEvXyzData(&sp38, "Center", mCenter);
getEvXyzData(&fframe_p->mBasePos, "BasePos", cXyz::Zero);
getEvFloatData(&fframe_p->field_0x1c, "Fovy", mFovy);
fframe_p->field_0x30 = getEvFloatData(&fframe_p->field_0x20, "Bank", 0.0f);
fframe_p->field_0x0 = getEvIntData(&fframe_p->mTimer, "Timer", -1);
getEvStringData(fframe_p->mRelUseMask, "RelUseMask", "oo");
#ifdef DEBUG
if (strlen(fframe_p->mRelUseMask) != 2) {
OSReport("camera: event: bad length -> xx\n");
strcpy(fframe_p->mRelUseMask, "xx");
JUTAssertion::showAssert(JUTAssertion::getSDevice(), "d_ev_camera.cpp", 0x32e, "0");
OSPanic("d_ev_camera.cpp", 0x32e, "Halt");
}
#endif
fframe_p->mpRelActor = getEvActor("RelActor");
if (fframe_p->mpRelActor && fframe_p->mRelUseMask[0] == 'o') {
fframe_p->field_0x10 = relationalPos(fframe_p->mpRelActor, &sp38);
} else if (fframe_p->mpRelActor && fframe_p->mRelUseMask[0] == 'w') {
if (mIsWolf == 1) {
sp38 += WolfAdditionVec;
}
fframe_p->field_0x10 = relationalPos(fframe_p->mpRelActor, &sp38);
} else if (fframe_p->mpRelActor && fframe_p->mRelUseMask[0] == 'W') {
if (mIsWolf == 1) {
sp38 -= WolfAdditionVec;
}
fframe_p->field_0x10 = relationalPos(fframe_p->mpRelActor, &sp38);
} else if (fframe_p->mRelUseMask[0] == 'n') {
cSGlobe sg28 = mEye - positionOf(fframe_p->mpRelActor);
cSAngle sa260 = sg28.U() - directionOf(fframe_p->mpRelActor);
if (sa260 < cSAngle::_0) {
sp38.x = -sp38.x;
}
fframe_p->field_0x10 = relationalPos(fframe_p->mpRelActor, &sp38);
} else if (fframe_p->mRelUseMask[0] == 'p') {
cXyz mRelPos = relationalPos(fframe_p->mpRelActor, &sp38);
f32 fVar1 = cXyz(mRelPos - positionOf(mpPlayerActor)).abs();
sp38.x = -sp38.x;
mRelPos = relationalPos(fframe_p->mpRelActor, &sp38);
f32 fVar2 = cXyz(mRelPos - positionOf(mpPlayerActor)).abs();
if (fVar1 > fVar2) {
sp38.x = -sp38.x;
}
fframe_p->field_0x10 = relationalPos(fframe_p->mpRelActor, &sp38);
} else if (fframe_p->mRelUseMask[0] == 't') {
fframe_p->field_0x10 = attentionPos(fframe_p->mpRelActor) + sp38;
} else {
fframe_p->field_0x10 = sp38;
}
if (fframe_p->mpRelActor && fframe_p->mRelUseMask[1] == 'o') {
fframe_p->field_0x4 = relationalPos(fframe_p->mpRelActor, &sp44);
} else if (fframe_p->mpRelActor && fframe_p->mRelUseMask[1] == 'w') {
if (mIsWolf == 1) {
sp44 += WolfAdditionVec;
}
fframe_p->field_0x4 = relationalPos(fframe_p->mpRelActor, &sp44);
} else if (fframe_p->mpRelActor && fframe_p->mRelUseMask[1] == 'W') {
if (mIsWolf == 1) {
sp44 -= WolfAdditionVec;
}
fframe_p->field_0x4 = relationalPos(fframe_p->mpRelActor, &sp44);
} else if (fframe_p->mpRelActor && fframe_p->mRelUseMask[1] == 'r') {
if ((field_0xac & 1) != 0) {
sp44.x = -sp44.x;
}
fframe_p->field_0x4 = relationalPos(fframe_p->mpRelActor, &sp44);
if (lineBGCheck(&fframe_p->field_0x10, &fframe_p->field_0x4, 0x4007)) {
sp44.x = -sp44.x;
}
fframe_p->field_0x4 = relationalPos(fframe_p->mpRelActor, &sp44);
} else if (fframe_p->mRelUseMask[1] == 'n') {
cSGlobe cStack_260 = mEye - positionOf(fframe_p->mpRelActor);
cSAngle cStack_26c = cStack_260.U() - directionOf(fframe_p->mpRelActor);
if (cStack_26c < cSAngle::_0) {
sp44.x = -sp44.x;
}
fframe_p->field_0x4 = relationalPos(fframe_p->mpRelActor, &sp44);
if (lineBGCheck(&fframe_p->field_0x10, &fframe_p->field_0x4, 0x4007)) {
sp44.x = -sp44.x;
}
} else if (fframe_p->mRelUseMask[1] == 'p') {
cXyz mRelPos2 = relationalPos(fframe_p->mpRelActor, &sp44);
f32 fVar3 = cXyz(mRelPos2 - positionOf(mpPlayerActor)).abs();
sp44.x = -sp44.x;
mRelPos2 = relationalPos(fframe_p->mpRelActor, &sp44);
f32 fVar4 = cXyz(mRelPos2 - positionOf(mpPlayerActor)).abs();
if (fVar3 > fVar4) {
sp44.x = -sp44.x;
}
fframe_p->field_0x4 = relationalPos(fframe_p->mpRelActor, &sp44);
} else if (fframe_p->mRelUseMask[1] == 116) {
fframe_p->field_0x4 = attentionPos(fframe_p->mpRelActor) + sp44;
} else {
fframe_p->field_0x4 = sp44;
}
field_0x158.field_0x0 = true;
}
field_0x5c.mCenter = fframe_p->field_0x10;
field_0x5c.mEye = fframe_p->field_0x4;
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
field_0x5c.mFovy = fframe_p->field_0x1c;
if (fframe_p->field_0x30) {
field_0x5c.mBank = cAngle::d2s(fframe_p->field_0x20);
setFlag(0x400);
}
if (fframe_p->field_0x0 && mCurCamStyleTimer < fframe_p->mTimer) {
return 0;
}
return 1;
}
/* 8008A510-8008A974 084E50 0464+00 0/0 1/0 0/0 .text stokerEvCamera__9dCamera_cFv */
bool dCamera_c::stokerEvCamera() {
struct mWork::stoker* stoker_p = &mWork.stoker;
if (mCurCamStyleTimer == 0) {
cXyz unused_0, unused_1;
getEvXyzData(&stoker_p->field_0x4, "EyeGap", cXyz::Zero);
getEvXyzData(&stoker_p->field_0x10, "CtrGap", cXyz::Zero);
getEvFloatData(&stoker_p->field_0x20, "EyeCus", 1.0f);
getEvFloatData(&stoker_p->field_0x1c, "CtrCus", 1.0f);
getEvFloatData(&stoker_p->field_0x24, "Fovy", mFovy);
stoker_p->field_0x1 = getEvFloatData(&stoker_p->field_0x28, "Bank", 0.0f);
stoker_p->field_0x0 = getEvIntData(&stoker_p->field_0x40, "Timer", -1);
stoker_p->field_0x2c = getEvActor("Stoker", "@STARTER");
stoker_p->field_0x30 = getEvActor("Target", "@PLAYER");
if (stoker_p->field_0x2c == 0 || stoker_p->field_0x30 == NULL) {
OS_REPORT("camera: event: error: stoker or target actor missing\n");
return 1;
}
stoker_p->field_0x34 = fopAcM_GetID(stoker_p->field_0x2c);
stoker_p->field_0x38 = fopAcM_GetID(stoker_p->field_0x30);
field_0x158.field_0x0 = true;
}
cSGlobe cStack_d0;
if (stoker_p->field_0x30) {
if (fopAcM_SearchByID(stoker_p->field_0x38) == NULL) {
OS_REPORT("camera: event: error: target actor dead\n");
return 1;
}
cStack_d0.Val(stoker_p->field_0x10);
cStack_d0.V(cStack_d0.V() + stoker_p->field_0x30->shape_angle.x);
cStack_d0.U(cStack_d0.U() + stoker_p->field_0x30->shape_angle.y);
cXyz cStack_38 = attentionPos(stoker_p->field_0x30) + cStack_d0.Xyz();
field_0x5c.mCenter += (cStack_38 - field_0x5c.mCenter) * stoker_p->field_0x1c;
}
if (stoker_p->field_0x2c) {
if (!fopAcM_SearchByID(stoker_p->field_0x34)) {
OS_REPORT("camera: event: error: stoker actor dead\n");
return 1;
}
cStack_d0.Val(stoker_p->field_0x4);
cStack_d0.V(cStack_d0.V() + stoker_p->field_0x2c->shape_angle.x);
cStack_d0.U(cStack_d0.U() + stoker_p->field_0x2c->shape_angle.y);
cXyz tmp_vec = attentionPos(stoker_p->field_0x2c) + cStack_d0.Xyz();
field_0x5c.mEye += (tmp_vec - field_0x5c.mEye) * stoker_p->field_0x20;
}
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
field_0x5c.mFovy = stoker_p->field_0x24;
if (stoker_p->field_0x1) {
cAngle this_00;
field_0x5c.mBank = this_00.d2s(stoker_p->field_0x28);
setFlag(0x400);
}
if (stoker_p->field_0x0 && mCurCamStyleTimer < stoker_p->field_0x40) {
return 0;
}
return 1;
}
/* 8008A974-8008B9B0 0852B4 103C+00 0/0 1/0 0/0 .text rollingEvCamera__9dCamera_cFv */
bool dCamera_c::rollingEvCamera() {
struct mWork::rolling* rolling_p = &mWork.rolling;
if (mCurCamStyleTimer == 0) {
getEvXyzData(&rolling_p->mEye, "Eye", mEye);
getEvXyzData(&rolling_p->mCenter, "Center", mCenter);
getEvFloatData(&rolling_p->mCtrCus, "CtrCus", 1.0f);
getEvIntData(&rolling_p->mTransType, "TransType", 0);
getEvFloatData(&rolling_p->mFovy, "Fovy", mFovy);
rolling_p->field_0x1 = getEvFloatData(&rolling_p->mBank, "Bank", 0.0f);
getEvFloatData(&rolling_p->mRoll, "Roll", 2.0f);
getEvFloatData(&rolling_p->mRadiusAdd, "RadiusAdd", 0.0f);
cSGlobe cStack_2ac = rolling_p->mEye - rolling_p->mCenter;
getEvFloatData(&rolling_p->mLatitude, "Latitude", cStack_2ac.V().Degree());
rolling_p->field_0x0 = getEvIntData(&rolling_p->mTimer, "Timer", -1);
getEvStringData(rolling_p->mRelActor, "RelUseMask", "oo");
rolling_p->mpRelActor = getEvActor("RelActor");
if (rolling_p->mpRelActor) {
if (rolling_p->mRelActor[0] == 'o') {
rolling_p->field_0x10 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
} else if (rolling_p->mRelActor[0] == 'n') {
cSGlobe cStack_2b4 = mEye - positionOf(rolling_p->mpRelActor);
cSAngle acStack_2f0 = cStack_2b4.U() - directionOf(rolling_p->mpRelActor);
if (acStack_2f0 < cSAngle::_0) {
rolling_p->mCenter.x = -rolling_p->mCenter.x;
}
rolling_p->field_0x10 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
} else if (rolling_p->mRelActor[0] == 'p') {
cXyz sp2E0 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
f32 fVar1 = cXyz(sp2E0 - positionOf(mpPlayerActor)).abs();
rolling_p->mCenter.x = -rolling_p->mCenter.x;
sp2E0 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
f32 fVar2 = cXyz(sp2E0 - positionOf(mpPlayerActor)).abs();
if (fVar1 > fVar2) {
rolling_p->mCenter.x = -rolling_p->mCenter.x;
}
rolling_p->field_0x10 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
}
} else {
rolling_p->field_0x10 = rolling_p->mCenter;
}
if (rolling_p->mpRelActor && rolling_p->mRelActor[1] == 'o') {
rolling_p->field_0x4 = relationalPos(rolling_p->mpRelActor, &rolling_p->mEye);
} else if (rolling_p->mpRelActor && rolling_p->mRelActor[1] == 'r') {
if ((field_0xac & 1) != 0) {
rolling_p->mEye.x = -rolling_p->mEye.x;
}
rolling_p->field_0x4 = relationalPos(rolling_p->mpRelActor, &rolling_p->mEye);
if (lineBGCheck(&rolling_p->field_0x10, &rolling_p->field_0x4, 0x4007)) {
rolling_p->mEye.x = -rolling_p->mEye.x;
}
rolling_p->field_0x4 = relationalPos(rolling_p->mpRelActor, &rolling_p->mEye);
} else if (rolling_p->mRelActor[1] == 'n') {
cSGlobe cStack_2e8 = mEye - positionOf(rolling_p->mpRelActor);
cSAngle acStack_2f8 = cStack_2e8.U() - directionOf(rolling_p->mpRelActor);;
if (acStack_2f8 < cSAngle::_0) {
rolling_p->mEye.x = -rolling_p->mEye.x;
}
rolling_p->field_0x4 = relationalPos(rolling_p->mpRelActor, &rolling_p->mEye);
} else if (rolling_p->mRelActor[1] == 'p') {
cXyz sp2D4 = relationalPos(rolling_p->mpRelActor, &rolling_p->mEye);
f32 fVar3 = cXyz(sp2D4 - positionOf(mpPlayerActor)).abs();
rolling_p->mEye.x = -rolling_p->mEye.x;
sp2D4 = relationalPos(rolling_p->mpRelActor, &rolling_p->mEye);
f32 fVar4 = cXyz(sp2D4 - positionOf(mpPlayerActor)).abs();
if (fVar3 > fVar4) {
rolling_p->mEye.x = -rolling_p->mEye.x;
}
rolling_p->field_0x4 = relationalPos(rolling_p->mpRelActor, &rolling_p->mEye);
} else {
rolling_p->field_0x4 = rolling_p->mEye;
}
field_0x158.field_0x0 = true;
}
if ((rolling_p->mTransType == 1 || rolling_p->mTransType == 2) && rolling_p->mpRelActor) {
if (rolling_p->mRelActor[0] == 'o') {
rolling_p->field_0x10 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
} else if (rolling_p->mRelActor[0] == 'n') {
cSGlobe cStack_2f0 = mEye - positionOf(rolling_p->mpRelActor);
cSAngle acStack_2fc = cStack_2f0.U() - directionOf(rolling_p->mpRelActor);
if (acStack_2fc < cSAngle::_0) {
rolling_p->mCenter.x = -rolling_p->mCenter.x;
}
rolling_p->field_0x10 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
} else if (rolling_p->mRelActor[0] == 'p') {
cXyz sp2C8 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
f32 fVar5 = cXyz(sp2C8 - positionOf(mpPlayerActor)).abs();
rolling_p->mCenter.x = -rolling_p->mCenter.x;
sp2C8 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
f32 fVar6 = cXyz(sp2C8 - positionOf(mpPlayerActor)).abs();
if (fVar5 > fVar6) {
rolling_p->mCenter.x = -rolling_p->mCenter.x;
}
rolling_p->field_0x10 = relationalPos(rolling_p->mpRelActor, &rolling_p->mCenter);
}
}
field_0x5c.mCenter += (rolling_p->field_0x10 - field_0x5c.mCenter) * rolling_p->mCtrCus;
field_0x5c.mDirection.Val(rolling_p->field_0x4 - rolling_p->field_0x10);
if (rolling_p->mTransType == 2) {
field_0x5c.mDirection.V(rolling_p->mLatitude);
}
field_0x5c.mDirection.U(field_0x5c.mDirection.U() + (cSAngle)(mCurCamStyleTimer * rolling_p->mRoll));
field_0x5c.mDirection.R(mCurCamStyleTimer * rolling_p->mRadiusAdd + field_0x5c.mDirection.R());
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = rolling_p->mFovy;
if (rolling_p->field_0x1) {
cAngle this_00;
field_0x5c.mBank = this_00.d2s(rolling_p->mBank);
setFlag(0x400);
}
if (rolling_p->field_0x0 && mCurCamStyleTimer < rolling_p->mTimer) {
return 0;
}
return 1;
}
namespace {
/* 804253CC-804253D8 0520EC 000C+00 1/2 0/0 0/0 .bss MidnaAdditionVec__25@unnamed@d_ev_camera_cpp@ */
static cXyz MidnaAdditionVec(0.0f, 0.0f, 70.0f);
/* 8008E750-8008E774 089090 0024+00 1/1 0/0 0/0 .text isRelChar__25@unnamed@d_ev_camera_cpp@Fc */
static inline bool isRelChar(char param_1) {
return param_1 != '-' && param_1 != 'x';
}
} // namespace
/* 8008B9B0-8008BE2C 0862F0 047C+00 0/0 1/0 0/0 .text fixedPositionEvCamera__9dCamera_cFv */
bool dCamera_c::fixedPositionEvCamera() {
static cXyz DefaultGap(cXyz::Zero);
struct mWork::fixedPos* fpos_p = &mWork.fixedPos;
bool rv = true;
if (mCurCamStyleTimer == 0) {
cXyz unused_xyz, sp24;
getEvXyzData(&fpos_p->field_0x10, "CtrGap", DefaultGap);
getEvXyzData(&sp24, "Eye", mEye);
getEvFloatData(&fpos_p->field_0x28, "Fovy", mFovy);
getEvFloatData(&fpos_p->field_0x30, "CtrCus", 1.0f);
getEvFloatData(&fpos_p->field_0x38, "Radius", 100000.0f);
getEvFloatData(&fpos_p->field_0x34, "StartRadius", fpos_p->field_0x38);
fpos_p->field_0x1 = getEvFloatData(&fpos_p->field_0x2c, "Bank", 0.0f);
getEvStringData(&mWork.event.field_0x48, "RelUseMask", "o");
fpos_p->field_0x0 = getEvIntData(&mWork.event.field_0x4c, "Timer", -1);
if ((fpos_p->field_0x40 = getEvActor("Target", "@PLAYER")) == NULL) {
OS_REPORT("camera: event: error: target actor missing\n");
return 1;
}
fpos_p->field_0x44 = fopAcM_GetID(fpos_p->field_0x40);
fpos_p->field_0x3c = getEvActor("RelActor");
if (fpos_p->field_0x3c && isRelChar(mWork.event.field_0x48)) {
fpos_p->field_0x4 = relationalPos(fpos_p->field_0x3c, &sp24);
} else {
fpos_p->field_0x4 = sp24;
}
fpos_p->field_0x1c = mCenter;
field_0x158.field_0x0 = true;
}
if (fopAcM_SearchByID(fpos_p->field_0x44) == NULL) {
OS_REPORT("camera: event: error: target actor dead\n");
return 1;
}
fpos_p->field_0x1c = relationalPos(fpos_p->field_0x40, &mWork.talk.field_0x10);
field_0x5c.mCenter += (fpos_p->field_0x1c - field_0x5c.mCenter) * mWork.chase.field_0x30;
field_0x5c.mEye = mWork.talk.field_0x4;
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
f32 fVar1 = fpos_p->field_0x38;
if (fpos_p->field_0x0 && mCurCamStyleTimer < fpos_p->field_0x4c) {
fVar1 = fpos_p->field_0x34 + (fpos_p->field_0x38 - fpos_p->field_0x34)
* (mCurCamStyleTimer / f32(mWork.event.field_0x4c));
rv = false;
}
if (field_0x5c.mDirection.R() > fVar1) {
field_0x5c.mDirection.R(fVar1);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
}
field_0x5c.mFovy = mWork.chase.field_0x28;
if (fpos_p->field_0x1) {
cAngle this_00;
field_0x5c.mBank = this_00.d2s(mWork.chase.field_0x2c);
setFlag(0x400);
}
if (rv != 0) {
field_0x158.field_0x0 = true;
}
return rv;
}
/* 8008BE2C-8008BE50 08676C 0024+00 0/0 1/0 0/0 .text uniformTransEvCamera__9dCamera_cFv */
bool dCamera_c::uniformTransEvCamera() {
transEvCamera(1);
}
/* 8008BE50-8008BE74 086790 0024+00 0/0 1/0 0/0 .text uniformBrakeEvCamera__9dCamera_cFv */
bool dCamera_c::uniformBrakeEvCamera() {
transEvCamera(2);
}
/* 8008BE74-8008BE98 0867B4 0024+00 0/0 1/0 0/0 .text uniformAcceleEvCamera__9dCamera_cFv */
bool dCamera_c::uniformAcceleEvCamera() {
transEvCamera(3);
}
namespace {
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);
}
} // namespace
f32 dummy_lit_3871(int val) {
f32 my_vec[3] = {0.0f, 0.0f, 0.0f};
return my_vec[val];
}
/* 8008BE98-8008E750 0867D8 28B8+00 3/3 0/0 0/0 .text transEvCamera__9dCamera_cFi */
bool dCamera_c::transEvCamera(int param_1) {
// NONMATCHING - regalloc
struct mWork::trans* trans = &mWork.trans;
f32 mid_val;
struct {
cXyz mXyz_0;
cXyz mXyz_1;
} pos, pos2;
bool rv = 0;
f32 lit_5984[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
f32 lit_5985[7] = { 0.0f, 0.0f, 0.4f, 0.7f, 0.9f, 1.0f, 1.0f };
f32 lit_5986[7] = { 0.0f, 0.0f, 0.1f, 0.3f, 0.6f, 1.0f, 1.0f };
f32* lit_5987[5] = { NULL, lit_5984, lit_5985, lit_5986, NULL };
int local_d0[5] = { 0, 4, 7, 7, 0 };
cXyz my_vec_0, my_vec_1;
f32 my_main_f32;
if (mCurCamStyleTimer == 0) {
if (!getEvIntData(&trans->mTimer, "Timer")) {
OS_REPORT("camera: event: error: UNITRANS no Timer\n");
return 1;
}
getEvIntData(&trans->mBSpCurve, "BSpCurve", param_1);
if (trans->mBSpCurve != 0) {
mEventData.field_0xf0.Init(local_d0[trans->mBSpCurve], trans->mTimer + 1);
mEventData.field_0xf0.Step();
} else {
int float_list_data = getEvFloatListData(&trans->mBSpPoints, "BSpPoints");
if (float_list_data != 0) {
mEventData.field_0xf0.Init(float_list_data, trans->mTimer + 1);
mEventData.field_0xf0.Step();
trans->mBSpCurve = -1;
}
}
int slot;
if (!getEvIntData(&slot, "EndSlot")) {
getEvXyzData(&trans->mEye, "Eye", mEye);
getEvXyzData(&trans->mCenter, "Center", mCenter);
getEvFloatData(&trans->mFovy, "Fovy", mFovy);
trans->field_0x68 = getEvFloatData(&trans->field_0x3c, "Bank", mBank.Degree());
} else {
dCamInfo_c* ptr1 = &field_0xd0[slot];
trans->mCenter = (*ptr1).mCenter;
trans->mEye = (*ptr1).mEye;
trans->mFovy = (*ptr1).mFovy;
trans->field_0x3c = (*ptr1).mBank;
if ((*ptr1).mBank != 0.0f) {
trans->field_0x68 = true;
}
}
if (!getEvIntData(&slot, "StartSlot")) {
getEvXyzData(&trans->mStartEye, "StartEye", mEye);
getEvXyzData(&trans->mStartCenter, "StartCenter", mCenter);
getEvFloatData(&trans->mStartFovy, "StartFovy", mFovy);
trans->field_0x68 |= getEvFloatData(&trans->field_0x1c, "StartBank", mBank.Degree());
} else {
dCamInfo_c* ptr2 = &field_0xd0[slot];
trans->mStartCenter = (*ptr2).mCenter;
trans->mStartEye = (*ptr2).mEye;
trans->mStartFovy = (*ptr2).mFovy;
trans->field_0x1c = (*ptr2).mBank;
if ((*ptr2).mBank != 0.0f) {
trans->field_0x68 = true;
}
}
getEvIntData(&trans->mTransType, "TransType", 0);
trans->mRelActor = getEvActor("RelActor");
getEvStringData(&trans->mRelUseMask, "RelUseMask", "--oo");
getEvFloatData(&trans->mCushion, "Cushion", 1.0f);
if (trans->mRelActor) {
trans->mRelActorID = fopAcM_GetID(trans->mRelActor);
if (mIsWolf == 1 && trans->mRelActor == mpPlayerActor) {
daPy_py_c* mPlayer = (daPy_py_c*)mpPlayerActor;
daMidna_c* mMidna = daPy_py_c::getMidnaActor();
cXyz mAdditionVec = WolfAdditionVec;
if (mPlayer->checkMidnaRide() != 0 && !mMidna->checkNoDraw()) {
mAdditionVec = MidnaAdditionVec;
}
if (trans->mRelUseMask == 119) {
trans->mStartCenter += mAdditionVec;
}
if (trans->mRelUseMask == 87) {
trans->mStartCenter -= mAdditionVec;
}
if (trans->field_0x49 == 119) {
trans->mStartEye += mAdditionVec;
}
if (trans->field_0x49 == 87) {
trans->mStartEye -= mAdditionVec;
}
if (trans->field_0x4a == 119) {
trans->mCenter += mAdditionVec;
}
if (trans->field_0x4a == 87) {
trans->mCenter -= mAdditionVec;
}
if (trans->field_0x4b == 119) {
trans->mEye += mAdditionVec;
}
if (trans->field_0x4b == 87) {
trans->mEye -= mAdditionVec;
}
}
if (trans->field_0x49 == 114) {
my_vec_0 = relationalPos(trans->mRelActor, &trans->mStartCenter);
if ((field_0xac & 1) != 0) {
trans->mStartEye.x = -trans->mStartEye.x;
}
my_vec_1 = relationalPos(trans->mRelActor, &trans->mStartEye);
if (lineBGCheck(&my_vec_0, &my_vec_1, 0x4007)) {
trans->mStartEye.x = -trans->mStartEye.x;
}
}
if (trans->mRelUseMask == 110 || trans->field_0x49 == 110) {
cSGlobe cStack_7b8(mEye - positionOf(trans->mRelActor));
cSAngle acStack_898 = cStack_7b8.U() - directionOf(trans->mRelActor);
if (acStack_898 < cSAngle::_0) {
if (trans->mRelUseMask == 110) {
trans->mStartCenter.x = -trans->mStartCenter.x;
}
if (trans->field_0x49 == 110) {
trans->mStartEye.x = -trans->mStartEye.x;
}
}
my_vec_0 = relationalPos(trans->mRelActor, &trans->mStartCenter);
my_vec_1 = relationalPos(trans->mRelActor, &trans->mStartEye);
if (lineBGCheck(&my_vec_0, &my_vec_1, 0x4007)) {
trans->mStartEye.x = -trans->mStartEye.x;
}
}
if (trans->field_0x4a == 110 || trans->field_0x4b == 110) {
cSGlobe cStack_7c0(mEye - positionOf(trans->mRelActor));
cSAngle acStack_89c = cStack_7c0.U() - directionOf(trans->mRelActor);
if (acStack_89c < cSAngle::_0) {
if (trans->field_0x4a == 110) {
trans->mCenter.x = -trans->mCenter.x;
}
if (trans->field_0x4b == 110) {
trans->mEye.x = -trans->mEye.x;
}
}
my_vec_0 = relationalPos(trans->mRelActor, &trans->mCenter);
my_vec_1 = relationalPos(trans->mRelActor, &trans->mEye);
if (lineBGCheck(&my_vec_0, &my_vec_1, 0x4007)) {
trans->mEye.x = -trans->mEye.x;
}
}
if (trans->mRelUseMask == 78 || trans->field_0x49 == 78) {
cSGlobe cStack_7c8(mEye - positionOf(trans->mRelActor));
cSAngle acStack_8a0 = cStack_7c8.U() - directionOf(trans->mRelActor);
if (acStack_8a0 > cSAngle::_0) {
if (trans->mRelUseMask == 78) {
trans->mStartCenter.x = -trans->mStartCenter.x;
}
if (trans->field_0x49 == 78) {
trans->mStartEye.x = -trans->mStartEye.x;
}
}
my_vec_0 = relationalPos(trans->mRelActor, &trans->mStartCenter);
my_vec_1 = relationalPos(trans->mRelActor, &trans->mStartEye);
if (lineBGCheck(&my_vec_0, &my_vec_1, 0x4007)) {
trans->mStartEye.x = -trans->mStartEye.x;
}
}
if (trans->field_0x4a == 78 || trans->field_0x4b == 78) {
cSGlobe cStack_7d0(mEye - positionOf(trans->mRelActor));
cSAngle acStack_8a4 = cStack_7d0.U() - directionOf(trans->mRelActor);
if (acStack_8a4 > cSAngle::_0) {
if (trans->field_0x4a == 78) {
trans->mCenter.x = -trans->mCenter.x;
}
if (trans->field_0x4b == 78) {
trans->mEye.x = -trans->mEye.x;
}
}
my_vec_0 = relationalPos(trans->mRelActor, &trans->mCenter);
my_vec_1 = relationalPos(trans->mRelActor, &trans->mEye);
if (lineBGCheck(&my_vec_0, &my_vec_1, 0x4007)) {
trans->mEye.x = -trans->mEye.x;
}
}
if (trans->mRelUseMask == 102) {
cSGlobe cStack_7d8(trans->mStartCenter);
cStack_7d8.U(directionOf(trans->mRelActor) + cStack_7d8.U());
trans->mStartCenter = attentionPos(trans->mRelActor) + cStack_7d8.Xyz();
trans->mRelUseMask = 120;
}
if (trans->field_0x49 == 102) {
cSGlobe cStack_7e0(trans->mStartEye);
cStack_7e0.U(directionOf(trans->mRelActor) + cStack_7e0.U());
trans->mStartEye = attentionPos(trans->mRelActor) + cStack_7e0.Xyz();
trans->field_0x49 = 120;
}
if (trans->field_0x4a == 112) {
cXyz sp114(trans->mCenter);
cXyz sp120 = relationalPos(trans->mRelActor, &sp114);
f32 fVar1 = cXyz(sp120 - positionOf(mpPlayerActor)).abs();
sp114.x = -sp114.x;
sp120 = relationalPos(trans->mRelActor, &sp114);
f32 fVar2 = cXyz(sp120 - positionOf(mpPlayerActor)).abs();
if (fVar1 < fVar2) {
trans->mCenter.x = -trans->mCenter.x;
}
} else if (trans->field_0x4a == 102) {
cSGlobe cStack_7e8(trans->mCenter);
cStack_7e8.U(directionOf(trans->mRelActor) + cStack_7e8.U());
trans->mCenter = attentionPos(trans->mRelActor) + cStack_7e8.Xyz();
trans->field_0x4a = 120;
}
if (trans->field_0x4b == 112) {
cXyz sp12c = trans->mEye;
cXyz sp138(relationalPos(trans->mRelActor, &sp12c));
f32 fVar3 = cXyz(sp138 - positionOf(mpPlayerActor)).abs();
sp12c.x = -sp12c.x;
sp138 = relationalPos(trans->mRelActor, &sp12c);
f32 fVar4 = cXyz(sp138 - positionOf(mpPlayerActor)).abs();
if (fVar3 < fVar4) {
trans->mEye.x = -trans->mEye.x;
}
} else if (trans->field_0x4b == 114) {
my_vec_0 = relationalPos(trans->mRelActor, &trans->mCenter);
if ((field_0xac & 1) != 0) {
trans->mEye.x = -trans->mEye.x;
}
my_vec_1 = relationalPos(trans->mRelActor, &trans->mEye);
if (lineBGCheck(&my_vec_0, &my_vec_1, 0x4007)) {
trans->mEye.x = -trans->mEye.x;
}
} else if (trans->field_0x4b == 102) {
cSGlobe cStack_7f0(trans->mEye);
cStack_7f0.U(directionOf(trans->mRelActor) + cStack_7f0.U());
trans->mEye = attentionPos(trans->mRelActor) + cStack_7f0.Xyz();
trans->field_0x4b = 120;
}
} else {
if (trans->field_0x4a == 97) {
cXyz cStack_320 = dCamMath::xyzRotateY(trans->mCenter, cSAngle(field_0x5c.mDirection.U().Inv()));
trans->mCenter = field_0x5c.mCenter + cStack_320;
}
if (trans->field_0x4b == 97) {
cXyz cStack_32c = dCamMath::xyzRotateY(trans->mEye, cSAngle(field_0x5c.mDirection.U().Inv()));
trans->mEye = field_0x5c.mEye + cStack_32c;
}
}
trans->field_0x60 = mDirection.Invert();
field_0x158.field_0x0 = true;
}
if (trans->mRelActor && fopAcM_SearchByID(trans->mRelActorID) == NULL) {
OS_REPORT("camera: event: error: relational base actor dead\n");
return 1;
} else {
if (mCurCamStyleTimer >= trans->mTimer) {
rv = 1;
my_main_f32 = 1.0f;
} else if (trans->mBSpCurve == -1) {
mEventData.field_0xf0.Step();
my_main_f32 = mEventData.field_0xf0.Calc(trans->mBSpPoints);
} else if (trans->mBSpCurve != 0) {
mEventData.field_0xf0.Step();
my_main_f32 = mEventData.field_0xf0.Calc(lit_5987[trans->mBSpCurve]);
} else {
my_main_f32 = (mCurCamStyleTimer + 1) / f32(trans->mTimer);
}
if (trans->mRelActor) {
if (trans->mRelUseMask == 116) {
pos.mXyz_1 = attentionPos(trans->mRelActor) + trans->mStartCenter;
} else if (trans->mRelUseMask == 99) {
cSGlobe cStack_7f8(trans->mStartCenter);
cStack_7f8.U(trans->field_0x60.U() + cStack_7f8.U());
pos.mXyz_1 = attentionPos(trans->mRelActor) + cStack_7f8.Xyz();
} else if (trans->mRelUseMask == 119 || trans->mRelUseMask == 87) {
pos.mXyz_1 = relationalPos(trans->mRelActor, &trans->mStartCenter);
} else {
if (isRelChar(trans->mRelUseMask)) {
pos.mXyz_1 = relationalPos(trans->mRelActor, &trans->mStartCenter);
} else {
pos.mXyz_1 = trans->mStartCenter;
}
}
if (trans->field_0x49 == 116) {
pos.mXyz_0 = attentionPos(trans->mRelActor) + trans->mStartEye;
} else if (trans->field_0x49 == 99) {
cSGlobe cStack_800(trans->mStartEye);
cStack_800.U(trans->field_0x60.U() + cStack_800.U());
pos.mXyz_0 = attentionPos(trans->mRelActor) + cStack_800.Xyz();
} else if (trans->field_0x49 == 119 || trans->field_0x49 == 87) {
pos.mXyz_0 = relationalPos(trans->mRelActor, &trans->mStartEye);
} else {
if (isRelChar(trans->field_0x49)) {
pos.mXyz_0 = relationalPos(trans->mRelActor, &trans->mStartEye);
} else {
pos.mXyz_0 = trans->mStartEye;
}
}
if (trans->field_0x4a == 116) {
pos2.mXyz_1 = attentionPos(trans->mRelActor) + trans->mCenter;
} else if (trans->field_0x4a == 99) {
cSGlobe cStack_808(trans->mCenter);
cStack_808.U(trans->field_0x60.U() + cStack_808.U());
pos2.mXyz_1 = attentionPos(trans->mRelActor) + cStack_808.Xyz();
} else if (trans->field_0x4a == 119 || trans->field_0x4a == 87) {
pos2.mXyz_1 = relationalPos(trans->mRelActor, &trans->mCenter);
} else if (isRelChar(trans->field_0x4a)) {
pos2.mXyz_1 = relationalPos(trans->mRelActor, &trans->mCenter);
} else if (trans->mTransType == 2) {
pos2.mXyz_1 = dCamMath::xyzRotateY(trans->mCenter, directionOf(trans->mRelActor));
} else {
pos2.mXyz_1 = trans->mCenter;
}
if (trans->field_0x4b == 116) {
pos2.mXyz_0 = attentionPos(trans->mRelActor) + trans->mEye;
} else if (trans->field_0x4b == 99) {
cSGlobe cStack_810(trans->mEye);
cStack_810.U(trans->field_0x60.U() + cStack_810.U());
pos2.mXyz_0 = attentionPos(trans->mRelActor) + cStack_810.Xyz();
} else {
if (trans->field_0x4b == 119 || trans->field_0x4b == 87) {
pos2.mXyz_0 = relationalPos(trans->mRelActor, &trans->mEye);
} else if (isRelChar(trans->field_0x4b)) {
pos2.mXyz_0 = relationalPos(trans->mRelActor, &trans->mEye);
} else if (trans->mTransType == 2) {
pos2.mXyz_0 = dCamMath::xyzRotateY(trans->mEye, directionOf(trans->mRelActor));
} else {
pos2.mXyz_0 = trans->mEye;
}
}
} else {
pos.mXyz_1 = trans->mStartCenter;
pos.mXyz_0 = trans->mStartEye;
pos2.mXyz_1 = trans->mCenter;
pos2.mXyz_0 = trans->mEye;
}
cXyz sp15c;
cXyz sp168;
if (trans->mTransType == 1) {
sp15c = pos.mXyz_1 + ((pos2.mXyz_1 - pos.mXyz_1) * my_main_f32);
field_0x5c.mCenter += (sp15c - field_0x5c.mCenter) * trans->mCushion;
cSGlobe cStack_818(pos.mXyz_0 - pos.mXyz_1);
cSGlobe cStack_820(pos2.mXyz_0 - pos2.mXyz_1);
cSGlobe cStack_828(cStack_818.R() + (my_main_f32 * (cStack_820.R() - cStack_818.R())),
cStack_818.V() + ((cStack_820.V() - cStack_818.V()) * my_main_f32),
cStack_818.U() + ((cStack_820.U() - cStack_818.U()) * my_main_f32));
sp168 = field_0x5c.mCenter + cStack_828.Xyz();
field_0x5c.mEye += (sp168 - field_0x5c.mEye) * trans->mCushion;
} else if (trans->mTransType == 3) {
sp15c = pos.mXyz_1 + ((pos2.mXyz_1 - pos.mXyz_1) * my_main_f32);
field_0x5c.mCenter += (sp15c - field_0x5c.mCenter) * trans->mCushion;
cSGlobe cStack_830(pos.mXyz_0 - pos.mXyz_1);
cSGlobe cStack_838(pos2.mXyz_0 - pos2.mXyz_1);
cSAngle acStack_8a8(cStack_838.U() - cStack_830.U());
if (acStack_8a8 == cSAngle::_0) {
acStack_8a8.Val(my_main_f32 * 360.0f);
} else {
if (acStack_8a8 > cSAngle::_0) {
acStack_8a8 *= my_main_f32;
} else {
acStack_8a8.Val(my_main_f32 * (acStack_8a8.Degree() + 360.0f));
}
}
cSGlobe cStack_840(cStack_830.R() + ((cStack_838.R() - cStack_830.R()) * my_main_f32),
(cStack_830.V() + (cStack_838.V() - cStack_830.V()) * my_main_f32),
(cStack_830.U() + acStack_8a8));
sp168 = field_0x5c.mCenter + cStack_840.Xyz();
field_0x5c.mEye += (sp168 - field_0x5c.mEye) * trans->mCushion;
} else if (trans->mTransType == 4) {
sp15c = pos.mXyz_1 + ((pos2.mXyz_1 - pos.mXyz_1) * my_main_f32);
field_0x5c.mCenter += (sp15c - field_0x5c.mCenter) * trans->mCushion;
cSGlobe cStack_848(pos.mXyz_0 - pos.mXyz_1);
cSGlobe cStack_850(pos2.mXyz_0 - pos2.mXyz_1);
cSAngle acStack_8ac(cStack_850.U() - cStack_848.U());
if (acStack_8ac == cSAngle::_0) {
acStack_8ac.Val(my_main_f32 * -360.0f);
} else if (acStack_8ac < cSAngle::_0) {
acStack_8ac *= my_main_f32;
} else {
acStack_8ac.Val(my_main_f32 * (acStack_8ac.Degree() + -360.0f));
}
cSGlobe cStack_858(cStack_848.R() + (my_main_f32 * (cStack_850.R() - cStack_848.R())),
cStack_848.V() + (cStack_850.V() - cStack_848.V()) * my_main_f32,
cStack_848.U() + acStack_8ac);
sp168 = field_0x5c.mCenter + cStack_858.Xyz();
field_0x5c.mEye += (sp168 - field_0x5c.mEye) * trans->mCushion;
} else if (trans->mTransType == 2) {
sp15c = pos.mXyz_1 + (pos2.mXyz_1 * my_main_f32);
field_0x5c.mCenter += (sp15c - field_0x5c.mCenter) * trans->mCushion;
sp168 = pos.mXyz_0 + (pos2.mXyz_0 * my_main_f32);
field_0x5c.mEye += (sp168 - field_0x5c.mEye) * trans->mCushion;
} else {
sp15c = pos.mXyz_1 + ((pos2.mXyz_1 - pos.mXyz_1) * my_main_f32);
field_0x5c.mCenter += (sp15c - field_0x5c.mCenter) * trans->mCushion;
sp168 = pos.mXyz_0 + ((pos2.mXyz_0 - pos.mXyz_0) * my_main_f32);
field_0x5c.mEye += (sp168 - field_0x5c.mEye) * trans->mCushion;
}
f32 o_float = trans->mStartFovy + (my_main_f32 * (trans->mFovy - trans->mStartFovy));
field_0x5c.mFovy += trans->mCushion * (o_float - field_0x5c.mFovy);
if (trans->field_0x68) {
mid_val = trans->field_0x1c + my_main_f32 * (trans->field_0x3c - trans->field_0x1c);
field_0x5c.mBank += (cSAngle(mid_val) - field_0x5c.mBank) * trans->mCushion;
setFlag(0x400);
}
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
}
return rv;
}
/* 8008E938-8008FA58 089278 1120+00 0/0 1/0 0/0 .text watchActorEvCamera__9dCamera_cFv */
bool dCamera_c::watchActorEvCamera() {
bool bVar15;
static cXyz DefaultGap(cXyz::Zero);
struct mWork::actor* actor = &mWork.actor;
if (mCurCamStyleTimer == 0) {
getEvXyzData(&actor->mCtrGap, "CtrGap", DefaultGap);
getEvFloatData(&actor->mCushion, "Cushion", 1.0f);
getEvFloatData(&actor->mNearDist, "NearDist", 750.0f);
getEvFloatData(&actor->mZoomDist, "ZoomDist", 400.0f);
getEvFloatData(&actor->mZoomVAngle, "ZoomVAngle", 0.0f);
getEvFloatData(&actor->mFarDist, "FarDist", 1500.0f);
getEvFloatData(&actor->mFovy, "Fovy", 62.0f);
getEvIntData(&actor->mNearTimer, "NearTimer", 20);
getEvIntData(&actor->mFarTimer, "FarTimer", 30);
getEvFloatData(&actor->mFrontAngle, "FrontAngle", 179.0f);
getEvIntData(&actor->mBlure, "Blure", 0);
if ((actor->mTargetActor = getEvActor("Target", "@STARTER")) == NULL) {
OS_REPORT("camera: event: error: target actor missing\n");
return 1;
}
actor->mTargetActorID = fopAcM_GetID(actor->mTargetActor);
actor->field_0xc = relationalPos(actor->mTargetActor, &actor->mCtrGap);
actor->field_0x3c.Val(field_0x5c.mEye - actor->field_0xc);
if (actor->field_0x3c.R() < actor->mNearDist) {
if (pointInSight(&actor->field_0xc)) {
actor->field_0x54 = 0;
} else {
actor->field_0x54 = 1;
}
} else if (actor->field_0x3c.R() < actor->mFarDist) {
actor->field_0x54 = 2;
} else {
actor->field_0x54 = 3;
}
field_0x158.field_0x0 = true;
}
if (fopAcM_SearchByID(actor->mTargetActorID) == NULL) {
OS_REPORT("camera: event: error: target actor dead\n");
return 1;
}
bool bVar5 = false;
bool bVar1 = true;
if (fopAcM_GetProfName(actor->mTargetActor) == 232 || fopAcM_GetProfName(actor->mTargetActor) == 550) {
bVar5 = true;
}
switch (actor->field_0x54) {
case 0:
field_0x5c.mEye = mEye;
field_0x5c.mDirection = mDirection;
break;
case 1:
if (mCurCamStyleTimer == 0) {
cXyz cStack_dc = attentionPos(mpPlayerActor);
cStack_dc.y += 10.0f;
cSGlobe cStack_288(cStack_dc - actor->field_0xc);
cSGlobe cStack_290(field_0x5c.mEye - positionOf(actor->mTargetActor));
cSAngle acStack_2e8 = cStack_290.U() - directionOf(actor->mTargetActor);
if (acStack_2e8 < cSAngle::_0) {
cStack_288.U(cStack_288.U() + cSAngle(5.0f));
} else {
cStack_288.U(cStack_288.U() + cSAngle(-5.0f));
}
cSAngle acStack_2ec = cStack_288.U() - directionOf(actor->mTargetActor);
cSAngle unused_angle;
if (acStack_2ec < cSAngle(-actor->mFrontAngle)) {
cStack_288.U(directionOf(actor->mTargetActor) + cSAngle(-actor->mFrontAngle));
} else if (acStack_2ec > cSAngle(actor->mFrontAngle)) {
cStack_288.U(directionOf(actor->mTargetActor) + cSAngle(actor->mFrontAngle));
}
actor->field_0x4c.Val(cStack_288.R() + 120.0f, cStack_288.V(), cStack_288.U());
cSAngle acStack_2f4;
if (acStack_2ec >= cSAngle::_0) {
acStack_2f4.Val(-8.0f);
} else {
acStack_2f4.Val(8.0f);
}
cXyz cStack_e8;
int i = 0;
cSGlobe cStack_298 = actor->field_0x4c;
bool unused_bool = false;
for (i = 0; i < 45; i++) {
cStack_e8 = actor->field_0xc + cStack_298.Xyz();
if (bVar1 && !lineBGCheck(&actor->field_0xc, &cStack_e8, 0x4007)
&& !lineCollisionCheck(actor->field_0xc, cStack_e8, mpPlayerActor, actor->mTargetActor, NULL)) {
actor->field_0x4c = cStack_298;
unused_bool = true;
(void) unused_bool;
break;
}
cStack_298.U(cStack_298.U() + acStack_2f4);
if (bVar5) {
cSAngle acStack_2f8 = cStack_298.U() - directionOf(actor->mTargetActor);
f32 degree = acStack_2f8.Degree();
if (fabsf(degree) < 70.0f) {
bVar1 = true;
} else {
bVar1 = false;
}
}
f32 my_f32;
if ((i & 2) != 0) {
my_f32 = -5.0f;
} else {
my_f32 = 5.0f;
}
cStack_298.V((cStack_298.V() + cSAngle(my_f32)) - (cStack_298.V() * 0.1f));
}
OS_REPORT("camera: event: search %d time(s)\n", i);
}
if (mCurCamStyleTimer < actor->mNearTimer) {
f32 fVar6 = mCurCamStyleTimer / f32(actor->mNearTimer);
field_0x5c.mCenter += (actor->field_0xc - field_0x5c.mCenter) * fVar6;
cSGlobe* dir_p = &field_0x5c.mDirection;
dir_p->R(dir_p->R() + (actor->field_0x4c.R() - dir_p->R()) * fVar6);
dir_p->U(dir_p->U() + (actor->field_0x4c.U() - dir_p->U()) * fVar6);
dir_p->V(dir_p->V() + (actor->field_0x4c.V() - dir_p->V()) * fVar6);
field_0x5c.mEye = field_0x5c.mCenter + dir_p->Xyz();
field_0x5c.mFovy += fVar6 * (actor->mFovy - mFovy);
return 0;
}
break;
case 2:
if (mCurCamStyleTimer == 0) {
cSGlobe cStack_2a0(attentionPos(mpPlayerActor) - actor->field_0xc);
if (actor->mZoomVAngle != 0.0f) {
cStack_2a0.V(actor->mZoomVAngle);
}
cSAngle acStack_2fc(cStack_2a0.U() - directionOf(actor->mTargetActor));
cSAngle unused_angle;
if (acStack_2fc < cSAngle(-actor->mFrontAngle)) {
cStack_2a0.U(directionOf(actor->mTargetActor) + cSAngle(-actor->mFrontAngle));
} else if (acStack_2fc > (cSAngle)(actor->mFrontAngle)) {
cStack_2a0.U(directionOf(actor->mTargetActor) + cSAngle(actor->mFrontAngle));
}
f32 my_diff = cStack_2a0.R() - actor->mZoomDist;
if (fabsf(my_diff) < 30.0f) {
cStack_2a0.U(cStack_2a0.U() + (s16)900);
}
actor->field_0x4c.Val(actor->mZoomDist, cStack_2a0.V(), cStack_2a0.U());
cSAngle acStack_304;
if (acStack_2fc >= cSAngle::_0) {
acStack_304.Val(-8.0f);
} else {
acStack_304.Val(8.0f);
}
cXyz cStack_f4;
int i = 0;
cSGlobe cStack_2a8(actor->field_0x4c);
bool unused_bool = false;
for (i = 0; i < 45; i++) {
cStack_f4 = actor->field_0xc + cStack_2a8.Xyz();
if (bVar1 && !lineBGCheck(&actor->field_0xc, &cStack_f4, 0x4007)
&& !lineCollisionCheck(actor->field_0xc, cStack_f4, mpPlayerActor, actor->mTargetActor, NULL)) {
actor->field_0x4c = cStack_2a8;
unused_bool = true;
(void) unused_bool;
break;
}
cStack_2a8.U(cStack_2a8.U() + acStack_304);
if (bVar5) {
cSAngle acStack_3b4 = cStack_2a8.U() - directionOf(actor->mTargetActor);
f32 degree = acStack_3b4.Degree();
if (fabsf(degree) < 70.0f) {
bVar1 = true;
} else {
bVar1 = false;
}
}
f32 my_f32;
if ((i & 2) != 0) {
my_f32 = -5.0f;
} else {
my_f32 = 5.0f;
}
cStack_2a8.V((cStack_2a8.V() + cSAngle(my_f32)) - (cStack_2a8.V() * 0.1f));
}
OS_REPORT("camera: event: search %d time(s)\n", i);
}
if (mCurCamStyleTimer < actor->mFarTimer) {
f32 fVar6 = mCurCamStyleTimer / f32(actor->mFarTimer);
field_0x5c.mCenter += (actor->field_0xc - field_0x5c.mCenter) * fVar6;
cSGlobe* dir_p = &field_0x5c.mDirection;
dir_p->R(dir_p->R() + (actor->field_0x4c.R() - dir_p->R()) * fVar6);
dir_p->U(dir_p->U() + (actor->field_0x4c.U() - dir_p->U()) * fVar6);
dir_p->V(dir_p->V() + (actor->field_0x4c.V() - dir_p->V()) * fVar6);
field_0x5c.mEye = field_0x5c.mCenter + dir_p->Xyz();
field_0x5c.mFovy += fVar6 * (actor->mFovy - mFovy);
return 0;
}
break;
case 3:
if (mCurCamStyleTimer == 0) {
field_0x5c.mCenter = actor->field_0xc;
cSGlobe cStack_2b0(attentionPos(mpPlayerActor) - actor->field_0xc);
cStack_2b0.R(actor->mZoomDist);
cSAngle acStack_30c = cStack_2b0.U() - directionOf(actor->mTargetActor);
cSAngle unused_angle;
if (acStack_30c < cSAngle(-actor->mFrontAngle)) {
cStack_2b0.U(directionOf(actor->mTargetActor) + cSAngle(-actor->mFrontAngle));
} else if (acStack_30c > cSAngle(actor->mFrontAngle)) {
cStack_2b0.U(directionOf(actor->mTargetActor) + cSAngle(actor->mFrontAngle));
}
if (actor->mZoomVAngle != 0.0f) {
cStack_2b0.V(actor->mZoomVAngle);
}
actor->field_0x4c.Val(actor->mZoomDist, cStack_2b0.V(), cStack_2b0.U());
cSAngle acStack_314;
if (acStack_30c >= cSAngle::_0) {
acStack_314.Val(-8.0f);
} else {
acStack_314.Val(8.0f);
}
cXyz cStack_100;
int i = 0;
cSGlobe cStack_2b8 = actor->field_0x4c;
bool unused_bool = false;
for (i = 0; i < 45; i++) {
cStack_100 = actor->field_0xc + cStack_2b8.Xyz();
if (bVar1 && !lineBGCheck(&actor->field_0xc, &cStack_100, 0x4007)
&& !lineCollisionCheck(actor->field_0xc, cStack_100, mpPlayerActor, actor->mTargetActor, NULL)) {
actor->field_0x4c = cStack_2b8;
unused_bool = true;
(void) unused_bool;
break;
}
cStack_2b8.U(cStack_2b8.U() + acStack_314);
if (bVar5) {
cSAngle acStack_318 = cStack_2b8.U() - directionOf(actor->mTargetActor);
f32 degree = acStack_318.Degree();
if (fabsf(degree) < 70.0f) {
bVar1 = true;
} else {
bVar1 = false;
}
}
f32 my_f32_0;
if ((i & 2) != 0) {
my_f32_0 = -5.0f;
} else {
my_f32_0 = 5.0f;
}
cStack_2b8.V((cStack_2b8.V() + cSAngle(my_f32_0)) - (cStack_2b8.V() * 0.1f));
}
}
field_0x5c.mDirection = actor->field_0x4c;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = actor->mFovy;
}
field_0x158.field_0x0 = true;
return 1;
}
/* 8008FAE8-80090174 08A428 068C+00 0/0 1/0 0/0 .text restorePosEvCamera__9dCamera_cFv */
bool dCamera_c::restorePosEvCamera() {
static cXyz DefaultGap(cXyz::Zero);
struct mWork::restorePos* restorePos = &mWork.restorePos;
if (mCurCamStyleTimer == 0) {
getEvXyzData(&restorePos->field_0x0, "CtrGap", DefaultGap);
getEvFloatData(&restorePos->field_0x18, "Cushion", 1.0f);
getEvFloatData(&restorePos->field_0x20, "NearDist", 750.0f);
getEvFloatData(&restorePos->field_0x28, "FarDist", 1500.0f);
getEvIntData(&restorePos->field_0x1c, "NearTimer", 20);
getEvIntData(&restorePos->field_0x24, "FarTimer", 30);
getEvIntData(&restorePos->field_0x44, "Dest", 2);
getEvIntData(&restorePos->field_0x68, "TargetType", 0);
switch (restorePos->field_0x44) {
case 0:
restorePos->field_0x48 = field_0xd0[0];
break;
case 1:
restorePos->field_0x48 = field_0xd0[1];
break;
case 9: {
s16 sVar1 = restorePos->field_0x48.mBank.Val();
dComIfGp_loadCameraPosition(0, &restorePos->field_0x48.mCenter, &restorePos->field_0x48.mEye,
&restorePos->field_0x48.mFovy, &sVar1);
break;
}
default: {
restorePos->field_0x48 = field_0xb0;
break;
}
}
if ((restorePos->field_0x34 = getEvActor("Target", "@PLAYER")) == NULL) {
OS_REPORT("camera: event: error: target actor missing\n");
return 1;
}
restorePos->field_0xc = relationalPos(restorePos->field_0x34, &restorePos->field_0x0);
cSGlobe cStack_e8(restorePos->field_0x48.mEye - field_0x5c.mCenter);
if (cStack_e8.R() < restorePos->field_0x20) {
if (pointInSight(&restorePos->field_0xc)) {
restorePos->field_0x40 = 0;
} else {
restorePos->field_0x40 = 1;
}
} else if (cStack_e8.R() < restorePos->field_0x28) {
if (lineBGCheck(&mEye, &restorePos->field_0xc, 0x4007)) {
restorePos->field_0x40 = 3;
} else {
restorePos->field_0x40 = 2;
}
} else {
restorePos->field_0x40 = 3;
}
field_0x158.field_0x0 = true;
}
switch (restorePos->field_0x40) {
case 0: {
break;
}
case 1:
case 2:
if (mCurCamStyleTimer == 0) {
restorePos->field_0x38.Val(restorePos->field_0x48.mEye - restorePos->field_0x48.mCenter);
}
if (mCurCamStyleTimer < restorePos->field_0x24) {
f32 fVar1 = mCurCamStyleTimer / f32(restorePos->field_0x24);
if (restorePos->field_0x68 == 1) {
field_0x5c.mCenter += (restorePos->field_0x48.mCenter - field_0x5c.mCenter) * fVar1;
} else {
field_0x5c.mCenter += (restorePos->field_0xc - field_0x5c.mCenter) * fVar1;
}
field_0x5c.mDirection.R(field_0x5c.mDirection.R() + (fVar1 * (restorePos->field_0x38.R() - field_0x5c.mDirection.R())));
field_0x5c.mDirection.U(field_0x5c.mDirection.U() + ((restorePos->field_0x38.U() - field_0x5c.mDirection.U()) * fVar1));
field_0x5c.mDirection.V((field_0x5c.mDirection.V() + ((restorePos->field_0x38.V() - field_0x5c.mDirection.V()) * fVar1)));
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += fVar1 * (restorePos->field_0x48.mFovy - field_0x5c.mFovy);
return 0;
}
break;
case 3:
if (mCurCamStyleTimer == 0) {
if (restorePos->field_0x68 == 1) {
field_0x5c.mCenter = restorePos->field_0x48.mCenter;
} else {
field_0x5c.mCenter = restorePos->field_0xc;
}
field_0x5c.mDirection.Val(restorePos->field_0x48.mEye - restorePos->field_0x48.mCenter);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = restorePos->field_0x48.mFovy;
}
}
field_0x158.field_0x0 = true;
return 1;
}
/* 80090174-80090230 08AAB4 00BC+00 0/0 1/0 0/0 .text talktoEvCamera__9dCamera_cFv */
bool dCamera_c::talktoEvCamera() {
fopAc_ac_c* r27 = (fopAc_ac_c*)dComIfGp_event_getPt1();
s32 style = mCamTypeData[mEventData.field_0xc].field_0x18[mIsWolf][3];
if (mCurCamStyleTimer == 0) {
clrFlag(0x200000);
}
if (style < 0) {
style = mCamParam.SearchStyle('TT01');
}
#if DEBUG
if (mCurCamStyleTimer == 0 && mCamSetup.CheckFlag(0x40)) {
u32 id = mCamParam.Id(style);
OS_REPORT("camera: event: %16s = %d (%c%c%c%c)\n", "style", style, (id >> 0x18) & 0xFF, (id >> 0x10) & 0xFF, (id >> 0x8) & 0xFF, (id) & 0xFF);
}
#endif
return (this->*engine_tbl[mCamParam.Algorythmn(style)])(style);
}
/* 80090230-80090478 08AB70 0248+00 0/0 1/0 0/0 .text maptoolIdEvCamera__9dCamera_cFv */
bool dCamera_c::maptoolIdEvCamera() {
if (mCurCamStyleTimer == 0) {
int id;
getEvIntData(&id, "ID", g_dComIfG_gameInfo.play.getEvent().getMapToolId());
mEventData.field_0x8 = 0;
field_0x160 = 0;
mCurCamStyleTimer = 0;
mEventData.field_0xec = dEvt_control_c::searchMapEventData(id);
OS_REPORT("%06d: %s: %d: map data ID %d %x\n", field_0xa8, __FILE__, 2792, id,
mEventData.field_0xec);
int var_r6 = 0xFF;
if (mEventData.field_0xec != NULL && mEventData.field_0xec->mType == 0) {
var_r6 = mEventData.field_0xec->field_0x16;
}
getEvIntData(&mEventData.field_0x24, "CameraID", var_r6);
}
int temp_r31 = mEventData.field_0x24;
if (mEventData.field_0xec == NULL || temp_r31 == 0xFF) {
OS_REPORT("%d: %s: %d: ERROR!! no map data!!!\n", field_0xa8, __FILE__, 2805);
return true;
}
int room_no = dComIfGp_roomControl_getStayNo();
if (isStageEvent(mEventData.field_0xec->field_0x4)) {
room_no = -1;
}
if (mEventData.field_0xec->mType == 0 && mEventData.field_0xec->field_0xC != 0xFF) {
if (mEventData.field_0xec->field_0xC & 1) {
clrFlag(0x200000);
}
if (mEventData.field_0xec->field_0xC & 2) {
field_0x88 = 0;
}
}
mEventData.field_0xc = GetCameraTypeFromMapToolID(temp_r31, room_no);
bool var_r31 = false;
if (mEventData.field_0xc != 0xFF) {
s32 style = mCamTypeData[mEventData.field_0xc].field_0x18[mIsWolf][0];
#ifdef DEBUG
if (mCurCamStyleTimer == 0) {
OSReport("type %d mode %d style %d\n", mEventData.field_0xc, 0, style);
}
#endif
bool var_r3 = (this->*engine_tbl[mCamParam.Algorythmn(style)])(style);
if (mEventData.field_0xec->mType == 0) {
if (mEventData.field_0xec->field_0x14 == 0xFF ||
mCurCamStyleTimer > mEventData.field_0xec->field_0x14)
{
var_r31 = true;
}
} else {
return var_r3;
}
} else {
mEventData.field_0xec = NULL;
var_r31 = true;
}
if (var_r31) {
if (mEventData.field_0xec->mType == 0 && (mEventData.field_0xec->field_0xC & 0x20)) {
return mDoCPd_c::getHoldA(mPadID) || mDoCPd_c::getHoldB(mPadID);
}
return true;
}
return false;
}
/* 80090478-80090514 08ADB8 009C+00 0/0 1/0 0/0 .text styleEvCamera__9dCamera_cFv */
bool dCamera_c::styleEvCamera() {
if (mCurCamStyleTimer == 0) {
mEventData.field_0x8 = 0;
field_0x160 = 0;
}
s32 style = mCamParam.SearchStyle(*(u32*)getEvStringPntData("Name", "FN01"));
(this->*engine_tbl[mCamParam.Algorythmn(style)])(style);
return isModeOK();
}
/* 80090514-80091468 08AE54 0F54+00 0/0 1/0 0/0 .text gameOverEvCamera__9dCamera_cFv */
bool dCamera_c::gameOverEvCamera() {
int i;
struct mWork::gameOver* gover_p = &mWork.gameOver;
daPy_py_c* mPlayer = (daPy_py_c*)mpPlayerActor;
daMidna_c* mMidna = daPy_py_c::getMidnaActor();
if (mCurCamStyleTimer == 0) {
gover_p->field_0x3c = (mPlayer->checkMidnaRide() && !mMidna->checkNoDraw());
}
cXyz sp1e8(0.0f, -45.0f, 0.0f);
cXyz spa8[6] = {
cXyz(85.0f, -50.0f, 165.0f),
cXyz(72.0f, -64.0f, 60.0f),
cXyz(165.0f, -20.0f, 45.0f),
cXyz(85.0f, 165.0f, 40.0f),
cXyz(10.0f, -70.0f, 110.0f),
cXyz(0.0f, 0.0f, 0.0f)
};
int w_5c = 5;
if (gover_p->field_0x3c != 0) {
sp1e8.y = -10.0f;
}
cXyz sp1f4(0.0f, -120.0f, 130.0f);
cXyz spd8[4] = {
cXyz(0.0f, 35.0f, 160.0f),
cXyz(105.0f, -65.0f, 200.0f),
cXyz(60.0f, 10.0f, 100.0f),
cXyz(0.0f, 0.0f, 0.0f)
};
cXyz sp200(0.0f, -60.0f, -45.0f);
cXyz sp108[4] = {
cXyz(0.0f, 85.0f, 5.0f),
cXyz(-80.0f, 25.0f, 12.0f),
cXyz(120.0f, 10.0f, -50.0f),
cXyz(0.0f, 0.0f, 0.0f)
};
cXyz sp20c(0.0f, -5.0f, -60.0f);
cXyz sp138[4] = {
cXyz(-140.0f, -10.0f, 100.0f),
cXyz(-20.0f, 190.0f, -150.0f),
cXyz(20.0f, -75.0f, 115.0f),
cXyz(0.0f, 0.0f, 0.0f)
};
// -----------
cXyz sp218((mIsWolf != 1) ? sp1f4 : (gover_p->field_0x3c != 0) ? sp20c : sp200);
cXyz* pos = (mIsWolf != 1) ? spd8 : (gover_p->field_0x3c != 0) ? sp138 : sp108;
// -----------
int w_54 = 3;
f32 unused_f32 = 75.0f;
(void) unused_f32;
cXyz sp224;
cXyz sp230;
cXyz sp23c;
cXyz sp248;
cXyz sp254(0.0f, -40.0f, 0.0f);
cXyz sp168[4] = {
cXyz(0.0f, 135.0f, 140.0f),
cXyz(-100.0f, 112.0f, 150.0f),
cXyz(65.0f, 100.0f, 70.0f),
cXyz(0.0f, 0.0f, 0.0f)
};
cXyz sp260(0.0f, -45.0f, -50.0f);
cXyz sp198[4] = {
cXyz(0.0f, 150.0f, 115.0f),
cXyz(-120.0f, 180.0f, -40.0f),
cXyz(40.0f, 100.0f, 5.0f),
cXyz(0.0f, 0.0f, 0.0f)
};
cXyz sp26c(0.0f, 15.0f, -100.0f);
cXyz sp1c8[4] = {
cXyz(40.0f, 65.0f, 165.0f),
cXyz(-200.0f, 140.0f, 50.0f),
cXyz(50.0f, 230.0f, 0.0f),
cXyz(0.0f, 0.0f, 0.0f)
};
// -----------
int w_50 = 3;
cXyz sp278((mIsWolf != 1) ? sp254 : (gover_p->field_0x3c != 0) ? sp26c : sp260);
cXyz* pos2 = (mIsWolf != 1) ? sp168 : (gover_p->field_0x3c != 0) ? sp1c8 : sp198;
// -----------
bool bVar3 = false;
if (dComIfGp_checkPlayerStatus0(mPadID, 0x100000) || mPlayer->checkMagneBootsOn()) {
if (mBG.field_0x0.field_0x58 >= attentionPos(mpPlayerActor).y + 40.0f) {
bVar3 = true;
}
}
if (mCurCamStyleTimer == 0) {
gover_p->field_0x0 = 0;
gover_p->field_0x4 = 0;
if ((field_0xa8 & 2) != 0) {
gover_p->field_0x8 = 0;
} else {
gover_p->field_0x8 = 1;
}
if (dComIfGp_checkPlayerStatus0(mPadID, 0x100000)) {
gover_p->field_0x0 = 50;
}
field_0x158.field_0x0 = true;
cXyz sp284 = field_0x5c.mEye - attentionPos(mpPlayerActor);
sp284 = dCamMath::xyzRotateY(sp284, -cSAngle(mpPlayerActor->shape_angle.y));
spa8[w_5c] = pos[w_54] = pos2[w_50] = sp284;
}
cXyz sp291(attentionPos(mpPlayerActor));
cXyz my_cross;
bool bVar9 = false;
switch (gover_p->field_0x0) {
case 0:
default: {
getEvIntData(&gover_p->mType, "Type", 0);
if (gover_p->mType == 1) {
cM3dGPla cStack_1dc;
dComIfG_Bgsp().GetTriPla(mBG.field_0x5c.field_0x4, &cStack_1dc);
cXyz* vec_p = cStack_1dc.GetNP();
if (vec_p->y >= 0.9f) {
gover_p->field_0x0 = 80;
} else {
gover_p->field_0x0 = 81;
}
gover_p->field_0x10 = mCenter;
gover_p->field_0x1c = mDirection;
break;
}
gover_p->field_0x0 = 1;
}
case 1: {
sp224 = relationalPos(mpPlayerActor, &sp1e8);
for (i = 0; i < w_5c; i++) {
if (gover_p->field_0x8 != 0) {
spa8[i].x = -spa8[i].x;
}
sp230 = relationalPos(mpPlayerActor, &spa8[i]);
if (sp230.y < mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y) {
sp230.y = mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y;
}
if (!lineBGCheck(&sp291, &sp230, 0x40b7)) break;
spa8[i].x = -spa8[i].x;
sp230 = relationalPos(mpPlayerActor, &spa8[i]);
if (sp230.y < mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y) {
sp230.y = mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y;
}
if (!lineBGCheck(&sp291, &sp230, 0x40b7)) {
break;
}
gover_p->field_0x8 ^= 1;
}
field_0x5c.mCenter = sp224;
field_0x5c.mEye = sp230;
gover_p->field_0x0++;
bVar9 = true;
}
// fallthrough
case 2: {
if (gover_p->field_0x4 != 90) {
break;
}
if (daPy_getPlayerActorClass()->checkHorseRide()) {
break;
}
gover_p->field_0x0++;
gover_p->field_0x4 = 0.0f;
field_0x5c.mFovy = 60.0f;
}
// fallthrough
case 3: {
sp224 = relationalPos(mpPlayerActor, &sp218);
if (lineBGCheck(&sp291, &sp224, &my_cross, 0x40b7)) {
sp224 = my_cross + field_0x5c.mDirection.Norm();
}
for (i = 0; i < w_54; i++) {
if (gover_p->field_0x8 != 0) {
pos[i].x = -pos[i].x;
}
sp230 = relationalPos(mpPlayerActor, &pos[i]);
if (sp230.y < (mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y)) {
sp230.y = mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y;
}
if (!lineBGCheck(&sp291, &sp230, 0x40b7)) break;
pos[i].x = -pos[i].x;
sp230 = relationalPos(mpPlayerActor, &pos[i]);
if (sp230.y < (mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y)) {
sp230.y = mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y;
}
if (!lineBGCheck(&sp291, &sp230, 0x40b7)) {
break;
}
gover_p->field_0x8 ^= 1;
}
field_0x5c.mCenter = sp224;
field_0x5c.mEye = sp230;
gover_p->field_0x0++;
field_0x5c.mFovy = 75.0f;
bVar9 = 75.0f;
}
// fallthrough intentional.
case 4: {
if (gover_p->field_0x4 == 40) {
++gover_p->field_0x0;
gover_p->field_0x4 = 0;
}
break;
}
case 5: {
break;
}
case 50: {
gover_p->field_0x0 = 51;
}
// fallthrough intentional.
case 51: {
sp224 = relationalPos(mpPlayerActor, &sp278);
if (lineBGCheck(&sp291, &sp224, &my_cross, 0x40b7)) {
sp224 = my_cross + field_0x5c.mDirection.Norm();
}
for (i = 0; i < w_50; i++) {
if (gover_p->field_0x8 != 0) {
pos2[i].x = -pos2[i].x;
}
sp230 = relationalPos(mpPlayerActor, &pos2[i]);
if (!lineBGCheck(&sp291, &sp230, 0x40b7)) {
break;
}
pos2[i].x = -pos2[i].x;
sp230 = relationalPos(mpPlayerActor, &pos2[i]);
if (!lineBGCheck(&sp291, &sp230, 0x40b7)) {
break;
}
gover_p->field_0x8 ^= 1;
}
field_0x5c.mCenter = sp224;
field_0x5c.mEye = sp230;
bVar9 = true;
field_0x5c.mFovy = 60.0f;
++gover_p->field_0x0;
}
// fallthrough
case 52: {
if (gover_p->field_0x4 == 160) {
gover_p->field_0x0 = 5;
gover_p->field_0x4 = 0.0f;
}
break;
}
case 80:
case 81: {
f32 fVar1, mid_var;
if (mIsWolf == 1) {
mid_var = -10.0f;
} else {
mid_var = -40.0f;
}
fVar1 = mid_var;
if (gover_p->field_0x3c != 0) {
fVar1 = 40.0f;
}
gover_p->field_0x10.y += (fVar1 + attentionPos(mpPlayerActor).y - gover_p->field_0x10.y) * 0.005f;
field_0x5c.mCenter = gover_p->field_0x10;
cSAngle acStack_43c(gover_p->field_0x1c.V());
f32 next_f_var;
if (gover_p->field_0x0 == 80) {
next_f_var = 30.0f;
} else {
next_f_var = 55.0f;
}
acStack_43c += (cSAngle(next_f_var) - acStack_43c) * 0.02f;
gover_p->field_0x1c.V(acStack_43c);
f32 mRad = gover_p->field_0x1c.R();
mRad += (350.0f - mRad) * 0.02f;
gover_p->field_0x1c.R(mRad);
field_0x5c.mFovy += (40.0f - field_0x5c.mFovy) * 0.005f;
field_0x5c.mEye = field_0x5c.mCenter + gover_p->field_0x1c.Xyz();
break;
}
}
if (!bVar9 && bVar3) {
field_0x5c.mCenter += mMonitor.field_0x14;
field_0x5c.mEye += (mMonitor.field_0x14 * 0.98f);
}
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
++gover_p->field_0x4;
field_0x158.field_0x0 = true;
return 1;
}
/* 80091468-8009236C 08BDA8 0F04+00 1/0 1/0 0/0 .text tactEvCamera__9dCamera_cFv */
bool dCamera_c::tactEvCamera() {
struct mWork::tact* tact_p = &mWork.tact;
cXyz sp58[6] = {
cXyz(0.0f, 5.0f, 190.0f),
cXyz(0.0f, 0.0f, 215.0f),
cXyz(0.0f, -26.0f, 80.0f),
cXyz(0.0f, -26.0f, 45.0f),
cXyz(0.0f, -40.0f, -20.0f),
cXyz(0.0f, -4.0f, 28.0f)
};
cXyz spa0[6] = {
cXyz(140.0f, 35.0f, 220.0f),
cXyz(-200.0f, -15.0f, 240.0f),
cXyz(380.0f, -120.0f, 450.0f),
cXyz(-235.0f, -142.0f, 470.0f),
cXyz(30.0f, 105.0f, -260.0f),
cXyz(-66.0f, 390.0f, 56.0f)
};
f32 local_1d0[6] = { 0.75f, 0.35f, 0.8f, 0.8f, 0.8f, 0.8f };
int const_6_val = 6;
cXyz spf4[7] = {
cXyz(0.0f, -16.0f, 14.0f),
cXyz(0.0f, -26.0f, 14.0f),
cXyz(0.0f, -26.0f, 14.0f),
cXyz(0.0f, -10.0f, 15.0f),
cXyz(-5.0f, -16.0f, -10.0f),
cXyz(0.0f, -18.0f, 35.0f),
cXyz(0.0f, -12.0f, 8.0f)
};
cXyz sp148[7] = {
cXyz(-128.0f, -5.0f, 120.0f),
cXyz(-80.0f, -28.0f, 160.0f),
cXyz(50.0f, -18.0f, 172.0f),
cXyz(110.0f, 5.0f, 58.0f),
cXyz(-50.0f, 40.0f, 85.0f),
cXyz(-70.0f, 60.0f, -45.0f),
cXyz(5.0f, 70.0f, -25.0f)
};
int const_7_val = 7;
cXyz sp178[4] = {
cXyz(0.0f, -10.0f, -56.0f),
cXyz(5.0f, -10.0f, -54.0f),
cXyz(0.0f, 0.0f, -15.0f),
cXyz(0.0f, 0.0f, -20.0f)
};
cXyz sp1a8[4] = {
cXyz(115.0f, -25.0f, 108.0f),
cXyz(-78.0f, -30.0f, 130.0f),
cXyz(85.0f, 0.0f, -40.0f),
cXyz(-25.0f, 70.0f, -75.0f)
};
int const_4_val = 4;
int i;
if (mCurCamStyleTimer == 0) {
tact_p->field_0x4 = 0;
tact_p->field_0x14 = 0;
tact_p->field_0x0 = 0;
tact_p->field_0xc = this->field_0xa8;
if ((this->field_0xa8 & 2) != 0) {
tact_p->field_0x8 = 0;
} else {
tact_p->field_0x8 = 1;
}
field_0x158.field_0x0 = true;
mEventData.field_0x20 = 0;
mEventData.field_0x24 = 0;
tact_p->field_0x1c = sp178;
tact_p->field_0x20 = sp1a8;
tact_p->field_0x24 = const_4_val;
tact_p->field_0x2c = 55.0f;
dComIfGp_saveCameraPosition(0, &field_0x5c.mCenter, &field_0x5c.mEye, field_0x5c.mFovy, field_0x5c.mBank);
}
cXyz sp1e8;
switch (mEventData.field_0x24) {
case 2: {
f32 fVar5;
if ((tact_p->field_0xc & 4) != 0 && (tact_p->field_0xc & 16) != 0 && (tact_p->field_0xc & 128) != 0) {
sp1e8 = sp58[2];
sp58[2] = sp58[3];
sp58[3] = sp1e8;
sp1e8 = spa0[2];
spa0[2] = spa0[3];
spa0[3] = sp1e8;
fVar5 = local_1d0[2];
local_1d0[2] = local_1d0[3];
local_1d0[3] = fVar5;
}
if ((tact_p->field_0xc & 2) != 0 && (tact_p->field_0xc & 32) != 0 && (tact_p->field_0xc & 64) != 0) {
sp1e8 = sp58[2];
sp58[2] = sp58[0];
sp58[0] = sp1e8;
sp1e8 = spa0[2];
spa0[2] = spa0[0];
spa0[0] = sp1e8;
fVar5 = local_1d0[2];
local_1d0[2] = local_1d0[0];
local_1d0[0] = fVar5;
}
if ((tact_p->field_0xc & 1) != 0 && (tact_p->field_0xc & 8) != 0) {
sp1e8 = sp58[1];
sp58[1] = sp58[0];
sp58[0] = sp1e8;
sp1e8 = spa0[1];
spa0[1] = spa0[0];
spa0[0] = sp1e8;
fVar5 = local_1d0[1];
local_1d0[1] = local_1d0[0];
local_1d0[0] = fVar5;
}
if (tact_p->field_0x0 < 20) {
tact_p->field_0x0 = 20;
}
tact_p->field_0x1c = sp58;
tact_p->field_0x20 = spa0;
tact_p->field_0x24 = const_6_val;
tact_p->field_0x2c = 65.0f;
break;
}
case 3:
if (tact_p->field_0x0 < 22) {
tact_p->field_0x0 = 22;
}
break;
case 1:
tact_p->field_0x0 = 0;
break;
case 99:
break;
default:
if (mIsWolf == 1) {
tact_p->field_0x1c = sp178;
tact_p->field_0x20 = sp1a8;
tact_p->field_0x24 = const_4_val;
tact_p->field_0x2c = 65.0f;
} else {
tact_p->field_0x1c = spf4;
tact_p->field_0x20 = sp148;
tact_p->field_0x24 = const_7_val;
tact_p->field_0x2c = 55.0f;
}
}
fopAc_ac_c* mHorseActor = (fopAc_ac_c*)dComIfGp_getHorseActor();
switch (tact_p->field_0x0) {
case 20: {
if (mHorseActor) {
for (i = 0; i < tact_p->field_0x24; i++) {
field_0x5c.mCenter = relationalPos(mHorseActor, &tact_p->field_0x1c[i]);
field_0x5c.mEye = relationalPos(mHorseActor, &tact_p->field_0x20[i]);
if (!lineBGCheck(&field_0x5c.mCenter, &field_0x5c.mEye, 0x4007)
&& !lineCollisionCheck(field_0x5c.mCenter, field_0x5c.mEye, mHorseActor, NULL, NULL)) {
break;
}
}
field_0x5c.mFovy = tact_p->field_0x2c;
tact_p->field_0x0 = 21;
tact_p->field_0x14 = i;
}
break;
}
case 21: {
if (mHorseActor) {
cXyz sp208 = relationalPos(mHorseActor, &tact_p->field_0x1c[tact_p->field_0x14]);
cXyz sp214 = relationalPos(mHorseActor, &tact_p->field_0x20[tact_p->field_0x14]);
if (!lineBGCheck(&sp208, &sp214, 0x4007) &&!lineCollisionCheck(sp208, sp214, mHorseActor, NULL, NULL)) {
field_0x5c.mCenter += (sp208 - field_0x5c.mCenter) * local_1d0[tact_p->field_0x14];
field_0x5c.mEye += (sp214 - field_0x5c.mEye) * local_1d0[tact_p->field_0x14];
} else {
tact_p->field_0x0 = 22;
}
}
break;
}
case 22: {
if (mHorseActor) {
cXyz cStack_220 = relationalPos(mHorseActor, &tact_p->field_0x1c[tact_p->field_0x14]);
cXyz cStack_22c;
cXyz cStack_238 = attentionPos(mpPlayerActor);
cXyz cStack_244;
cXyz local_250(50.0f, -10.0f, -160.0f);
cXyz local_25c = attentionPos(mHorseActor) - cStack_238;
cSAngle acStack_47c(cM_atan2s(local_25c.x, local_25c.z));
if (acStack_47c - directionOf(mpPlayerActor) > cSAngle::_0) {
local_250.x = -local_250.x;
}
//cSAngle acStack_488 = acStack_47c;
local_250 = dCamMath::xyzRotateY(local_250, acStack_47c);
cStack_22c = attentionPos(mpPlayerActor) + local_250;
cM3dGLin cStack_1f0(cStack_220, cStack_22c);
f32 fVar1;
if (cM3d_Len3dSqPntAndSegLine(&cStack_1f0, &cStack_238, &cStack_244, &fVar1)) {
cStack_220 = cStack_244;
}
if (!lineBGCheck(&cStack_220, &cStack_22c, 0x4007) && !lineBGCheck(&cStack_238, &cStack_22c, 0x4007)) {
field_0x5c.mCenter = cStack_220;
field_0x5c.mEye = cStack_22c;
} else {
field_0x5c.mCenter = attentionPos(mpPlayerActor) + tact_p->field_0x30;
field_0x5c.mEye = attentionPos(mpPlayerActor) + tact_p->field_0x3c;
}
tact_p->field_0x0 = 23;
}
break;
}
case 0:
default: {
cXyz sp254;
cXyz sp260 = attentionPos(mpPlayerActor);
for (i = 0; i < tact_p->field_0x24; i++) {
field_0x5c.mCenter = relationalPos(mpPlayerActor, &tact_p->field_0x1c[i]);
sp260.y = field_0x5c.mCenter.y;
if (lineBGCheck(&sp260, &field_0x5c.mCenter, &sp254, 0x4007)) {
field_0x5c.mCenter = sp254 - (cXyz(sp254 - sp260).norm() * 5.0f);
}
field_0x5c.mEye = relationalPos(mpPlayerActor, &tact_p->field_0x20[i]);
sp254 = field_0x5c.mEye + (cXyz(field_0x5c.mEye - sp260).norm() * 5.0f);
if (!lineBGCheck(&sp260, &sp254, 0x4007)
&& !lineCollisionCheck(field_0x5c.mCenter, field_0x5c.mEye, mpPlayerActor, NULL, NULL)) {
break;
}
}
if (tact_p->field_0x0 == 0) {
tact_p->field_0x30 = field_0x5c.mCenter - sp260;
tact_p->field_0x3c = field_0x5c.mEye - sp260;
}
tact_p->field_0x0 = 9;
field_0x5c.mFovy = tact_p->field_0x2c;
break;
}
case 9:
case 29: {
field_0x5c.mCenter = attentionPos(mpPlayerActor) + tact_p->field_0x30;
field_0x5c.mEye = attentionPos(mpPlayerActor) + tact_p->field_0x3c;
break;
}
case 23: {
break;
}
}
#ifdef DEBUG
if (mCamSetup.CheckFlag(0x8000)) {
dDbVw_Report(20, 250, " %d", tact_p->field_0x0);
}
#endif
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
tact_p->field_0x4++;
return 1;
}
/* 800923B8-800923C0 08CCF8 0008+00 0/0 1/0 0/0 .text turnToActorEvCamera__9dCamera_cFv */
bool dCamera_c::turnToActorEvCamera() {
return true;
}
/* 800923C0-800924D0 08CD00 0110+00 0/0 1/0 0/0 .text stbWaitEvCamera__9dCamera_cFv */
bool dCamera_c::stbWaitEvCamera() {
dDemo_camera_c* demo_cam = dDemo_c::getCamera();
#if DEBUG
char* enabled_report = "-----";
#endif
if (demo_cam != NULL) {
if (demo_cam->checkEnable(0x40)) {
field_0x5c.mCenter = demo_cam->getTarget();
#if DEBUG
enabled_report[0] = 'C';
#endif
}
if (demo_cam->checkEnable(0x10)) {
field_0x5c.mEye = demo_cam->getTrans();
#if DEBUG
enabled_report[1] = 'E';
#endif
}
if (demo_cam->checkEnable(0x4)) {
field_0x5c.mFovy = demo_cam->getFovy();
#if DEBUG
enabled_report[2] = 'F';
#endif
}
if (demo_cam->checkEnable(0x20)) {
mUp = demo_cam->getUp();
#if DEBUG
enabled_report[3] = 'U';
#endif
}
if (demo_cam->checkEnable(0x80)) {
field_0x5c.mBank = cAngle::d2s(-demo_cam->getRoll());
#if DEBUG
enabled_report[4] = 'B';
#endif
}
#if DEBUG
if (mCamSetup.CheckFlag(0x8000)) {
dDbVw_Report(90, 190, "%s", enabled_report);
}
#endif
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
}
return true;
}
/* 800924D0-8009258C 08CE10 00BC+00 0/0 1/0 0/0 .text saveEvCamera__9dCamera_cFv */
bool dCamera_c::saveEvCamera() {
int slot;
getEvIntData(&slot, "Slot", 0);
if (slot == 9) {
dComIfGp_saveCameraPosition(0, &field_0x5c.mCenter, &field_0x5c.mEye, field_0x5c.mFovy, field_0x5c.mBank.Val());
} else {
pushInfo(&field_0xd0[slot], 1);
}
field_0x158.field_0x0 = 1;
return true;
}
/* 8009258C-800929AC 08CECC 0420+00 0/0 1/0 0/0 .text loadEvCamera__9dCamera_cFv */
bool dCamera_c::loadEvCamera() {
struct mWork::load* load = &mWork.load;
f32 local_58[6] = { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f };
if (mCurCamStyleTimer == 0) {
getEvIntData(&load->mSlot, "Slot", 0);
getEvIntData(&load->mTimer, "Timer", 1);
getEvIntData(&load->mType, "Type", (load->mTimer < 10) ? 0 : 1);
if (load->mType > 1) {
OS_REPORT("camera: event: LOAD: warning!! type %d unknown\n", load->mType);
load->mType = 1;
}
if (load->mType != 0) {
mEventData.field_0xf0.Init(4, load->mTimer + 1);
mEventData.field_0xf0.Step();
}
if (load->mSlot == 9) {
s16 local_b0;
dComIfGp_loadCameraPosition(0, &load->field_0x28, &load->field_0x34, &load->field_0x48, &local_b0);
load->field_0x42 = cSAngle(local_b0);
} else {
#ifdef DEBUG
if (field_0xd0[load->mSlot].field_0x1e == 0 || load->mSlot >= 2) {
OS_REPORT("camera: event: LOAD: warning!! slot %d not saved\n", load->mSlot);
}
#endif
dCamInfo_c* pdVar3 = &field_0xd0[load->mSlot];
load->field_0x28 = pdVar3->mCenter;
load->field_0x34 = pdVar3->mEye;
load->field_0x48 = pdVar3->mFovy;
load->field_0x42 = pdVar3->mBank;
}
load->field_0x1c = field_0x5c.mCenter;
load->field_0xc = field_0x5c.mDirection;
load->field_0x14.Val(load->field_0x34 - load->field_0x28);
load->field_0x44 = field_0x5c.mFovy;
load->field_0x40 = field_0x5c.mBank;
}
if (mCurCamStyleTimer < load->mTimer) {
f32 fVar5;
if (load->mType != 0) {
mEventData.field_0xf0.Step();
fVar5 = mEventData.field_0xf0.Calc(local_58);
} else {
fVar5 = (mCurCamStyleTimer + 1) / f32(load->mTimer);
}
field_0x5c.mCenter = load->field_0x1c + ((load->field_0x28 - load->field_0x1c) * fVar5);
field_0x5c.mDirection.R(load->field_0xc.R() + (fVar5 * (load->field_0x14.R() - load->field_0xc.R())));
field_0x5c.mDirection.V(load->field_0xc.V() + ((load->field_0x14.V() - load->field_0xc.V()) * fVar5));
field_0x5c.mDirection.U(load->field_0xc.U() + ((load->field_0x14.U() - load->field_0xc.U()) * fVar5));
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = load->field_0x44 + (fVar5 * (load->field_0x48 - load->field_0x44));
field_0x5c.mBank = load->field_0x40 + ((load->field_0x42 - load->field_0x40) * fVar5);
return 0;
} else {
field_0x158.field_0x0 = true;
return 1;
}
}
/* 800929AC-800937AC 08D2EC 0E00+00 0/0 1/0 0/0 .text useItem0EvCamera__9dCamera_cFv */
bool dCamera_c::useItem0EvCamera() {
struct mWork::item* item_p = &mWork.item;
cXyz vec_1dc(10.0f, -15.0f, 20.0f);
cXyz vecs_338[4] = {
cXyz(30.0f, 115.0f, 70.0f),
cXyz(0.0f, 120.0f, 64.0f),
cXyz(65.0f, 120.0f, -10.0f),
cXyz(40.0f, 118.0f, 0.0f)
};
int const_1st_4_val = 4;
cXyz vec_1d0(0.0f, -32.0f, 15.0f);
cXyz vecs_368[6] = {
cXyz(80.0f, -50.0f, 140.0f),
cXyz(-52.0f, 34.0f, 80.0f),
cXyz(80.0f, 116.0f, 88.0f),
cXyz(55.0f, -33.0f, 100.0f),
cXyz(105.0f, -55.0f, 70.0f),
cXyz(16.0f, 52.0f, -8.0f),
};
int const_6_val = 6;
cXyz vec_1c4(0.0f, -80.0f, 25.0f);
cXyz vecs_308[4] = {
cXyz(-85.0f, -15.0f, 240.0f),
cXyz(-95.0f, 92.0f, 165.0f),
cXyz(155.0f, 80.0f, 120.0f),
cXyz(5.0f, 108.0f, 155.0f)
};
int const_2nd_4_val = 4;
cXyz vec_1b8(0.0f, -27.0f, 25.0f);
cXyz vecs_2d8[4] = {
cXyz(-90.0f, -70.0f, 150.0f),
cXyz(130.0f, -68.0f, 114.0f),
cXyz(5.0f, 130.0f, 110.0f),
cXyz(-45.0f, -50.0f, -110.0f)
};
int const_3rd_4_val = 4;
cXyz vec_1ac(30.241f, 12.653f, 13.95f);
cXyz vecs_2b4[3] = {
cXyz(23.639f, 96.636f, 57.318f),
cXyz(-2.849f, 96.639f, 42.753f),
cXyz(23.639f, 96.636f, 57.318)
};
int const_1st_3_val = 3;
cXyz vec_1a0(0.0f, -60.0f, -15.0f);
cXyz vecs_290[3] = {
cXyz(-90.0f, 115.0f, 120.0f),
cXyz(75.0f, 105.0f, 65.0f),
cXyz(80.0f, 110.0f, -130.0f)
};
int const_2nd_3_val = 3;
cXyz vec_194(0.0f, -15.0f, -100.0f);
cXyz vecs_200[2] = {
cXyz(-100.0f, -60.0f, -420.0f),
cXyz(110.0f, -55.0f, -400.0f)
};
int const_1st_2_val = 2;
cXyz vec_188(0.0f, 10.0f, -30.0f);
cXyz vecs_1e8[2] = {
cXyz(95.0f, -55.0f, -245.0f),
cXyz(-58.0f, -65.0f, -250.0f)
};
int const_2nd_2_val = 2;
cXyz vec_17c(0.0f, -15.0f, 20.0f);
cXyz vecs_260[4] = {
cXyz(-105.0f, 1.5f, 47.0f),
cXyz(113.0f, -28.0f, -12.0f),
cXyz(96.0f, 50.0f, 38.0f),
cXyz(-68.0f, 70.0f, 82.0f)
};
int const_4th_4_val = 4;
cXyz vec_170(0.0f, 15.0f, -40.0f);
cXyz vecs_23c[3] = {
cXyz(65.0f, 350.0f, -85.0f),
cXyz(-110.0f, 340.0f, -115.0f),
cXyz(100.0f, 30.0f, 270.0f)
};
int const_3rd_3_val = 3;
cXyz vec_164(0.0f, -20.0f, 30.0f);
cXyz vecs_218[3] = {
cXyz(-85.0f, -10.0f, 300.0f),
cXyz(50.0f, 165.0f, 160.0f),
cXyz(-260.0f, -50.0f, 30.0f)
};
int const_4th_3_val = 3;
struct UseItem0Data {
cXyz* field_0x00;
cXyz* field_0x04;
int field_0x08;
f32 field_0x0c;
int field_0x10;
int field_0x14;
int field_0x18;
};
UseItem0Data data_list[13] = {
{&vec_1c4, vecs_308, const_2nd_4_val, 65.0f, 30, 0, -1},
{&vec_1d0, vecs_368, const_6_val, 65.0f, 40, 0, -1},
{&vec_1c4, vecs_308, const_2nd_4_val, 65.0f, 40, 0, 7},
{&vec_1b8, vecs_2d8, const_3rd_4_val, 65.0f, 40, 0, 7},
{&vec_1dc, vecs_338, const_1st_4_val, 65.0f, 10, 73, -1},
{&vec_1ac, vecs_2b4, const_1st_3_val, 70.0f, 45, 0, -1},
{&vec_1a0, vecs_290, const_2nd_3_val, 60.0f, 40, 0, -1},
{&vec_1a0, vecs_290, const_2nd_3_val, 60.0f, 40, 0, -1},
{&vec_194, vecs_200, const_1st_2_val, 45.0f, 80, 10, -1},
{&vec_188, vecs_1e8, const_2nd_2_val, 65.0f, 40, 0, -1},
{&vec_17c, vecs_260, const_4th_4_val, 60.0f, 40, 0, -1},
{&vec_164, vecs_218, const_4th_3_val, 60.0f, 1, 60, -1},
{&vec_1dc, vecs_338, const_1st_4_val, 65.0f, 20, 0, -1},
};
cSAngle acStack_53c, acStack_540;
cXyz sp408;
int idx;
bool ret = false;
if (mCurCamStyleTimer == 0) {
item_p->field_0x0 = 0;
item_p->field_0x44 = mCenter;
item_p->field_0x50 = mEye;
item_p->field_0x5c = mFovy;
}
cXyz att_pos = attentionPos(mpPlayerActor);
cXyz sp424;
switch (item_p->field_0x0) {
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 0:
default: {
getEvIntData(&item_p->mType, "Type", 0);
item_p->field_0x1c = 0;
item_p->field_0x20 = 0;
}
// fallthrough intentional.
case 10:
case 11: {
item_p->field_0x0 = 10;
if (++item_p->field_0x20 >= data_list[item_p->mType].field_0x14) {
item_p->field_0x20 = 0;
if ((field_0xa8 & data_list[item_p->mType].field_0x18) == 0) {
cXyz temp_vec(data_list[item_p->mType].field_0x04[0]);
data_list[item_p->mType].field_0x04[0] = data_list[item_p->mType].field_0x04[1];
data_list[item_p->mType].field_0x04[1] = temp_vec;
}
item_p->field_0xc = relationalPos(mpPlayerActor, data_list[item_p->mType].field_0x00);
item_p->field_0x18 = data_list[item_p->mType].field_0x0c;
item_p->field_0x4 = data_list[item_p->mType].field_0x10;
if (lineBGCheck(&att_pos, &item_p->field_0xc, &sp424, 0x40b7)) {
item_p->field_0xc = sp424 + field_0x5c.mDirection.Norm();
}
for (idx = 0; idx < data_list[item_p->mType].field_0x08; idx++) {
sp408 = relationalPos(mpPlayerActor, &data_list[item_p->mType].field_0x04[idx]);
if (sp408.y < mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y) {
sp408.y = mBG.field_0x108.field_0x4 + positionOf(mpPlayerActor).y;
}
fopAc_ac_c* mActor = NULL;
switch (item_p->mType) {
case 1:
case 10: {
if (daPy_getPlayerActorClass()->checkHorseRide() != 0) {
mActor = (fopAc_ac_c*)dComIfGp_getHorseActor();
} else if (daPy_getPlayerActorClass()->checkCanoeRide() != 0) {
mActor = fopAcM_SearchByName(0xed);
}
}
}
if (!lineBGCheck(&item_p->field_0xc, &sp408, 0x4007) && !lineBGCheck(&att_pos, &sp408, 0x4007)
&& !lineCollisionCheck(item_p->field_0xc, sp408, mpPlayerActor, mActor, NULL)) {
break;
}
}
if (idx >= data_list[item_p->mType].field_0x08) {
item_p->field_0xc = item_p->field_0x44;
item_p->field_0x18 = item_p->field_0x5c;
sp408 = item_p->field_0x50;
}
item_p->field_0x24.Val(sp408 - item_p->field_0xc);
item_p->field_0x0 = 1;
}
break;
}
case 1: {
f32 fVar1 = item_p->field_0x20 / f32(item_p->field_0x4);
field_0x5c.mFovy += fVar1 * (item_p->field_0x18 - field_0x5c.mFovy);
field_0x5c.mCenter += (item_p->field_0xc - field_0x5c.mCenter) * fVar1;
f32 fVar2 = field_0x5c.mDirection.R();
acStack_540 = field_0x5c.mDirection.V();
acStack_53c = field_0x5c.mDirection.U();
fVar2 = fVar2 + (fVar1 * (item_p->field_0x24.R() - fVar2));
acStack_540 += (item_p->field_0x24.V() - acStack_540) * fVar1;
acStack_53c += (item_p->field_0x24.U() - acStack_53c) * fVar1;
field_0x5c.mDirection.Val(fVar2, acStack_540, acStack_53c);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
if (item_p->field_0x20 < item_p->field_0x4) {
break;
}
item_p->field_0x0 = 2;
}
// fallthrough
case 2: {
field_0x5c.mCenter = item_p->field_0xc;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
item_p->field_0x1c++;
if (item_p->field_0x1c == 1) {
if (item_p->mType == 0) {
item_p->field_0x0 = 11;
item_p->mType = 4;
break;
}
if (item_p->mType == 7) {
item_p->field_0x0 = 11;
item_p->mType = 8;
break;
}
if (item_p->mType == 11) {
item_p->field_0x0 = 999;
break;
}
}
item_p->field_0x0 = 99;
}
// fallthrough
case 99: {
field_0x158.field_0x0 = true;
field_0x5c.mCenter = item_p->field_0xc;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
}
case 999: {
ret = true;
}
}
item_p->field_0x20++;
return ret;
}
/* 800937AC-80094240 08E0EC 0A94+00 0/0 1/0 0/0 .text useItem1EvCamera__9dCamera_cFv */
bool dCamera_c::useItem1EvCamera() {
struct mWork::item* item_p = &mWork.item;
if (mCurCamStyleTimer == 0) {
getEvIntData(&item_p->mType, "Type", 0);
if (item_p->mType == 0) {
item_p->field_0x2c = field_0x5c.mCenter - attentionPos(mpPlayerActor);
item_p->field_0x38 = field_0x5c.mEye - attentionPos(mpPlayerActor);
}
}
if (item_p->mType == 0) {
f32 mult_val = 0.05f;
item_p->field_0x2c.y += (20.0f - item_p->field_0x2c.y) * mult_val;
item_p->field_0x2c.x += -item_p->field_0x2c.x * mult_val;
item_p->field_0x2c.z += -item_p->field_0x2c.z * mult_val;
f32 r_val = field_0x5c.mDirection.R();
field_0x5c.mCenter = attentionPos(mpPlayerActor) + item_p->field_0x2c;
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
field_0x5c.mDirection.R(r_val);
if (field_0x5c.mDirection.V() > cSAngle(70.0f)) {
field_0x5c.mDirection.V(cSAngle(70.0f));
}
if (field_0x5c.mDirection.V() < cSAngle(0.0f)) {
field_0x5c.mDirection.V(cSAngle(0.0f));
}
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += (20.0f - field_0x5c.mFovy) * mult_val;
return 1;
}
cXyz spec(0.0f, 0.0f, 0.0f);
cXyz spf8(0.0f, -70.0f, 70.0f);
cXyz sp104(0.0f, -30.0f, 70.0f);
cXyz* sp264 = &spec;
cXyz vec_1b0;
daPy_py_c* mPlayer = daPy_getPlayerActorClass();
daMidna_c* mMidna = (daMidna_c*)daPy_py_c::getMidnaActor();
if (mIsWolf == 1) {
if (mPlayer->checkMidnaRide() && mMidna->checkNoDraw()) {
sp264 = &sp104;
} else {
sp264 = &spf8;
}
}
cXyz vec_1a4(10.0f, -60.0f, 0.0f);
cXyz vecs_218[6] = {
cXyz(90.0f, 20.0f, 180.0f),
cXyz(-100.0f, 50.0f, -180.0f),
cXyz(60.0f, 150.0f, 165.0f),
cXyz(-150.0f, 30.0f, 170.0f),
cXyz(0.0f, -20.0f, 165.0f),
cXyz(40.0f, 150.0f, -85.0f)
};
int const_6_val = 6;
struct UseItem0Data {
cXyz* field_0x00;
cXyz* field_0x04;
int field_0x08;
f32 field_0x0c;
int field_0x10;
int field_0x14;
int field_0x18;
};
UseItem0Data data_list[1][2] = {
{
{&vec_1a4, vecs_218, const_6_val, 65.0f, 1, 1, 7},
{ NULL, NULL, -1, 30.0f, 80, 0, -1}
}
};
cSAngle acStack_288;
cSAngle acStack_28c;
cXyz vec_198;
bool rv = false;
if (mCurCamStyleTimer == 0) {
item_p->field_0x0 = 0;
item_p->field_0x44 = mCenter;
item_p->field_0x50 = mEye;
item_p->field_0x5c = mFovy;
}
cXyz sp134 = attentionPos(mpPlayerActor);
cXyz sp140;
bool unused_yet_set_bool = false;
switch (item_p->field_0x0) {
case 0: {
item_p->field_0x1c = 0;
item_p->field_0x0 = 1;
}
// fallthrough
case 1: {
item_p->field_0x18 = data_list[item_p->mType][item_p->field_0x1c].field_0x0c;
item_p->field_0xc = field_0x5c.mCenter;
if (data_list[item_p->mType][item_p->field_0x1c].field_0x00 != NULL) {
vec_1b0 = data_list[item_p->mType][item_p->field_0x1c].field_0x00[0] + *sp264;
item_p->field_0xc = relationalPos(mpPlayerActor, &vec_1b0);
if ((field_0xa8 & data_list[item_p->mType][item_p->field_0x1c].field_0x18) == 0) {
cXyz cStack_14c = data_list[item_p->mType][item_p->field_0x1c].field_0x04[0];
data_list[item_p->mType][item_p->field_0x1c].field_0x04[0]
= data_list[item_p->mType][item_p->field_0x1c].field_0x04[1];
data_list[item_p->mType][item_p->field_0x1c].field_0x04[1] = cStack_14c;
}
if (lineBGCheck(&sp134, &item_p->field_0xc, &sp140, 0x40b7)) {
item_p->field_0xc = sp140 + field_0x5c.mDirection.Norm();
}
}
vec_198 = field_0x5c.mEye;
if (data_list[item_p->mType][item_p->field_0x1c].field_0x04 != NULL) {
int i;
for (i = 0; i < data_list[item_p->mType][item_p->field_0x1c].field_0x08; i++) {
vec_198 = relationalPos(mpPlayerActor, &data_list[item_p->mType][item_p->field_0x1c].field_0x04[i]);
fopAc_ac_c* mHorseActor = (fopAc_ac_c*)dComIfGp_getHorseActor();
if (!lineBGCheck(&item_p->field_0xc, &vec_198, 0x4007) && !lineBGCheck(&sp134, &vec_198, 0x4007)
&& !lineCollisionCheck(item_p->field_0xc, vec_198, mpPlayerActor, mHorseActor, NULL)) {
break;
}
}
if (i >= data_list[item_p->mType][item_p->field_0x1c].field_0x08) {
vec_198 = field_0x5c.mEye;
}
}
item_p->field_0x24.Val(vec_198 - item_p->field_0xc);
item_p->field_0x0 = 2;
item_p->field_0x4 = data_list[item_p->mType][item_p->field_0x1c].field_0x10;
item_p->field_0x20 = 1;
unused_yet_set_bool = true;
(void) unused_yet_set_bool;
}
// fallthrough intentional.
case 2: {
if (item_p->field_0x4 > 1) {
f32 fVar1 = item_p->field_0x20 / f32(item_p->field_0x4);
field_0x5c.mFovy += fVar1 * (item_p->field_0x18 - field_0x5c.mFovy);
field_0x5c.mCenter += (item_p->field_0xc - field_0x5c.mCenter) * fVar1;
f32 fVar2 = field_0x5c.mDirection.R();
acStack_28c = field_0x5c.mDirection.V();
acStack_288 = field_0x5c.mDirection.U();
fVar2 = fVar2 + (fVar1 * (item_p->field_0x24.R() - fVar2));
acStack_28c += (item_p->field_0x24.V() - acStack_28c) * fVar1;
acStack_288 += (item_p->field_0x24.U() - acStack_288) * fVar1;
field_0x5c.mDirection.Val(fVar2, acStack_28c, acStack_288);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
if (item_p->field_0x20 < item_p->field_0x4) break;
}
item_p->field_0x0 = 3;
item_p->field_0x4 = data_list[item_p->mType][item_p->field_0x1c].field_0x14;
item_p->field_0x20 = 1;
}
// fallthrough
case 3: {
field_0x5c.mCenter = item_p->field_0xc;
field_0x5c.mEye = field_0x5c.mCenter + item_p->field_0x24.Xyz();
field_0x5c.mDirection = item_p->field_0x24;
field_0x5c.mFovy = item_p->field_0x18;
if (item_p->field_0x20 < item_p->field_0x4) break;
if (data_list[item_p->mType][1].field_0x08 != NULL && item_p->field_0x1c == 0) {
item_p->field_0x1c = 1;
item_p->field_0x0 = 1;
break;
}
item_p->field_0x0 = 99;
}
// fallthrough
case 99:
default: {
field_0x158.field_0x0 = true;
rv = true;
}
}
item_p->field_0x20++;
return rv;
}
/* 80094240-80094A70 08EB80 0830+00 0/0 1/0 0/0 .text getItemEvCamera__9dCamera_cFv */
bool dCamera_c::getItemEvCamera() {
struct mWork::getItem* gitem_p = &mWork.getItem;
cXyz cStack_90[8] = {
cXyz(0.0f, -27.0f, 32.0f),
cXyz(84.0f, -18.0f, 134.0f),
cXyz(17.0f, 10.0f, -45.0f),
cXyz(-45.0f, 128.0f, 45.0f),
cXyz(0.0f, -27.0f, -62.0f),
cXyz(-84.0f, -18.0f, -164.0f),
cXyz(-12.0f, 10.0f, -130.0f),
cXyz(50.0f, 128.0f, -220.0f),
};
struct GetItemData {
cXyz* field_0x00;
cXyz* field_0x04;
f32 field_0x08;
int field_0x0c;
int field_0x10;
};
GetItemData data_list[5] = {
{&cStack_90[0], &cStack_90[1], 50.0f, 12, 1},
{&cStack_90[2], &cStack_90[3], 50.0f, 12, 0},
{&cStack_90[4], &cStack_90[5], 50.0f, 17, -1},
{&cStack_90[4], &cStack_90[5], 50.0f, 17, -1},
{&cStack_90[6], &cStack_90[7], 50.0f, 17, 0},
};
f32 my_floats[6] = { 0.0f, 0.0f, 0.1f, 0.7f, 1.0f, 1.0f };
int const_6_val = 6;
if (mCurCamStyleTimer == 0) {
cXyz vec_134;
getEvIntData(&gitem_p->field_0x8, "Type", mIsWolf != 1 ? 0 : 1);
if (gitem_p->field_0x8 == 2) {
if (mIsWolf != 1) {
gitem_p->field_0x8 = 3;
} else {
gitem_p->field_0x8 = 4;
}
OS_REPORT("camera: event: => %d\n", gitem_p->field_0x8);
}
getEvIntData(&gitem_p->mTimer, "Timer", data_list[gitem_p->field_0x8].field_0x0c);
if ((gitem_p->field_0x18 = getEvFloatListData(&gitem_p->mCurvePoints, "CurvePoints")) == 0) {
gitem_p->mCurvePoints = my_floats;
gitem_p->field_0x18 = const_6_val;
}
getEvXyzData(&gitem_p->mStartCenter, "StartCenter", mCenter);
getEvXyzData(&gitem_p->mStartEye, "StartEye", mEye);
gitem_p->mRelActor = getEvActor("RelActor", "@PLAYER");
gitem_p->mRelActorID = fopAcM_GetID(gitem_p->mRelActor);
getEvXyzData(&vec_134, "Center", *data_list[gitem_p->field_0x8].field_0x00);
gitem_p->field_0x44 = relationalPos(gitem_p->mRelActor, &vec_134);
if (data_list[gitem_p->field_0x8].field_0x10 == 1) {
cSGlobe cStack_208(mEye - positionOf(gitem_p->mRelActor));
cSAngle acStack_224(cStack_208.U() - directionOf(gitem_p->mRelActor));
if (acStack_224 < cSAngle::_0) {
data_list[gitem_p->field_0x8].field_0x04->x = -data_list[gitem_p->field_0x8].field_0x04->x;
}
vec_134 = relationalPos(gitem_p->mRelActor, data_list[gitem_p->field_0x8].field_0x04);
if (lineBGCheck(&gitem_p->field_0x44, &vec_134, 0x4007)) {
data_list[gitem_p->field_0x8].field_0x04->x = -data_list[gitem_p->field_0x8].field_0x04->x;
}
} else if (data_list[gitem_p->field_0x8].field_0x10 == -1) {
cSGlobe cStack_210(mEye - positionOf(gitem_p->mRelActor));
cSAngle acStack_228(cStack_210.U() - directionOf(gitem_p->mRelActor));
if (acStack_228 > cSAngle::_0) {
data_list[gitem_p->field_0x8].field_0x04->x = -data_list[gitem_p->field_0x8].field_0x04->x;
}
vec_134 = relationalPos(gitem_p->mRelActor, data_list[gitem_p->field_0x8].field_0x04);
if (lineBGCheck(&gitem_p->field_0x44, &vec_134, 0x4007)) {
data_list[gitem_p->field_0x8].field_0x04->x = -data_list[gitem_p->field_0x8].field_0x04->x;
}
}
getEvXyzData(&vec_134, "Eye", *data_list[gitem_p->field_0x8].field_0x04);
gitem_p->field_0x50 = relationalPos(gitem_p->mRelActor, &vec_134);
gitem_p->field_0x3c.Val(gitem_p->mStartEye - gitem_p->mStartCenter);
gitem_p->field_0x64.Val(gitem_p->field_0x50 - gitem_p->field_0x44);
mEventData.field_0xf0.Init(gitem_p->field_0x18, gitem_p->mTimer + 1);
mEventData.field_0xf0.Step();
}
if (gitem_p->mRelActor && fopAcM_SearchByID(gitem_p->mRelActorID) == NULL) {
OS_REPORT("camera: event: error: relational base actor dead\n");
return 1;
}
if (mCurCamStyleTimer < gitem_p->mTimer) {
mEventData.field_0xf0.Step();
f32 fVar1 = mEventData.field_0xf0.Calc(gitem_p->mCurvePoints);
field_0x5c.mCenter = gitem_p->mStartCenter + ((gitem_p->field_0x44 - gitem_p->mStartCenter) * fVar1);
field_0x5c.mDirection.R(gitem_p->field_0x3c.R() + (fVar1 * (gitem_p->field_0x64.R() - gitem_p->field_0x3c.R())));
field_0x5c.mDirection.V(gitem_p->field_0x3c.V() + ((gitem_p->field_0x64.V() - gitem_p->field_0x3c.V()) * fVar1));
field_0x5c.mDirection.U(gitem_p->field_0x3c.U() + ((gitem_p->field_0x64.U() - gitem_p->field_0x3c.U()) * fVar1));
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += fVar1 * (data_list[gitem_p->field_0x8].field_0x08 - field_0x5c.mFovy);
return 0;
}
return 1;
}
namespace {
inline static int get_camera_id(camera_class* i_camera) {
return fopCamM_GetParam(i_camera);
}
inline static dDlst_window_c* get_window(camera_class* i_camera) {
return dComIfGp_getWindow(dComIfGp_getCameraWinID(get_camera_id(i_camera)));
}
}
/* 80094A70-80095010 08F3B0 05A0+00 0/0 1/0 0/0 .text possessedEvCamera__9dCamera_cFv */
bool dCamera_c::possessedEvCamera() {
struct mWork::possessed* possessed = &mWork.possessed;
cXyz vec_d8;
bool rv = 0;
if (mCurCamStyleTimer == 0) {
possessed->field_0x0 = 0;
}
switch (possessed->field_0x0) {
case 0:
default: {
if (!(possessed->mTargetActor = getEvActor("Target", "@PLAYER"))) {
return 1;
}
getEvIntData(&possessed->mType, "Type", 0);
getEvIntData(&possessed->mTimer, "Timer", 10);
getEvFloatData(&possessed->mRadius, "Radius", 60.0f);
getEvFloatData(&possessed->mCushion, "Cushion", 1.0f);
f32 fVar1;
getEvFloatData(&fVar1, "Latitude", -5.0f);
possessed->mLatitude.Val(fVar1);
getEvFloatData(&fVar1, "Longitude", 0.0f);
possessed->mLongitude.Val(fVar1);
getEvFloatData(&possessed->mFovy, "Fovy", 45.0f);
getEvIntData(&possessed->mBlure, "Blure", 0);
if (possessed->mType == 0) {
possessed->field_0x28.Val(possessed->mRadius, possessed->mLatitude, possessed->mLongitude + directionOf(possessed->mTargetActor));
pushInfo(&field_0xd0[1], 2);
field_0xd0[1].field_0x1e = 2;
} else {
field_0x5c.mCenter = eyePos(possessed->mTargetActor);
possessed->field_0x28.Val(field_0xd0[1].mEye - field_0xd0[1].mCenter);
field_0x5c.mDirection.Val(possessed->mRadius, possessed->mLatitude, possessed->mLongitude + directionOf(possessed->mTargetActor));
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy = possessed->mFovy;
}
possessed->field_0x0 = 1;
possessed->field_0xc = possessed->mTimer;
switch (possessed->mBlure) {
case 1:
StartBlure(possessed->mTimer, possessed->mTargetActor, 0.5f, 0.99f);
break;
case 2:
StartBlure(possessed->mTimer, possessed->mTargetActor, 0.63f, 0.99f);
}
break;
}
case 1: {
f32 fVar1 = 1.0f / possessed->field_0xc;
field_0x5c.mCenter += ((eyePos(possessed->mTargetActor) - field_0x5c.mCenter) * fVar1);
field_0x5c.mDirection.R(field_0x5c.mDirection.R() + (fVar1 * (possessed->field_0x28.R() - field_0x5c.mDirection.R())));
field_0x5c.mDirection.V(field_0x5c.mDirection.V() + ((possessed->field_0x28.V() - field_0x5c.mDirection.V()) * fVar1));
field_0x5c.mDirection.U(field_0x5c.mDirection.U() + ((possessed->field_0x28.U() - field_0x5c.mDirection.U()) * fVar1));
vec_d8 = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mEye += (vec_d8 - field_0x5c.mEye) * possessed->mCushion;
field_0x5c.mFovy += fVar1 * (possessed->mFovy - field_0x5c.mFovy);
switch (possessed->mBlure) {
default: {
break;
}
case 1: {
scissor_class* scissor = get_window(field_0x0)->getScissor();
cXyz mEyePos = eyePos(possessed->mTargetActor);
cXyz sp60;
mDoLib_project(&mEyePos, &sp60);
SetBlurePosition(sp60.x / scissor->width, sp60.y / scissor->height, 0.0f);
SetBlureAlpha((fVar1 * 0.699999988079071f) + 0.5f);
SetBlureScale((fVar1 * 0.09000000357627869f) + 1.1f, 0.98f - (fVar1 * 0.18000000715255737f), 0.0f);
}
}
possessed->field_0xc--;
if (possessed->field_0xc <= 0) {
possessed->field_0x0 = 99;
}
break;
}
case 99: {
rv = 1;
field_0x158.field_0x0 = true;
}
}
return rv;
}
/* 80095010-8009544C 08F950 043C+00 0/0 1/0 0/0 .text fixedFramesEvCamera__9dCamera_cFv */
bool dCamera_c::fixedFramesEvCamera() {
int const_1_val = 1;
struct mWork::fixedFrames* fframes_p = &mWork.fixedFrames;
if (mCurCamStyleTimer == 0) {
cXyz sp30, sp3c;
fframes_p->field_0x38 = 9999;
int substanceNum;
char* key = "Centers";
if ((substanceNum = dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, key)) != 0) {
fframes_p->field_0x1c[1] = dComIfGp_evmng_getMyXyzP(mEventData.field_0x4, key);
if (fframes_p->field_0x38 > substanceNum) {
fframes_p->field_0x38 = substanceNum;
}
} else {
OS_REPORT("camera: event: error: %s (xyz*) not found\n", key);
return 1;
}
key = "Eyes";
if ((substanceNum = dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, key)) != 0) {
fframes_p->field_0x1c[0] = dComIfGp_evmng_getMyXyzP(mEventData.field_0x4, key);
if (fframes_p->field_0x38 > substanceNum) {
fframes_p->field_0x38 = substanceNum;
}
} else {
OS_REPORT("camera: event: error: %s (xyz*) not found\n", key);
return 1;
}
key = "Fovys";
if ((substanceNum = dComIfGp_evmng_getMySubstanceNum(mEventData.field_0x4, key)) != 0) {
fframes_p->field_0x24 = dComIfGp_evmng_getMyFloatP(mEventData.field_0x4, key);
if (fframes_p->field_0x38 > substanceNum) {
fframes_p->field_0x38 = substanceNum;
}
} else {
OS_REPORT("camera: event: error: %s (float*) not found\n", key);
return 1;
}
fframes_p->field_0x0 = getEvIntData(&fframes_p->mTimer, "Timer", const_1_val);
getEvStringData(&fframes_p->mRelUseMask, "RelUseMask", "oo");
#ifdef DEBUG
if (strlen(&fframes_p->mRelUseMask) != 2) {
OSReport("camera: event: bad length -> xx\n");
strcpy(&fframes_p->mRelUseMask, "xx");
JUTAssertion::showAssert(JUTAssertion::getSDevice(), "d_ev_camera.cpp", 0x129c, "Halt");
OSPanic("d_ev_camera.cpp", 0x129c, "Halt");
}
#endif
fframes_p->mRelActor = getEvActor("RelActor");
int iVar1 = 0, i = 0;
getEvIntData(&fframes_p->mChoice, "Choice", 0);
if (fframes_p->mChoice == 1) {
iVar1 = fabsf(cM_rndFX(fframes_p->field_0x38 - 0.01f));
}
for (i = 0; i < fframes_p->field_0x38; i++) {
sp30 = fframes_p->field_0x1c[1][iVar1];
sp3c = fframes_p->field_0x1c[0][iVar1];
if (fframes_p->mRelActor && fframes_p->mRelUseMask == 111) {
fframes_p->field_0x4 = relationalPos(fframes_p->mRelActor, &sp30);
} else {
fframes_p->field_0x4 = sp30;
}
if (fframes_p->mRelActor && fframes_p->field_0x31 == 111) {
fframes_p->field_0x10 = relationalPos(fframes_p->mRelActor, &sp3c);
} else {
fframes_p->field_0x10 = sp3c;
}
fframes_p->field_0x28 = fframes_p->field_0x24[iVar1];
if (!lineBGCheck(&fframes_p->field_0x4, &fframes_p->field_0x10, 0x4007)
&& !lineCollisionCheck(fframes_p->field_0x4, fframes_p->field_0x10,
mpPlayerActor, fframes_p->mRelActor, NULL)) {
break;
}
iVar1++;
if (iVar1 >= fframes_p->field_0x38) {
iVar1 = 0;
}
}
field_0x158.field_0x0 = true;
}
field_0x5c.mCenter = fframes_p->field_0x4;
field_0x5c.mEye = fframes_p->field_0x10;
field_0x5c.mFovy = fframes_p->field_0x28;
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
if (fframes_p->field_0x0 && mCurCamStyleTimer < fframes_p->mTimer) {
return 0;
}
return 1;
}
/* 8009544C-800956E4 08FD8C 0298+00 0/0 1/0 0/0 .text bSplineEvCamera__9dCamera_cFv */
bool dCamera_c::bSplineEvCamera() {
struct mWork::bSpline* bSpline = &mWork.bSpline;
if (mCurCamStyleTimer == 0) {
bSpline->field_0x1c = 0;
bSpline->field_0x10 = 9999;
char* key = "Centers";
int iVar1 = getEvXyzListData(&bSpline->mCenters, key);
if (iVar1 != 0) {
if (bSpline->field_0x10 > iVar1) {
bSpline->field_0x10 = iVar1;
}
} else {
return 1;
}
key = "Eyes";
iVar1 = getEvXyzListData(&bSpline->mEyes, key);
if (iVar1 != 0) {
if (bSpline->field_0x10 > iVar1) {
bSpline->field_0x10 = iVar1;
}
} else {
return 1;
}
key = "Fovys";
iVar1 = getEvFloatListData(&bSpline->mFovys, key);
if (iVar1 != 0) {
if (bSpline->field_0x10 > iVar1) {
bSpline->field_0x10 = iVar1;
}
} else {
return 1;
}
if (getEvIntData(&bSpline->mTimer, "Timer") == 0) {
OS_REPORT("camera: event: error: NO Timer\n");
return 1;
}
bSpline->mRelActor = getEvActor("RelActor");
mEventData.field_0xf0.Init(bSpline->field_0x10, bSpline->mTimer);
field_0x158.field_0x0 = true;
}
if (bSpline->field_0x1c == 0 && mEventData.field_0xf0.Step()) {
cXyz tmpcenters = mEventData.field_0xf0.Calc(bSpline->mCenters);
cXyz tmpeyes = mEventData.field_0xf0.Calc(bSpline->mEyes);
if (bSpline->mRelActor != NULL) {
field_0x5c.mCenter = relationalPos(bSpline->mRelActor, &tmpcenters);
field_0x5c.mEye = relationalPos(bSpline->mRelActor, &tmpeyes);
} else {
field_0x5c.mCenter = tmpcenters;
field_0x5c.mEye = tmpeyes;
}
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
field_0x5c.mFovy = mEventData.field_0xf0.Calc(bSpline->mFovys);
if (mEventData.field_0xf0.Last()) {
bSpline->field_0x1c = 1;
}
}
return bSpline->field_0x1c;
}
/* 800956E4-80095E7C 090024 0798+00 0/0 1/0 0/0 .text twoActor0EvCamera__9dCamera_cFv */
bool dCamera_c::twoActor0EvCamera() {
static cXyz DefaultGap(0.0f, 0.0f, 0.0f);
struct mWork::twoActor0* twoact0_p = &mWork.twoActor0;
if (mCurCamStyleTimer == 0) {
twoact0_p->mActor1 = getEvActor("Actor1", "@PLAYER");
twoact0_p->mActor2 = getEvActor("Actor2", "@STARTER");
if (twoact0_p->mActor1 == NULL || twoact0_p->mActor2 == NULL) {
OS_REPORT("camera: event: error: actor 1 or 2 missing\n");
return 1;
}
twoact0_p->mActor1ID = fopAcM_GetID(twoact0_p->mActor1);
twoact0_p->mActor2ID = fopAcM_GetID(twoact0_p->mActor2);
getEvXyzData(&twoact0_p->mCtrGap, "CtrGap", DefaultGap);
getEvFloatData(&twoact0_p->mCtrRatio, "CtrRatio", -0.1f);
getEvFloatData(&twoact0_p->mCtrCus, "CtrCus", 1.0f);
getEvFloatData(&twoact0_p->mEyeCus, "EyeCus", 1.0f);
getEvFloatData(&twoact0_p->mRadiusMin, "RadiusMin", 100.0f);
getEvFloatData(&twoact0_p->mRadiusMax, "RadiusMax", 10000.0f);
getEvFloatData(&twoact0_p->mLatitudeMin, "LatitudeMin", -60.0f);
getEvFloatData(&twoact0_p->mLatitudeMax, "LatitudeMax", 60.0f);
getEvFloatData(&twoact0_p->mLongitudeMin, "LongitudeMin", 20.0f);
getEvFloatData(&twoact0_p->mLongitudeMax, "LongitudeMax", 160.0f);
getEvIntData(&twoact0_p->mLongitudeType, "LongitudeType", -1);
getEvFloatData(&twoact0_p->mFovy, "Fovy", 60.0f);
twoact0_p->field_0x4c = field_0x5c.mDirection.R();
twoact0_p->field_0x54 = cSAngle(field_0x5c.mDirection.V().Degree());
twoact0_p->field_0x56 = cSAngle(field_0x5c.mDirection.U().Degree());
}
cSGlobe cStack_d8(attentionPos(twoact0_p->mActor1) - attentionPos(twoact0_p->mActor2));
cXyz cStack_34;
if (fopAcM_SearchByID(twoact0_p->mActor1ID) == NULL) {
OS_REPORT("camera: event: error: actor1 dead\n");
return 1;
} else if (fopAcM_SearchByID(twoact0_p->mActor2ID) == NULL) {
OS_REPORT("camera: event: error: actor2 dead\n");
return 1;
} else if ( !(twoact0_p->mCtrRatio >= 0.0f) || !(twoact0_p->mCtrRatio <= 1.0f) ) {
cStack_34 = relationalPos(twoact0_p->mActor1, twoact0_p->mActor2, &twoact0_p->mCtrGap, 0.25f);
} else {
cStack_34 = (attentionPos(twoact0_p->mActor1) +
attentionPos(twoact0_p->mActor2)) * twoact0_p->mCtrRatio;
}
field_0x5c.mCenter += (cStack_34 - field_0x5c.mCenter) * twoact0_p->mCtrCus;
if (mCurCamStyleTimer == 0) {
cSAngle acStack_e0;
switch (twoact0_p->mLongitudeType) {
case 1:
acStack_e0 = cSAngle(directionOf(mpPlayerActor).Inv());
break;
case 2:
acStack_e0 = directionOf(mpPlayerActor);
break;
default:
acStack_e0 = field_0x5c.mDirection.U();
}
cSAngle acStack_e4 = cStack_d8.U() - acStack_e0;
if (acStack_e4.Abs() < cSAngle(twoact0_p->mLongitudeMin)) {
if (acStack_e4 < cSAngle::_0) {
twoact0_p->field_0x5a = cStack_d8.U() + cSAngle(twoact0_p->mLongitudeMin);
} else {
twoact0_p->field_0x5a = cStack_d8.U() - cSAngle(twoact0_p->mLongitudeMin);
}
} else if (acStack_e4.Abs() > cSAngle(twoact0_p->mLongitudeMax)) {
if (acStack_e4 < cSAngle::_0) {
twoact0_p->field_0x5a = cStack_d8.U() + cSAngle(twoact0_p->mLongitudeMax);
} else {
twoact0_p->field_0x5a = cStack_d8.U() - cSAngle(twoact0_p->mLongitudeMax);
}
} else {
twoact0_p->field_0x5a = acStack_e0;
}
cSAngle acStack_e8(field_0x5c.mDirection.V());
if (acStack_e8 < cSAngle(twoact0_p->mLatitudeMin)) {
twoact0_p->field_0x58 = cSAngle(twoact0_p->mLatitudeMin);
} else {
if (acStack_e8 > cSAngle(twoact0_p->mLatitudeMax)) {
twoact0_p->field_0x58 = cSAngle(twoact0_p->mLatitudeMax);
} else {
twoact0_p->field_0x58 = field_0x5c.mDirection.V();
}
}
f32 fVar1 = field_0x5c.mDirection.R();
if (fVar1 < twoact0_p->mRadiusMin) {
twoact0_p->field_0x50 = twoact0_p->mRadiusMin;
} else if (fVar1 > twoact0_p->mRadiusMax) {
twoact0_p->field_0x50 = twoact0_p->mRadiusMax;
} else {
twoact0_p->field_0x50 = field_0x5c.mDirection.R();
}
}
twoact0_p->field_0x56 += (twoact0_p->field_0x5a - twoact0_p->field_0x56) * twoact0_p->mEyeCus;
twoact0_p->field_0x54 += (twoact0_p->field_0x58 - twoact0_p->field_0x54) * twoact0_p->mEyeCus;
twoact0_p->field_0x4c += twoact0_p->mEyeCus * (twoact0_p->field_0x50 - twoact0_p->field_0x4c);
field_0x5c.mDirection.Val(twoact0_p->field_0x4c, twoact0_p->field_0x54, twoact0_p->field_0x56);
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += twoact0_p->mCtrCus * (twoact0_p->mFovy - field_0x5c.mFovy);
return 1;
}
/* 80095E7C-80095FD0 0907BC 0154+00 0/0 1/0 0/0 .text peepHoleEvCamera__9dCamera_cFv */
bool dCamera_c::peepHoleEvCamera() {
if (mCurCamStyleTimer == 0) {
fopAc_ac_c* mPlayer = dComIfGp_getLinkPlayer();
cXyz sp20 = positionOf(mPlayer);
cXyz sp2c(sp20);
mPlayer = dComIfGp_event_getPt2();
if (mPlayer == NULL) {
OS_REPORT("camera: event: error: partner actor not found\n");
} else {
cXyz sp38 = positionOf(mPlayer);
if (dCamMath().xyzHorizontalDistance(sp20, sp38) > 50.0f) {
sp38.y = sp20.y;
cXyz cStack_2c = sp20 - sp38;
cStack_2c .normalize();
sp2c = sp38 + (cStack_2c * 50.0f);
}
}
dComIfGp_getEventManager().setGoal(&sp2c);
}
return 1;
}
/* 80095FD0-800965AC 090910 05DC+00 0/0 1/0 0/0 .text digHoleEvCamera__9dCamera_cFv */
bool dCamera_c::digHoleEvCamera() {
struct mWork::digHole* digHole = &mWork.digHole;
if (mCurCamStyleTimer == 0) {
digHole->field_0x0 = 0;
getEvIntData(&digHole->mType, "Type", 3);
if (digHole->mType == 1) {
mEventData.field_0x20 = 0;
}
digHole->field_0x8 = 60;
digHole->field_0xc = 0.05f;
digHole->field_0x10 = 1;
if ((digHole->mType & 1) != 0) {
cSAngle acStack_158(field_0x5c.mDirection.U() - directionOf(mpPlayerActor));
if (acStack_158.Abs() < s16(cSAngle::_90)) {
cXyz sp70, sp7c;
cSGlobe cStack_138;
cXyz vec_f8(0.0f, -70.0f, -10.0f);
sp70 = relationalPos(mpPlayerActor, &vec_f8);
cStack_138.R(350.0f);
cStack_138.V(cSAngle(30.0f));
cStack_138.U(directionOf(mpPlayerActor).Inv()
+ cSAngle( (acStack_158 < cSAngle::_0) ? 10.0f : -10.0f ));
sp7c = sp70 + cStack_138.Xyz();
if (!lineBGCheck(&sp70, &sp7c, 0x4007)) {
field_0x5c.mFovy = 60.0f;
field_0x5c.mCenter = sp70;
field_0x5c.mDirection = cStack_138;
field_0x5c.mEye = sp7c;
} else {
digHole->field_0x10 = 0;
}
}
}
if ((digHole->mType & 2) != 0) {
cXyz vec_98(0.0f, 0.0f, 245.0f);
digHole->field_0x14 = relationalPos(mpPlayerActor, &vec_98);
cXyz sp64[3] = { cXyz(-85.0f, -10.0f, 300.0f), cXyz(50.0f, 165.0f, 160.0f), cXyz(-260.0f, -50.0f, 30.0f)};
int i;
int sp64_size = sizeof(sp64) / sizeof(cXyz);
fopAc_ac_c* unused_ptr = mpPlayerActor;
(void) unused_ptr;
fopAc_ac_c* mMidnaActor = (fopAc_ac_c*)daPy_py_c::getMidnaActor();
cXyz spa0;
for (i = 0; i < sp64_size; i++) {
spa0 = dCamMath::xyzRotateY(sp64[i], directionOf(mpPlayerActor));
digHole->field_0x20 = digHole->field_0x14 + spa0;
if (!lineBGCheck(&digHole->field_0x14, &digHole->field_0x20, 0x4007)
&& !lineCollisionCheck(digHole->field_0x14, digHole->field_0x20, mpPlayerActor, mMidnaActor, NULL)) {
break;
}
}
}
cXyz spac = attentionPos(mpPlayerActor);
if (dCamMath::xyzHorizontalDistance(field_0x5c.mCenter, spac) > 120.0f) {
digHole->field_0x10 = 0;
}
}
digHole->field_0x0++;
switch (digHole->mType) {
default:
case 1: {
if (digHole->field_0x10) {
f32 fVar2 = field_0x5c.mDirection.R();
f32 fVar3 = field_0x5c.mDirection.V().Degree();
field_0x5c.mDirection.R(fVar2 + (350.0f - fVar2) * digHole->field_0xc);
field_0x5c.mDirection.V(fVar3 + (40.0f - fVar3) * digHole->field_0xc);
field_0x5c.mFovy += (60.0f - field_0x5c.mFovy) * digHole->field_0xc;
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
} else if (!strcmp(dComIfGp_getStartStageName(), "R_SP01")) {
field_0x88 = 0;
}
if (digHole->field_0x0 >= digHole->field_0x8 && digHole->mType != 1) {
digHole->field_0x0 = 0;
digHole->mType = 2;
}
break;
}
case 2: {
if (digHole->field_0x0 == 1) {
field_0x5c.mCenter = digHole->field_0x14;
field_0x5c.mEye = digHole->field_0x20;
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
field_0x5c.mFovy = 60.0f;
}
}
}
return 1;
}
/* 800965AC-80096EDC 090EEC 0930+00 0/0 1/0 0/0 .text hintTalkEvCamera__9dCamera_cFv */
bool dCamera_c::hintTalkEvCamera() {
struct mWork::hintTalk* hintTalk = &mWork.hintTalk;
daAlink_c* link_p = (daAlink_c*)mpPlayerActor;
fopAc_ac_c* ride_actor_p;
int i, j;
if (mCurCamStyleTimer == 0) {
hintTalk->mTeacher = getEvActor("Teacher", "Midna");
hintTalk->mStudent = getEvActor("Student", "@PLAYER");
getEvFloatData(&hintTalk->mFovy, "Fovy", 55.0f);
getEvFloatData(&hintTalk->mRadius, "Radius", 280.0f);
getEvFloatData(&hintTalk->mCtrGapY, "CtrGapY", -25.0f);
getEvIntData(&hintTalk->mTimer, "Timer", 20);
}
if (hintTalk->mTeacher == NULL || hintTalk->mStudent == NULL) {
OS_REPORT("camera: event: error: actor 1 or 2 missing\n");
return 1;
}
if (mCurCamStyleTimer == 0) {
cXyz vec_190 = attentionPos(hintTalk->mTeacher);
cXyz vec_184 = attentionPos(hintTalk->mStudent);
ride_actor_p = NULL;
if (fopAcM_GetName(hintTalk->mTeacher) == 0xff) {
vec_190 = *link_p->getShadowTalkAtnPos();
}
if (hintTalk->mStudent == mpPlayerActor && mIsWolf == 1) {
cXyz vec_178 = positionOf(mpPlayerActor);
vec_178.y = vec_184.y;
vec_184 += cXyz(vec_178 - vec_184).norm() * 40.0f;
}
cXyz spe4;
hintTalk->field_0x40 = vec_190;
hintTalk->mDirection = field_0x5c.mDirection;
cXyz spf0 = vec_184 - vec_190;
hintTalk->field_0x28.Val(spf0);
if ((dComIfGp_getCameraAttentionStatus(0) & 0x800) != 0) {
hintTalk->field_0x28.V(cSAngle(15.0f));
}
spe4 = vec_190 + (spf0 * 0.8f);
spe4.y += hintTalk->mCtrGapY;
hintTalk->mDirection.R(hintTalk->mRadius);
f32 local_b0[10] = { 40.0f, 60.0f, 25.0f, 50.0f, 75.0f, 35.0f, 15.0f, 90.0f, 110.0f, 140.0f };
f32 fVar1;
if ((field_0xa8 & 16) != 0) {
fVar1 = local_b0[0];
local_b0[0] = local_b0[3];
local_b0[3] = fVar1;
}
if ((field_0xa8 & 4) != 0) {
fVar1 = local_b0[2];
local_b0[2] = local_b0[1];
local_b0[1] = fVar1;
}
if ((field_0xa8 & 2) != 0) {
fVar1 = local_b0[0];
local_b0[0] = local_b0[1];
local_b0[1] = fVar1;
}
bool bVar9 = false;
cSAngle acStack_1f8(hintTalk->field_0x28.U());
f32 fVar22;
if (link_p->checkRide() != 0) {
ride_actor_p = link_p->getRideActor();
acStack_1f8 = directionOf(mpPlayerActor);
if ((hintTalk->field_0x28.U() - acStack_1f8) < cSAngle::_0) {
fVar22 = -1.0f;
} else {
fVar22 = 1.0f;
}
} else if (hintTalk->field_0x28.U() - hintTalk->mDirection.U() > cSAngle::_0) {
fVar22 = -1.0f;
} else {
fVar22 = 1.0f;
}
cSAngle acStack_1fc(20.0f);
for (i = 0; i < 2; i++) {
for (j = 0; j < 12; j++) {
cSAngle acStack_200(local_b0[j] * fVar22);
hintTalk->mDirection.U(acStack_1f8 + acStack_200);
hintTalk->mDirection.V(((hintTalk->field_0x28.V() * acStack_200.Cos()) * 0.2f) + acStack_1fc);
hintTalk->field_0x8 = spe4 - ((spf0 * 0.2f) * acStack_200.Cos());
hintTalk->field_0x14 = hintTalk->field_0x8 + hintTalk->mDirection.Xyz();
if (!lineBGCheck(&vec_184, &hintTalk->field_0x14, 0x4007)
&& !lineBGCheck(&vec_190, &hintTalk->field_0x14, 0x4007)
&& !lineBGCheck(&hintTalk->field_0x8, &hintTalk->field_0x14, 0x4007)
&& !lineCollisionCheck(vec_184, hintTalk->field_0x14, hintTalk->mStudent, hintTalk->mTeacher, ride_actor_p)
&& !lineCollisionCheck(vec_190, hintTalk->field_0x14, hintTalk->mStudent, hintTalk->mTeacher, ride_actor_p)) {
bVar9 = true;
break;
}
if (j % 4 == 3) {
acStack_1fc += cSAngle((i != 0) ? -2.5f : 4.5f);
}
}
if (bVar9) {
break;
}
fVar22 = -fVar22;
hintTalk->mDirection.R(hintTalk->mDirection.R() * 0.75f);
}
}
if (!field_0x158.field_0x0) {
f32 div_val = f32(mCurCamStyleTimer + 1) / hintTalk->mTimer;
f32 fVar22 = dCamMath::rationalBezierRatio(div_val, 0.4f);
field_0x5c.mCenter += (hintTalk->field_0x8 - field_0x5c.mCenter) * fVar22;
field_0x5c.mDirection.R(field_0x5c.mDirection.R() + ((hintTalk->mDirection.R() - field_0x5c.mDirection.R()) * fVar22));
field_0x5c.mDirection.V(field_0x5c.mDirection.V() + ((hintTalk->mDirection.V() - field_0x5c.mDirection.V()) * fVar22));
field_0x5c.mDirection.U(field_0x5c.mDirection.U() + ((hintTalk->mDirection.U() - field_0x5c.mDirection.U()) * fVar22));
field_0x5c.mEye = field_0x5c.mCenter + field_0x5c.mDirection.Xyz();
field_0x5c.mFovy += fVar22 * (hintTalk->mFovy - field_0x5c.mFovy);
if (mCurCamStyleTimer == (hintTalk->mTimer - 1)) {
field_0x158.field_0x0 = true;
}
return 0;
}
return 1;
}
/* 80096EDC-80097694 09181C 07B8+00 0/0 1/0 0/0 .text bspTransEvCamera__9dCamera_cFv */
bool dCamera_c::bspTransEvCamera() {
struct mWork::bspTrans* bspTrans = &mWork.bspTrans;
f32 local_7c[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
if (mCurCamStyleTimer == 0) {
field_0x158.field_0x0 = true;
if (!getEvIntData(&bspTrans->mTimer, "Timer")) {
OS_REPORT("camera: event: error: BSPTRANS no Timer\n");
return 1;
}
int iVar1 = getEvFloatListData(&bspTrans->mBase, "Base");
if (iVar1 != 0) {
mEventData.field_0xf0.Init(iVar1, bspTrans->mTimer + 1);
} else {
OS_REPORT("camera: event: use 0.0 0.0 1.0 1.0\n");
mEventData.field_0xf0.Init(4, bspTrans->mTimer + 1);
bspTrans->mBase = local_7c;
}
mEventData.field_0xf0.Step();
bspTrans->mSet1 = 0;
char use1[8];
strcpy(use1, "xxxxxx");
iVar1 = getEvFloatListData(&bspTrans->mSet1, "Set1");
if (iVar1 != 0) {
bspTrans->mSplinePath1.Init(iVar1, bspTrans->mTimer + 1);
bspTrans->mSplinePath1.Step();
getEvStringData(use1, "Use1", "ooxxxx");
#ifdef DEBUG
if (strlen(use1) != 6) {
OSReport("camera: event: bad length -> xxxxxx\n");
strcpy(use1, "xxxxxx");
JUTAssertion::showAssert(JUTAssertion::getSDevice(), "d_ev_camera.cpp", 0x14f9, "0");
OSPanic("d_ev_camera.cpp", 0x14f9, "Halt");
}
#endif
}
bspTrans->mSet2 = 0;
char use2[8];
strcpy(use2, "xxxxxx");
iVar1 = getEvFloatListData(&bspTrans->mSet2, "Set2");
if (iVar1 != 0) {
bspTrans->mSplinePath2.Init(iVar1, bspTrans->mTimer + 1);
bspTrans->mSplinePath2.Step();
getEvStringData(use2, "Use2", "xxooox");
#ifdef DEBUG
if (strlen(use2) != 6) {
OSReport_Error("camera: event: bad length -> xxxxxx\n");
strcpy(use2, "xxxxxx");
JUTAssertion::showAssert(JUTAssertion::getSDevice(), "d_ev_camera.cpp", 0x1509, "0");
OSPanic("d_ev_camera.cpp", 0x1509, "Halt");
}
#endif
}
bspTrans->mRelActorID = -1;
bspTrans->mRelActor = getEvActor("RelActor");
if (bspTrans->mRelActor) {
getEvStringData(&bspTrans->mRelUseMask, "RelUseMask", "oo");
#ifdef DEBUG
if (strlen(&bspTrans->mRelUseMask) != 2) {
OSReport_Error("camera: event: bad length -> xx\n");
strcpy(&bspTrans->mRelUseMask, "xx");
JUTAssertion::showAssert(JUTAssertion::getSDevice(), "d_ev_camera.cpp", 0x1515, "0");
OSPanic("d_ev_camera.cpp", 0x1515, "Halt");
}
#endif
bspTrans->mRelActorID = fopAcM_GetID(bspTrans->mRelActor);
}
getEvXyzData(&bspTrans->field_0x94, "Center", mCenter);
getEvXyzData(&bspTrans->field_0xa0, "Eye", mEye);
getEvFloatData(&bspTrans->field_0xac, "Fovy", mFovy);
getEvFloatData(&bspTrans->mCushion, "Cushion", 1.0f);
for (int i = 0; i < 6; i++) {
bspTrans->field_0xc0[i] = isRelChar(use1[i]) ? isRelChar(use2[i]) ? 2 : 1 : 0;
}
bspTrans->field_0x78 = mCenter;
bspTrans->field_0x84 = mEye;
bspTrans->field_0x90 = mFovy;
}
if (bspTrans->mRelActor != NULL && fopAcM_SearchByID(bspTrans->mRelActorID) == NULL) {
OS_REPORT("camera: event: error: relational base actor dead\n");
return 1;
}
cXyz sp60, sp70;
if (mCurCamStyleTimer < bspTrans->mTimer) {
struct {
cXyz sp48;
cXyz sp3c;
} pos;
if (bspTrans->mRelActor != NULL) {
if (isRelChar(bspTrans->mRelUseMask)) {
pos.sp48 = relationalPos(bspTrans->mRelActor, &bspTrans->field_0x94);
} else {
pos.sp48 = bspTrans->field_0x94;
}
if (isRelChar(bspTrans->field_0xb9)) {
pos.sp3c = relationalPos(bspTrans->mRelActor, &bspTrans->field_0xa0);
} else {
pos.sp3c = bspTrans->field_0xa0;
}
} else {
pos.sp48 = bspTrans->field_0x94;
pos.sp3c = bspTrans->field_0xa0;
}
mEventData.field_0xf0.Step();
f32 vals_f4[3];
vals_f4[0] = mEventData.field_0xf0.Calc(bspTrans->mBase);
if (bspTrans->mSet1 != 0) {
bspTrans->mSplinePath1.Step();
vals_f4[1] = bspTrans->mSplinePath1.Calc(bspTrans->mSet1);
}
if (bspTrans->mSet2 != 0) {
bspTrans->mSplinePath2.Step();
vals_f4[2] = bspTrans->mSplinePath2.Calc(bspTrans->mSet2);
}
sp60.x = bspTrans->field_0x78.x + (pos.sp48.x - bspTrans->field_0x78.x) * vals_f4[bspTrans->field_0xc0[1]];
sp60.y = bspTrans->field_0x78.y + (pos.sp48.y - bspTrans->field_0x78.y) * vals_f4[bspTrans->field_0xc0[0]];
sp60.z = bspTrans->field_0x78.z + (pos.sp48.z - bspTrans->field_0x78.z) * vals_f4[bspTrans->field_0xc0[1]];
field_0x5c.mCenter += (sp60 - field_0x5c.mCenter) * bspTrans->mCushion;
cSGlobe cStack_130(bspTrans->field_0x84 - bspTrans->field_0x78);
cSGlobe cStack_138(pos.sp3c - pos.sp48);
cSGlobe cStack_140;
cStack_140.R(cStack_130.R() + ((cStack_138.R() - cStack_130.R()) * vals_f4[bspTrans->field_0xc0[2]]));
cStack_140.V(cStack_130.V() + ((cStack_138.V() - cStack_130.V()) * vals_f4[bspTrans->field_0xc0[3]]));
cStack_140.U(cStack_130.U() + ((cStack_138.U() - cStack_130.U()) * vals_f4[bspTrans->field_0xc0[4]]));
sp70 = field_0x5c.mCenter + cStack_140.Xyz();
field_0x5c.mEye += (sp70 - field_0x5c.mEye) * bspTrans->mCushion;
f32 add_val = (bspTrans->field_0x90 + (bspTrans->field_0xac - bspTrans->field_0x90) * vals_f4[bspTrans->field_0xc0[5]]);
field_0x5c.mFovy += bspTrans->mCushion * (add_val - field_0x5c.mFovy);
field_0x5c.mDirection.Val(field_0x5c.mEye - field_0x5c.mCenter);
return 0;
}
return 1;
}
/* 80097694-8009769C 091FD4 0008+00 0/0 1/0 0/0 .text portalWarpEvCamera__9dCamera_cFv */
bool dCamera_c::portalWarpEvCamera() {
return true;
}
/* 8009771C-80097738 09205C 001C+00 11/11 22/22 0/0 .text attentionPos__9dCamera_cFP10fopAc_ac_c */
cXyz dCamera_c::attentionPos(fopAc_ac_c* a_this) {
return a_this->attention_info.position;
}
/* 80097738-8009775C 092078 0024+00 10/10 10/10 0/0 .text directionOf__9dCamera_cFP10fopAc_ac_c */
cSAngle dCamera_c::directionOf(fopAc_ac_c* a_this) {
return a_this->shape_angle.y;
}
/* 8009775C-80097778 09209C 001C+00 9/9 20/20 0/0 .text positionOf__9dCamera_cFP10fopAc_ac_c */
cXyz dCamera_c::positionOf(fopAc_ac_c* a_this) {
return a_this->current.pos;
}
/* 8009778C-800977A8 0920CC 001C+00 1/1 2/2 0/0 .text eyePos__9dCamera_cFP10fopAc_ac_c */
cXyz dCamera_c::eyePos(fopAc_ac_c* a_this) {
return a_this->eyePos;
}