summaryrefslogtreecommitdiff
path: root/src/d/actor/d_a_obj_rgate.cpp
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2024-10-10 07:29:58 -0700
committerGitHub <noreply@github.com>2024-10-10 08:29:58 -0600
commit12eb254d769d84743b5cc6cd5424057c57eaf0ad (patch)
tree4509be332b2ccfc6fe939f47740d68f7746eca3e /src/d/actor/d_a_obj_rgate.cpp
parent2fd702c0ac170a789af879b8b92a82d4dcc9080c (diff)
switch to dtk setup (#2203)
* switch to dtk setup * some cleanup / fixes * cleanup d_a_alink literals * Restore doxygen, update CI & README.md (#1) * Fix build image ref (#2) --------- Co-authored-by: Luke Street <luke@street.dev>
Diffstat (limited to 'src/d/actor/d_a_obj_rgate.cpp')
-rw-r--r--src/d/actor/d_a_obj_rgate.cpp951
1 files changed, 951 insertions, 0 deletions
diff --git a/src/d/actor/d_a_obj_rgate.cpp b/src/d/actor/d_a_obj_rgate.cpp
new file mode 100644
index 0000000000..4ec283c84c
--- /dev/null
+++ b/src/d/actor/d_a_obj_rgate.cpp
@@ -0,0 +1,951 @@
+/**
+ * d_a_obj_rgate.cpp
+ * Bulblin Gate
+ */
+
+#include "d/actor/d_a_obj_rgate.h"
+#include "SSystem/SComponent/c_math.h"
+#include "d/d_bg_w.h"
+#include "d/d_com_inf_game.h"
+#include "d/actor/d_a_horse.h"
+#include "d/actor/d_a_obj_eff.h"
+
+#define GATE_L_JNT 1
+#define GATE_R_JNT 2
+
+enum {
+ ACT_WAIT_EVENT,
+ ACT_EVENT,
+ ACT_DEAD,
+};
+
+enum {
+ DEMO_ACT_WAIT,
+ DEMO_ACT_ADJUSTMENT,
+ DEMO_ACT_UNLOCK,
+ DEMO_ACT_OPEN,
+};
+
+enum {
+ AREA_CHECK_PLAYER = 1,
+ AREA_CHECK_COACH,
+ AREA_CHECK_HORSE,
+};
+
+/* 80CB9C98-80CB9CE8 000078 0050+00 3/3 0/0 0/0 .text search_coach__FPvPv */
+static void* search_coach(void* i_actor, void* i_data) {
+ if (i_actor != NULL && fopAcM_IsActor(i_actor) && fopAcM_GetProfName(i_actor) == PROC_NPC_COACH)
+ {
+ return i_actor;
+ }
+
+ return NULL;
+}
+
+/* 80CB9CE8-80CB9DF8 0000C8 0110+00 1/1 0/0 0/0 .text nodeCallBack__FP8J3DJointi */
+static int nodeCallBack(J3DJoint* i_joint, int param_1) {
+ if (param_1 == 0) {
+ int jnt_no = i_joint->getJntNo();
+ J3DModel* model_p = j3dSys.getModel();
+ daObjRgate_c* actor_p = (daObjRgate_c*)model_p->getUserArea();
+
+ if (jnt_no == GATE_L_JNT) {
+ MTXCopy(model_p->getAnmMtx(jnt_no), mDoMtx_stack_c::get());
+ mDoMtx_stack_c::YrotM(actor_p->mGateLAngle);
+ model_p->setAnmMtx(jnt_no, mDoMtx_stack_c::get());
+
+ MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
+ } else if (jnt_no == GATE_R_JNT) {
+ MTXCopy(model_p->getAnmMtx(jnt_no), mDoMtx_stack_c::get());
+ mDoMtx_stack_c::YrotM(actor_p->mGateRAngle);
+ model_p->setAnmMtx(jnt_no, mDoMtx_stack_c::get());
+
+ MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
+ }
+ }
+
+ return 1;
+}
+
+/* ############################################################################################## */
+/* 80CBC368-80CBC380 000000 0018+00 7/7 0/0 0/0 .rodata l_cull_box */
+static const Vec l_cull_box[2] = {
+ {-400.0f, 0.0f, -400.0f},
+ {400.0f, 450.0f, 400.0f},
+};
+
+/* 80CBC380-80CBC3C4 000018 0044+00 0/0 0/0 0/0 .rodata l_cyl_src */
+static const dCcD_SrcCyl l_cyl_src = {
+ {
+ {0x0, {{0x0, 0x0, 0x1e}, {0x20, 0x11}, 0x78}}, // mObj
+ {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
+ {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg
+ {0x0}, // mGObjCo
+ }, // mObjInf
+ {
+ {0.0f, 0.0f, 0.0f}, // mCenter
+ 40.0f, // mRadius
+ 350.0f // mHeight
+ } // mCyl
+};
+
+/* 80CB9DF8-80CB9F4C 0001D8 0154+00 1/1 0/0 0/0 .text initBaseMtx__12daObjRgate_cFv */
+void daObjRgate_c::initBaseMtx() {
+ mDoMtx_stack_c::transS(current.pos);
+ mDoMtx_stack_c::YrotM(current.angle.y);
+ MTXCopy(mDoMtx_stack_c::get(), field_0xb14);
+ mpGateModel->setBaseScale(scale);
+
+ if (getSwNo() != 0xFF) {
+ if (mpKeyModel != NULL) {
+ mpKeyModel->setBaseScale(scale);
+ }
+
+ if (mpHookModel != NULL) {
+ mpHookModel->setBaseScale(scale);
+ }
+ }
+
+ cXyz eff_pos_offset(0.0f, 128.0f, 38.0f);
+ mDoMtx_stack_c::YrotS(current.angle.y);
+ mDoMtx_stack_c::multVec(&eff_pos_offset, &eff_pos_offset);
+
+ mEffPos = current.pos;
+ mEffPos += eff_pos_offset;
+ mKeyRot.set(0, current.angle.y, 0);
+ setBaseMtx();
+}
+
+/* 80CB9F4C-80CBA468 00032C 051C+00 2/2 0/0 0/0 .text setBaseMtx__12daObjRgate_cFv */
+void daObjRgate_c::setBaseMtx() {
+ mDoMtx_stack_c::transS(current.pos);
+ mDoMtx_stack_c::YrotM(current.angle.y);
+ mpGateModel->setBaseTRMtx(mDoMtx_stack_c::get());
+
+ cXyz sp30(-350.0f, 0.0f, 0.0f);
+ cXyz sp3C(350.0f, 0.0f, 0.0f);
+
+ mDoMtx_stack_c::YrotS(current.angle.y);
+ mDoMtx_stack_c::multVec(&sp30, &sp30);
+ mDoMtx_stack_c::multVec(&sp3C, &sp3C);
+
+ mDoMtx_stack_c::transS(current.pos);
+ mDoMtx_stack_c::transM(sp30);
+ mDoMtx_stack_c::YrotM(current.angle.y);
+ mDoMtx_stack_c::YrotM(mGateLAngle);
+
+ MTXCopy(mDoMtx_stack_c::get(), field_0xc30);
+ MTXCopy(mDoMtx_stack_c::get(), mBgMtx);
+ field_0xbe8 = current.pos + sp30;
+
+ mDoMtx_stack_c::transS(current.pos);
+ mDoMtx_stack_c::transM(sp3C);
+ mDoMtx_stack_c::YrotM(current.angle.y);
+ mDoMtx_stack_c::YrotM(0x7FFF);
+ mDoMtx_stack_c::YrotM(mGateRAngle);
+
+ MTXCopy(mDoMtx_stack_c::get(), field_0xc00);
+ MTXCopy(mDoMtx_stack_c::get(), field_0xae4);
+ field_0xbf4 = sp3C;
+
+ if (getSwNo() != 0xFF) {
+ cXyz sp48(0.0f, 128.0f, 38.0f);
+ mDoMtx_stack_c::YrotS(current.angle.y);
+ mDoMtx_stack_c::transM(-350.0f, 0.0f, 0.0f);
+ mDoMtx_stack_c::YrotM(mGateLAngle);
+ mDoMtx_stack_c::transM(350.0f, 0.0f, 0.0f);
+ mDoMtx_stack_c::multVec(&sp48, &sp48);
+
+ cXyz sp54;
+ cXyz sp60;
+ sp60 = field_0xbc0;
+
+ mDoMtx_stack_c::YrotS(current.angle.y + mGateLAngle);
+ mDoMtx_stack_c::multVec(&sp60, &sp60);
+ sp54 = field_0xbb4;
+
+ s16 var_r29 = field_0xbb0 * cM_scos(mCounter * 3000);
+ cLib_addCalc(&field_0xbb0, 0.0f, 0.05f, 50.0f, 5.0f);
+
+ mDoMtx_stack_c::transS(current.pos);
+ mDoMtx_stack_c::transM(sp60);
+ mDoMtx_stack_c::transM(sp48);
+ mDoMtx_stack_c::YrotM(current.angle.y + mGateLAngle);
+ mDoMtx_stack_c::XrotM(-0xE38);
+ mDoMtx_stack_c::XrotM(-field_0xbaa);
+ mDoMtx_stack_c::transM(14.0f, 0.0f, 0.0f);
+ mDoMtx_stack_c::ZrotM(field_0xbae);
+ mDoMtx_stack_c::ZrotM(var_r29);
+ mDoMtx_stack_c::transM(-14.0f, 0.0f, 0.0f);
+ mpHookModel->setBaseTRMtx(mDoMtx_stack_c::get());
+
+ if (mpKeyModel != NULL) {
+ if (field_0xbae == 0) {
+ mDoMtx_stack_c::transS(current.pos);
+ mDoMtx_stack_c::transM(sp48);
+ mDoMtx_stack_c::YrotM(current.angle.y + mGateLAngle);
+ mDoMtx_stack_c::XrotM(-0xE38);
+ mDoMtx_stack_c::XrotM(-field_0xbaa);
+ mpKeyModel->setBaseTRMtx(mDoMtx_stack_c::get());
+ } else {
+ field_0xbe4 += -2.5f;
+ if (field_0xbe4 < -20.0f) {
+ field_0xbe4 = -20.0f;
+ }
+ mEffPos.y += field_0xbe4;
+
+ cXyz sp6C(current.pos.x, current.pos.y + 50.0f, current.pos.z);
+ if (fopAcM_gc_c::gndCheck(&sp6C) && fopAcM_gc_c::getGroundY() > mEffPos.y) {
+ mEffPos.y = fopAcM_gc_c::getGroundY() + 2.0f;
+
+ if (!mCreatedSmokeEff) {
+ daObjEff::Act_c::make_land_smoke(&mEffPos, 0.5f);
+ mCreatedSmokeEff = true;
+ }
+ }
+
+ cLib_addCalcAngleS(&mKeyRot.x, -0x4000, 5, 0xC00, 0x400);
+ mDoMtx_stack_c::transS(mEffPos);
+ mDoMtx_stack_c::ZXYrotM(mKeyRot);
+ mpKeyModel->setBaseTRMtx(mDoMtx_stack_c::get());
+ }
+ }
+ }
+}
+
+/* 80CBC4A0-80CBC4AC 000000 000C+00 1/1 0/0 0/0 .data cNullVec__6Z2Calc */
+static u8 cNullVec__6Z2Calc[12] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+/* 80CBC4AC-80CBC4C0 00000C 0004+10 0/0 0/0 0/0 .data @1787 */
+#pragma push
+#pragma force_active on
+static u32 lit_1787[1 + 4 /* padding */] = {
+ 0x02000201,
+ /* padding */
+ 0x40080000,
+ 0x00000000,
+ 0x3FE00000,
+ 0x00000000,
+};
+#pragma pop
+
+/* 80CBC4C0-80CBC4C4 -00001 0004+00 4/4 0/0 0/0 .data l_arcName */
+static char* l_arcName = "M_RGate00";
+
+/* 80CBA468-80CBA654 000848 01EC+00 1/0 0/0 0/0 .text Create__12daObjRgate_cFv */
+int daObjRgate_c::Create() {
+ static char* l_evName = "RIDER_GATE_OPEN00";
+
+ u8 sw_no = getSwNo();
+ if (sw_no != 0xFF && !fopAcM_isSwitch(this, sw_no) &&
+ !dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[68]))
+ {
+ eventInfo.setArchiveName(l_arcName);
+
+ mEventID = dComIfGp_getEventManager().getEventIdx(this, l_evName, 0xFF);
+ mMapToolID = getEventID();
+ setAction(ACT_WAIT_EVENT);
+ } else {
+ mEventID = -1;
+ mMapToolID = 0xFF;
+ setAction(ACT_DEAD);
+ }
+
+ attention_info.position.y += 150.0f;
+ eyePos.y += 150.0f;
+ attention_info.flags = 0x20;
+
+ initBaseMtx();
+ fopAcM_SetMtx(this, field_0xb14);
+ fopAcM_setCullSizeBox(this, l_cull_box[0].x, l_cull_box[0].y, l_cull_box[0].z, l_cull_box[1].x,
+ l_cull_box[1].y, l_cull_box[1].z);
+
+ if (dComIfG_Bgsp().Regist(mpBgW, this)) {
+#ifdef DEBUG
+ OSReport_Error("キコルの門:BG登録失敗しました\n");
+#endif
+ return 0;
+ } else {
+ for (u16 i = 0; i < mpGateModel->getModelData()->getJointNum(); i++) {
+ if ((int)i == 1 || (int)i == 2) {
+ J3DJoint* jnt = mpGateModel->getModelData()->getJointNodePointer(i);
+ JUT_ASSERT(448, jnt != 0);
+
+ jnt->setCallBack(nodeCallBack);
+ mpGateModel->setUserArea((u32)this);
+ }
+ }
+ }
+
+ return 1;
+}
+
+/* 80CBA654-80CBA828 000A34 01D4+00 1/0 0/0 0/0 .text CreateHeap__12daObjRgate_cFv */
+int daObjRgate_c::CreateHeap() {
+ J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 5);
+ JUT_ASSERT(472, modelData != 0);
+
+ mpGateModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
+ if (mpGateModel == NULL) {
+ return 0;
+ }
+
+ if (getSwNo() != 0xFF) {
+ modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 7);
+ JUT_ASSERT(485, modelData != 0);
+
+ J3DModelData* modelData2 = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 5);
+ JUT_ASSERT(495, modelData2 != 0);
+
+ mDoExt_setupShareTexture(modelData, modelData2);
+ mpKeyModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
+ if (mpKeyModel == NULL) {
+ return 0;
+ }
+
+ modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 6);
+ JUT_ASSERT(511, modelData != 0);
+
+ mDoExt_setupShareTexture(modelData, modelData2);
+ mpHookModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
+ if (mpHookModel == NULL) {
+ return 0;
+ }
+ }
+
+ mpBgW = new dBgW();
+ if (mpBgW == NULL ||
+ mpBgW->Set((cBgD_t*)dComIfG_getObjectRes(l_arcName, 10), cBgW::MOVE_BG_e, &field_0xae4))
+ {
+ mpBgW = NULL;
+ return 0;
+ }
+
+ return 1;
+}
+
+/* 80CBA828-80CBA8A8 000C08 0080+00 1/1 0/0 0/0 .text create1st__12daObjRgate_cFv */
+int daObjRgate_c::create1st() {
+ int phase_state = dComIfG_resLoad(&mPhase, l_arcName);
+ if (phase_state == cPhs_COMPLEATE_e) {
+ phase_state = MoveBGCreate(l_arcName, 10, NULL, 0x2180, NULL);
+
+ if (phase_state == cPhs_ERROR_e) {
+ return phase_state;
+ }
+ }
+
+ return phase_state;
+}
+
+/* 80CBA8A8-80CBAC38 000C88 0390+00 1/1 0/0 0/0 .text checkAreaL__12daObjRgate_cFPC4cXyzPC4cXyz */
+int daObjRgate_c::checkAreaL(cXyz const* unused1, cXyz const* unused2) {
+ daPy_py_c* player_p = daPy_getPlayerActorClass();
+ Mtx m;
+ cXyz pos;
+ cXyz offset;
+ cXyz bound_a;
+ cXyz bound_b;
+
+ bound_a.set(0.0f, 0.0f, -100.0f);
+ bound_b.set(400.0f, 0.0f, 300.0f);
+ offset.set(0.0f, 0.0f, 100.0f);
+
+ fopAc_ac_c* coach_p = fopAcM_Search(search_coach, this);
+ if (coach_p != NULL) {
+ mDoMtx_stack_c::transS(coach_p->current.pos);
+ mDoMtx_stack_c::YrotM(coach_p->shape_angle.y);
+ mDoMtx_stack_c::multVec(&offset, &offset);
+ pos = offset;
+
+ mDoMtx_inverse(field_0xc30, m);
+ mDoMtx_stack_c::copy(m);
+ mDoMtx_stack_c::multVec(&pos, &pos);
+
+ if (bound_a.x <= pos.x && pos.x <= bound_b.x && bound_a.z <= pos.z && pos.z <= bound_b.z) {
+ return AREA_CHECK_COACH;
+ }
+ }
+
+ if (daPy_getPlayerActorClass()->checkHorseRide()) {
+ offset.set(0.0f, 0.0f, 250.0f);
+
+ daHorse_c* horse_p = dComIfGp_getHorseActor();
+ if (horse_p != NULL) {
+ mDoMtx_stack_c::transS(horse_p->current.pos);
+ mDoMtx_stack_c::YrotM(horse_p->shape_angle.y);
+ mDoMtx_stack_c::multVec(&offset, &offset);
+ pos = offset;
+
+ mDoMtx_inverse(field_0xc30, m);
+ mDoMtx_stack_c::copy(m);
+ mDoMtx_stack_c::multVec(&pos, &pos);
+
+ if (bound_a.x <= pos.x && pos.x <= bound_b.x && bound_a.z <= pos.z &&
+ pos.z <= bound_b.z)
+ {
+ return AREA_CHECK_HORSE;
+ }
+ }
+ }
+
+ bound_a.set(0.0f, 0.0f, -100.0f);
+ bound_b.set(350.0f, 0.0f, 100.0f);
+ pos = player_p->current.pos;
+
+ if (daPy_py_c::i_checkNowWolf()) {
+ offset.set(0.0f, 0.0f, 90.0f);
+ } else {
+ offset.set(0.0f, 0.0f, 0.0f);
+ }
+
+ mDoMtx_stack_c::YrotS(player_p->shape_angle.y);
+ mDoMtx_stack_c::multVec(&offset, &offset);
+ pos += offset;
+
+ mDoMtx_inverse(field_0xc30, m);
+ mDoMtx_stack_c::copy(m);
+ mDoMtx_stack_c::multVec(&pos, &pos);
+
+ if (bound_a.x <= pos.x && pos.x <= bound_b.x && bound_a.z <= pos.z && pos.z <= bound_b.z) {
+ return AREA_CHECK_PLAYER;
+ }
+
+ return 0;
+}
+
+/* 80CBAC38-80CBAFC4 001018 038C+00 1/1 0/0 0/0 .text checkAreaR__12daObjRgate_cFPC4cXyzPC4cXyz */
+int daObjRgate_c::checkAreaR(cXyz const* unused1, cXyz const* unused2) {
+ daPy_py_c* player_p = daPy_getPlayerActorClass();
+ Mtx m;
+ Mtx m2;
+ cXyz pos;
+ cXyz offset;
+ cXyz bound_a;
+ cXyz bound_b;
+
+ bound_a.set(0.0f, 0.0f, -300.0f);
+ bound_b.set(400.0f, 0.0f, 100.0f);
+ offset.set(0.0f, 0.0f, 100.0f);
+
+ fopAc_ac_c* coach_p = fopAcM_Search(search_coach, this);
+ if (coach_p != NULL) {
+ mDoMtx_stack_c::transS(coach_p->current.pos);
+ mDoMtx_stack_c::YrotM(coach_p->shape_angle.y);
+ mDoMtx_stack_c::multVec(&offset, &offset);
+ pos = offset;
+
+ mDoMtx_inverse(field_0xc00, m);
+ mDoMtx_stack_c::copy(m);
+ mDoMtx_stack_c::multVec(&pos, &pos);
+
+ if (bound_a.x <= pos.x && pos.x <= bound_b.x && bound_a.z <= pos.z && pos.z <= bound_b.z) {
+ return AREA_CHECK_COACH;
+ }
+ }
+
+ if (daPy_getPlayerActorClass()->checkHorseRide()) {
+ offset.set(0.0f, 0.0f, 250.0f);
+
+ daHorse_c* horse_p = dComIfGp_getHorseActor();
+ if (horse_p != NULL) {
+ mDoMtx_stack_c::transS(horse_p->current.pos);
+ mDoMtx_stack_c::YrotM(horse_p->shape_angle.y);
+ mDoMtx_stack_c::multVec(&offset, &offset);
+ pos = offset;
+
+ mDoMtx_inverse(field_0xc00, m);
+ mDoMtx_stack_c::copy(m);
+ mDoMtx_stack_c::multVec(&pos, &pos);
+
+ if (bound_a.x <= pos.x && pos.x <= bound_b.x && bound_a.z <= pos.z &&
+ pos.z <= bound_b.z)
+ {
+ return AREA_CHECK_HORSE;
+ }
+ }
+ }
+
+ bound_a.set(0.0f, 0.0f, -100.0f);
+ bound_b.set(350.0f, 0.0f, 100.0f);
+ pos = player_p->current.pos;
+
+ cXyz player_offset;
+ if (daPy_py_c::i_checkNowWolf()) {
+ player_offset.set(0.0f, 0.0f, 90.0f);
+ } else {
+ player_offset.set(0.0f, 0.0f, 0.0f);
+ }
+
+ mDoMtx_stack_c::YrotS(player_p->shape_angle.y);
+ mDoMtx_stack_c::multVec(&player_offset, &player_offset);
+ pos += player_offset;
+
+ mDoMtx_inverse(field_0xc00, m2);
+ mDoMtx_stack_c::copy(m2);
+ mDoMtx_stack_c::multVec(&pos, &pos);
+
+ if (bound_a.x <= pos.x && pos.x <= bound_b.x && bound_a.z <= pos.z && pos.z <= bound_b.z) {
+ return AREA_CHECK_PLAYER;
+ }
+
+ return 0;
+}
+
+/* 80CBAFC4-80CBB0F0 0013A4 012C+00 1/1 0/0 0/0 .text checkOpen__12daObjRgate_cFv */
+BOOL daObjRgate_c::checkOpen() {
+ if (dComIfGs_getKeyNum() == 0) {
+ return false;
+ }
+
+ daPy_py_c* player_p = daPy_getPlayerActorClass();
+
+ if (abs((s16)(current.angle.y - player_p->current.angle.y)) < 0x5000) {
+ return false;
+ }
+
+ Mtx m;
+ mDoMtx_inverse(field_0xb14, m);
+
+ cXyz pos(player_p->current.pos);
+ mDoMtx_stack_c::copy(m);
+ mDoMtx_stack_c::multVec(&pos, &pos);
+
+ cXyz bound_a(-100.0f, 0.0f, 0.0f);
+ cXyz bound_b(100.0f, 0.0f, 100.0f);
+
+ if (bound_a.x <= pos.x && pos.x <= bound_b.x && bound_a.z <= pos.z && pos.z <= bound_b.z) {
+ return true;
+ }
+
+ return false;
+}
+
+/* 80CBB0F0-80CBB180 0014D0 0090+00 1/1 0/0 0/0 .text checkDirL__12daObjRgate_cFP10fopAc_ac_c */
+BOOL daObjRgate_c::checkDirL(fopAc_ac_c* i_actor) {
+ Mtx m;
+ mDoMtx_inverse(field_0xc30, m);
+
+ cXyz pos(i_actor->current.pos);
+ mDoMtx_stack_c::copy(m);
+ mDoMtx_stack_c::multVec(&pos, &pos);
+
+ if (pos.z > 0.0f) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+/* 80CBB180-80CBB210 001560 0090+00 1/1 0/0 0/0 .text checkDirR__12daObjRgate_cFP10fopAc_ac_c */
+BOOL daObjRgate_c::checkDirR(fopAc_ac_c* i_actor) {
+ Mtx m;
+ mDoMtx_inverse(field_0xc00, m);
+
+ cXyz pos(i_actor->current.pos);
+ mDoMtx_stack_c::copy(m);
+ mDoMtx_stack_c::multVec(&pos, &pos);
+
+ if (pos.z < 0.0f) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+/* 80CBB210-80CBB28C 0015F0 007C+00 1/1 0/0 0/0 .text setAtkSE__12daObjRgate_cFv */
+void daObjRgate_c::setAtkSE() {
+ fopAcM_seStart(this, Z2SE_OBJ_RIDER_GATE_ATK, 0);
+}
+
+/* 80CBB28C-80CBB308 00166C 007C+00 1/1 0/0 0/0 .text setCrkSE__12daObjRgate_cFv */
+void daObjRgate_c::setCrkSE() {
+ fopAcM_seStart(this, Z2SE_OBJ_RIDER_GATE_CRK, 0);
+}
+
+/* 80CBB308-80CBB370 0016E8 0068+00 1/1 0/0 0/0 .text action__12daObjRgate_cFv */
+void daObjRgate_c::action() {
+ if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[68])) {
+ mGateLAngle = 0x4000;
+ mGateRAngle = -0x4000;
+ } else {
+ action_typeA();
+ }
+}
+
+/* 80CBB370-80CBBA10 001750 06A0+00 1/1 0/0 0/0 .text action_typeA__12daObjRgate_cFv */
+void daObjRgate_c::action_typeA() {
+ u8 sw_no = getSwNo();
+ daPy_py_c* player_p = daPy_getPlayerActorClass();
+
+ if (fopAcM_isSwitch(this, sw_no) || sw_no == 0xFF) {
+ cXyz unused1;
+ cXyz unused2;
+
+ int chk_l = checkAreaL(&unused1, &unused2);
+ int chk_r = checkAreaR(&unused1, &unused2);
+ s16 prev_l_move = mGateLMove;
+ s16 prev_r_move = mGateRMove;
+
+ if (player_p->getSpeedF() != 0.0f) {
+ if (chk_l == AREA_CHECK_PLAYER) {
+ switch (checkDirL(player_p)) {
+ case FALSE:
+ mGateLMove = 500;
+ break;
+ case TRUE:
+ mGateLMove = -500;
+ break;
+ }
+
+ field_0xbb0 = 2000.0f;
+ }
+
+ if (chk_r == AREA_CHECK_PLAYER) {
+ switch (checkDirR(player_p)) {
+ case FALSE:
+ mGateRMove = -500;
+ break;
+ case TRUE:
+ mGateRMove = 500;
+ break;
+ }
+ }
+ }
+
+ daHorse_c* horse_p = dComIfGp_getHorseActor();
+ if (horse_p != NULL && horse_p->speedF != 0.0f) {
+ if (chk_l == AREA_CHECK_HORSE) {
+ switch (checkDirL(horse_p)) {
+ case FALSE:
+ mGateLMove = 800;
+ break;
+ case TRUE:
+ mGateLMove = -800;
+ break;
+ }
+
+ field_0xbb0 = 2500.0f;
+ }
+
+ if (chk_r == AREA_CHECK_HORSE) {
+ switch (checkDirR(horse_p)) {
+ case FALSE:
+ mGateRMove = -800;
+ break;
+ case TRUE:
+ mGateRMove = 800;
+ break;
+ }
+ }
+ }
+
+ fopAc_ac_c* coach_p = fopAcM_Search(search_coach, this);
+ if (coach_p != NULL && coach_p->speedF != 0.0f) {
+ if (chk_l == AREA_CHECK_COACH) {
+ switch (checkDirL(coach_p)) {
+ case FALSE:
+ mGateLMove = 900;
+ break;
+ case TRUE:
+ mGateLMove = -900;
+ break;
+ }
+
+ field_0xbb0 = 2500.0f;
+ }
+
+ if (chk_r == AREA_CHECK_COACH) {
+ switch (checkDirR(coach_p)) {
+ case FALSE:
+ mGateRMove = -900;
+ break;
+ case TRUE:
+ mGateRMove = 900;
+ break;
+ }
+ }
+ }
+
+ if (abs(abs(prev_l_move) - abs(mGateLMove)) > 400 ||
+ abs(abs(prev_r_move) - abs(mGateRMove)) > 400)
+ {
+ setCrkSE();
+ }
+
+ if (mGateLMove > 1500) {
+ mGateLMove = 1500;
+ }
+
+ if (mGateLMove < -1500) {
+ mGateLMove = -1500;
+ }
+
+ if (mGateRMove > 1500) {
+ mGateRMove = 1500;
+ }
+
+ if (mGateRMove < -1500) {
+ mGateRMove = -1500;
+ }
+
+ mGateLAngle += mGateLMove;
+ if (mGateLAngle > 0x4000) {
+ mGateLAngle = 0x4000;
+ mGateLMove *= -0.7f;
+ }
+
+ if (mGateLAngle < -0x4000) {
+ mGateLAngle = -0x4000;
+ mGateLMove *= -0.7f;
+ }
+
+ mGateRAngle += mGateRMove;
+ if (mGateRAngle > 0x4000) {
+ mGateRAngle = 0x4000;
+ mGateRMove *= -0.7f;
+ }
+
+ if (mGateRAngle < -0x4000) {
+ mGateRAngle = -0x4000;
+ mGateRMove *= -0.7f;
+ }
+
+ cLib_addCalcAngleS(&mGateLMove, 0, 10, 100, 10);
+ cLib_addCalcAngleS(&mGateRMove, 0, 10, 100, 10);
+ cLib_addCalcAngleS(&field_0xbae, 0x3000, 10, 0x400, 0x100);
+ cLib_chaseF(&field_0xbb4.x, -39.0f, 1.0f);
+ cLib_chaseF(&field_0xbc0.x, -25.0f, 1.0f);
+ cLib_addCalcAngleS(&field_0xbcc, 0x7FFF, 10, 0x400, 0x100);
+ } else {
+ cXyz unused1;
+ cXyz unused2;
+
+ int chk_l = checkAreaL(&unused1, &unused2);
+ int chk_r = checkAreaR(&unused1, &unused2);
+ if (chk_l != 0 || chk_r != 0) {
+ daPy_py_c* player_p = daPy_getPlayerActorClass();
+
+ if (daPy_py_c::i_checkNowWolf()) {
+ if (player_p->checkWolfAttackReverse() || player_p->checkFrontRollCrash()) {
+ field_0xb94 = 1200.0f;
+ field_0xb90 = 1200.0f;
+ field_0xbac = 0x800;
+ setAtkSE();
+ }
+ } else {
+ if (player_p->checkFrontRollCrash()) {
+ field_0xb94 = 600.0f;
+ field_0xb90 = 600.0f;
+ field_0xbac = 0x800;
+ setAtkSE();
+ }
+ }
+ }
+
+ mGateLAngle = field_0xb90 * cM_ssin(mCounter * 4000);
+ mGateRAngle = field_0xb94 * -cM_ssin(mCounter * 4000);
+ cLib_addCalc0(&field_0xb90, 0.1f, 20.0f);
+ cLib_addCalc0(&field_0xb94, 0.1f, 20.0f);
+
+ field_0xbac -= 0x160;
+ field_0xbaa += field_0xbac;
+ if (field_0xbaa >= 0) {
+ return;
+ }
+
+ field_0xbaa = 0;
+ field_0xbac = -field_0xbac * 0.7f;
+ }
+}
+
+/* 80CBBA10-80CBBAF4 001DF0 00E4+00 1/0 0/0 0/0 .text actionWaitEvent__12daObjRgate_cFv
+ */
+void daObjRgate_c::actionWaitEvent() {
+ if (eventInfo.i_checkCommandDoor()) {
+ setAction(ACT_EVENT);
+ dComIfGp_setItemKeyNumCount(-1);
+ fopAcM_onSwitch(this, getSwNo());
+ fopAcM_seStart(this, Z2SE_OBJ_RIDER_GATE_L_OP, 0);
+ } else if (checkOpen()) {
+ eventInfo.setEventId(mEventID);
+ eventInfo.setMapToolId(mMapToolID);
+ eventInfo.i_onCondition(dEvtCnd_CANDOOR_e);
+ }
+}
+
+/* 80CBBAF4-80CBBB5C 001ED4 0068+00 1/0 0/0 0/0 .text actionEvent__12daObjRgate_cFv */
+void daObjRgate_c::actionEvent() {
+ if (dComIfGp_evmng_endCheck(mEventID)) {
+ setAction(ACT_DEAD);
+ dComIfGp_event_reset();
+ } else {
+ demoProc();
+ }
+}
+
+/* 80CBBB5C-80CBBB60 001F3C 0004+00 1/0 0/0 0/0 .text actionDead__12daObjRgate_cFv */
+void daObjRgate_c::actionDead() {}
+
+/* 80CBBB60-80CBBC04 001F40 00A4+00 1/1 0/0 0/0 .text event_proc_call__12daObjRgate_cFv
+ */
+void daObjRgate_c::event_proc_call() {
+ typedef void (daObjRgate_c::*func)();
+ static func l_func[] = {&daObjRgate_c::actionWaitEvent, &daObjRgate_c::actionEvent,
+ &daObjRgate_c::actionDead};
+
+ (this->*l_func[mAction])();
+}
+
+/* 80CBBC04-80CBBD68 001FE4 0164+00 1/1 0/0 0/0 .text demoProc__12daObjRgate_cFv */
+void daObjRgate_c::demoProc() {
+ mStaffID = dComIfGp_evmng_getMyStaffId("K_GATE", NULL, 0);
+ int demo_action = getDemoAction();
+
+ if (dComIfGp_evmng_getIsAddvance(mStaffID)) {
+ switch (demo_action) {
+ case DEMO_ACT_WAIT:
+ int* timer_p = dComIfGp_evmng_getMyIntegerP(mStaffID, "Timer");
+ if (timer_p == NULL) {
+ mTimer = 1;
+ } else {
+ mTimer = *timer_p;
+ }
+ break;
+ case DEMO_ACT_OPEN:
+ mGateLMove = 1000;
+ mGateRMove = -1000;
+ break;
+ }
+ }
+
+ switch (demo_action) {
+ case DEMO_ACT_WAIT:
+ if (cLib_calcTimer(&mTimer) == 0) {
+ dComIfGp_evmng_cutEnd(mStaffID);
+ }
+ break;
+ case DEMO_ACT_OPEN:
+ dComIfGp_evmng_cutEnd(mStaffID);
+ break;
+ case DEMO_ACT_UNLOCK:
+ dComIfGp_evmng_cutEnd(mStaffID);
+ break;
+ case DEMO_ACT_ADJUSTMENT:
+ dComIfGp_evmng_cutEnd(mStaffID);
+ break;
+ default:
+ dComIfGp_evmng_cutEnd(mStaffID);
+ break;
+ }
+}
+
+/* 80CBBD68-80CBBDB0 002148 0048+00 1/1 0/0 0/0 .text getDemoAction__12daObjRgate_cFv */
+int daObjRgate_c::getDemoAction() {
+ static char* action_table[] = {"WAIT", "ADJUSTMENT", "UNLOCK", "OPEN"};
+
+ return dComIfGp_evmng_getMyActIdx(mStaffID, action_table, ARRAY_SIZE(action_table), 0, 0);
+}
+
+/* 80CBBDB0-80CBBE18 002190 0068+00 1/0 0/0 0/0 .text Execute__12daObjRgate_cFPPA3_A4_f
+ */
+int daObjRgate_c::Execute(Mtx** param_0) {
+ event_proc_call();
+ action();
+ mCounter++;
+
+ *param_0 = &mBgMtx;
+ setBaseMtx();
+ mpBgW->Move();
+ return 1;
+}
+
+/* 80CBBE18-80CBBF34 0021F8 011C+00 1/0 0/0 0/0 .text Draw__12daObjRgate_cFv */
+int daObjRgate_c::Draw() {
+ g_env_light.settingTevStruct(0x10, &current.pos, &tevStr);
+ g_env_light.setLightTevColorType_MAJI(mpGateModel, &tevStr);
+
+ dComIfGd_setListBG();
+ mDoExt_modelUpdateDL(mpGateModel);
+ dComIfGd_setList();
+
+ if (getSwNo() != 0xFF) {
+ g_env_light.settingTevStruct(0x10, &current.pos, &tevStr);
+
+ if (mpHookModel != NULL) {
+ g_env_light.setLightTevColorType_MAJI(mpHookModel, &tevStr);
+ mDoExt_modelUpdateDL(mpHookModel);
+ }
+
+ if (mpKeyModel != NULL) {
+ g_env_light.setLightTevColorType_MAJI(mpKeyModel, &tevStr);
+ mDoExt_modelUpdateDL(mpKeyModel);
+ }
+ }
+
+ return 1;
+}
+
+/* 80CBBF34-80CBBFA0 002314 006C+00 1/0 0/0 0/0 .text Delete__12daObjRgate_cFv */
+int daObjRgate_c::Delete() {
+ if (mpBgW != NULL && mpBgW->ChkUsed()) {
+ if (dComIfG_Bgsp().Release(mpBgW)) {
+#ifdef DEBUG
+ OSReport("Release Error\n");
+#endif
+ }
+ }
+
+ dComIfG_resDelete(&mPhase, l_arcName);
+ return 1;
+}
+
+/* 80CBBFA0-80CBC054 002380 00B4+00 1/0 0/0 0/0 .text daObjRgate_create1st__FP12daObjRgate_c */
+static int daObjRgate_create1st(daObjRgate_c* i_this) {
+ fopAcM_SetupActor(i_this, daObjRgate_c);
+ return i_this->create1st();
+}
+
+/* 80CBC290-80CBC2B0 002670 0020+00 1/0 0/0 0/0 .text daObjRgate_MoveBGDelete__FP12daObjRgate_c */
+static int daObjRgate_MoveBGDelete(daObjRgate_c* i_this) {
+ return i_this->MoveBGDelete();
+}
+
+/* 80CBC2B0-80CBC2D0 002690 0020+00 1/0 0/0 0/0 .text daObjRgate_MoveBGExecute__FP12daObjRgate_c
+ */
+static int daObjRgate_MoveBGExecute(daObjRgate_c* i_this) {
+ return i_this->MoveBGExecute();
+}
+
+/* 80CBC2D0-80CBC2FC 0026B0 002C+00 1/0 0/0 0/0 .text daObjRgate_MoveBGDraw__FP12daObjRgate_c */
+static int daObjRgate_MoveBGDraw(daObjRgate_c* i_this) {
+ return i_this->MoveBGDraw();
+}
+
+/* ############################################################################################## */
+/* 80CBC51C-80CBC53C -00001 0020+00 1/0 0/0 0/0 .data daObjRgate_METHODS */
+static actor_method_class daObjRgate_METHODS = {
+ (process_method_func)daObjRgate_create1st, (process_method_func)daObjRgate_MoveBGDelete,
+ (process_method_func)daObjRgate_MoveBGExecute, (process_method_func)NULL,
+ (process_method_func)daObjRgate_MoveBGDraw,
+};
+
+/* 80CBC53C-80CBC56C -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_RiderGate */
+extern actor_process_profile_definition g_profile_Obj_RiderGate = {
+ fpcLy_CURRENT_e,
+ 3,
+ fpcPi_CURRENT_e,
+ PROC_Obj_RiderGate,
+ &g_fpcLf_Method.mBase,
+ sizeof(daObjRgate_c),
+ 0,
+ 0,
+ &g_fopAc_Method.base,
+ 600,
+ &daObjRgate_METHODS,
+ 0x40100,
+ fopAc_ACTOR_e,
+ fopAc_CULLBOX_CUSTOM_e,
+}; \ No newline at end of file