mirror of
https://github.com/zeldaret/tp
synced 2026-05-23 06:54:28 -04:00
4164 lines
152 KiB
C++
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;
|
|
}
|