d_a_gy_ctrl

This commit is contained in:
Kelebek1
2025-08-28 02:08:38 +01:00
parent d9c2ffe619
commit c01eb698cd
4 changed files with 495 additions and 57 deletions
+1 -1
View File
@@ -1497,7 +1497,7 @@ config.libs = [
ActorRel(NonMatching, "d_a_door12"),
ActorRel(Matching, "d_a_fallrock"),
ActorRel(Matching, "d_a_ff"),
ActorRel(NonMatching, "d_a_gy_ctrl"),
ActorRel(Equivalent, "d_a_gy_ctrl"),
ActorRel(NonMatching, "d_a_himo3"),
ActorRel(NonMatching, "d_a_hmlif"),
ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_hys"),
+3 -1
View File
@@ -50,7 +50,9 @@ public:
bool _delete();
public:
/* 0x2AC */ u8 m2AC[0x2D4 - 0x2AC];
/* 0x2AC */ u8 m2AC[0x2B0 - 0x2AC];
/* 0x2B0 */ s32 m2B0;
/* 0x2B4 */ u8 m2B4[0x2D4 - 0x2B4];
/* 0x2D4 */ mDoExt_McaMorf* mpMorf;
/* 0x2D8 */ mDoExt_invisibleModel m2D8;
/* 0x2E0 */ dBgS_Acch mAcch;
+41 -18
View File
@@ -2,23 +2,26 @@
#define D_A_GY_CTRL_H
#include "f_op/f_op_actor.h"
#include "d/d_cc_d.h"
#include "d/d_bg_s_lin_chk.h"
class daGy_Ctrl_c : public fopAc_ac_c {
public:
enum Proc_e {
PROC_0_e,
PROC_1_e,
};
void getMode() {}
void isTargetPlayer() {}
void isTargetPlayerShip() {}
void searchNearActor(fopAc_ac_c*);
void* searchNearActor(fopAc_ac_c*);
void setTarget();
void setPathTargetPos();
void getWaterY(cXyz&);
void lineCheck(cXyz*, cXyz*);
void checkPath();
bool setPathTargetPos();
f32 getWaterY(cXyz&);
bool lineCheck(cXyz*, cXyz*);
bool checkPath();
void setPathPos();
void modeProc(Proc_e, int);
void modeSwWaitInit();
@@ -34,22 +37,42 @@ public:
bool _draw();
void createInitNoArer();
void createInit();
void getParam(unsigned long, unsigned char, unsigned char);
u8 getParam(unsigned long, unsigned char, unsigned char);
void getArg();
void checkGyCtrlExist();
bool checkGyCtrlExist();
cPhs_State _create();
bool _delete();
public:
/* Place member variables here */
};
class daGy_Ctrl_HIO_c {
public:
daGy_Ctrl_HIO_c();
public:
/* Place member variables here */
};
/* 0x290 */ cXyz m290[5];
/* 0x2CC */ cXyz m2CC[5];
/* 0x308 */ s16 m308[5];
/* 0x312 */ u8 m312[5];
/* 0x318 */ f32 m318;
/* 0x31C */ s32 m31C;
/* 0x320 */ s32 m320;
/* 0x324 */ int m324;
/* 0x328 */ u8 m328;
/* 0x329 */ u8 m329;
/* 0x32C */ f32 m32C;
/* 0x330 */ u8 m330;
/* 0x331 */ u8 m331;
/* 0x334 */ s32 m334;
/* 0x338 */ cXyz m338;
/* 0x344 */ u8 m344;
/* 0x348 */ f32 m348;
/* 0x34C */ s16 m34C;
/* 0x350 */ int m350;
/* 0x354 */ u8 m354[0x358 - 0x354];
/* 0x358 */ int m358;
/* 0x35C */ s32 m35C;
/* 0x360 */ fpc_ProcID m360[5];
/* 0x374 */ bool m374[5];
/* 0x37C */ dBgS_ObjLinChk mLinChk;
/* 0x3E8 */ u8 m3E8;
/* 0x3EC */ cXyz m3EC[16];
/* 0x4AC */ bool m4AC;
/* 0x4B0 */ int m4B0;
}; // size = 0x4B4
#endif /* D_A_GY_CTRL_H */
+450 -37
View File
@@ -5,147 +5,560 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_gy_ctrl.h"
#include "d/actor/d_a_ship.h"
#include "d/actor/d_a_gy.h"
#include "d/d_procname.h"
#include "d/d_priority.h"
#include "d/d_s_play.h"
#include "d/d_com_inf_game.h"
#include "d/d_bg_s_func.h"
#include "d/d_camera.h"
#include "f_op/f_op_actor_mng.h"
#include "m_Do/m_Do_hostIO.h"
class daGy_Ctrl_HIO_c : public mDoHIO_entry_c {
public:
daGy_Ctrl_HIO_c();
virtual ~daGy_Ctrl_HIO_c();
void genMessage(JORMContext*);
public:
/* 0x04 */ u8 m04;
/* 0x05 */ u8 m05;
/* 0x06 */ s16 m06;
/* 0x08 */ s16 m08;
/* 0x0A */ s16 m0A;
/* 0x0C */ s16 m0C;
/* 0x10 */ f32 m10;
/* 0x14 */ u8 m14[0x4];
/* 0x18 */ f32 m18;
/* 0x1C */ f32 m1C;
/* 0x20 */ f32 m20;
/* 0x24 */ f32 m24;
/* 0x28 */ f32 m28;
/* 0x2C */ f32 m2C;
}; // size = 0x30
static daGy_Ctrl_HIO_c l_HIO;
/* 000000EC-00000170 .text __ct__15daGy_Ctrl_HIO_cFv */
daGy_Ctrl_HIO_c::daGy_Ctrl_HIO_c() {
/* Nonmatching */
m04 = 0;
m10 = 10.0f;
m06 = 100;
m08 = 240;
m05 = 0;
m2C = 10.0f;
m20 = 10000.0f;
m24 = DEMO_SELECT(1000.0f, 500.0f);
m28 = DEMO_SELECT(-100.0f, -500.0f);
m1C = 700.0f;
m0A = 200;
m18 = 1000.0f;
m0C = 250;
}
/* 000001B8-000001E4 .text searchNearActor_CB__FPvPv */
void searchNearActor_CB(void*, void*) {
/* Nonmatching */
void* searchNearActor_CB(void* arg0, void* arg1) {
return ((daGy_Ctrl_c*)arg1)->searchNearActor((fopAc_ac_c*)arg0);
}
/* 000001E4-0000029C .text searchNearActor__11daGy_Ctrl_cFP10fopAc_ac_c */
void daGy_Ctrl_c::searchNearActor(fopAc_ac_c*) {
/* Nonmatching */
void* daGy_Ctrl_c::searchNearActor(fopAc_ac_c* arg1) {
if (fopAc_IsActor(arg1)) {
f32 dVar3 = fopAcM_searchActorDistanceXZ(this, arg1);
if (m328 == 0 && fpcM_GetName(arg1) == PROC_GY_CTRLB && dVar3 < 6000.0f) {
return arg1;
}
if (fpcM_GetName(arg1) == PROC_DAIOCTA || fpcM_GetName(arg1) == PROC_OBJ_IKADA || fpcM_GetName(arg1) == PROC_NPC_SO) {
if (dVar3 < 6000.0f) {
return arg1;
}
}
}
return NULL;
}
/* 0000029C-00000450 .text setTarget__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::setTarget() {
/* Nonmatching */
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) || dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK1000000_e)) {
if (m3E8 != 0) {
if (cLib_calcTimer(&m358) == 0) {
m358 = 0x1e;
}
m35C = 2;
}
m320 = 1;
} else {
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SWIM_e)) {
if (cLib_calcTimer(&m358) == 0) {
m358 = 0x1e;
}
m35C = 1;
m320 = 0;
} else {
m320 = 0;
m358 = 0x1e;
m35C = 0;
}
}
if (m3E8 == 0 || m344 == 0) {
m35C = 0;
}
#if VERSION > VERSION_DEMO
m4AC = true;
for (s32 i = 0; i < m329; i++) {
daGy_c* pfVar2 = (daGy_c*)fopAcM_SearchByID(m360[i]);
if ((pfVar2 != NULL) && (pfVar2 != NULL) && (pfVar2->m2B0 != 0)) {
m4AC = false;
}
}
if (m4AC) {
m35C = 0;
}
#endif
switch (m35C) {
case 1:
dCam_getBody()->SetTypeForce("WaterBattle", NULL);
break;
case 2:
dCam_getBody()->SetTypeForce("BoatBattle", NULL);
break;
}
}
/* 00000450-00000638 .text setPathTargetPos__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::setPathTargetPos() {
/* Nonmatching */
bool daGy_Ctrl_c::setPathTargetPos() {
cXyz sp24;
switch (m320) {
case 0:
sp24 = dComIfGp_getPlayer(0)->current.pos;
m318 = l_HIO.m1C;
m34C += l_HIO.m0A;
break;
case 1:
if (dComIfGp_getShipActor() != NULL) {
sp24 = dComIfGp_getShipActor()->current.pos;
m318 = l_HIO.m18;
m34C += l_HIO.m0C;
}
break;
}
sp24.y = getWaterY(sp24);
if (m328 == 0) {
current.pos = sp24;
return true;
}
if ((m338 - sp24).absXZ() < m32C) {
current.pos = sp24;
return true;
}
return false;
}
/* 00000674-000006AC .text getWaterY__11daGy_Ctrl_cFR4cXyz */
void daGy_Ctrl_c::getWaterY(cXyz&) {
/* Nonmatching */
f32 daGy_Ctrl_c::getWaterY(cXyz& arg1) {
arg1.y += 1000.0f;
dBgS_GetWaterHeight(arg1);
}
/* 000006AC-0000072C .text lineCheck__11daGy_Ctrl_cFP4cXyzP4cXyz */
void daGy_Ctrl_c::lineCheck(cXyz*, cXyz*) {
/* Nonmatching */
bool daGy_Ctrl_c::lineCheck(cXyz* arg1, cXyz* arg2) {
mLinChk.Set(arg1, arg2, this);
if (dComIfG_Bgsp()->LineCross(&mLinChk)) {
*arg2 = mLinChk.mLin.GetEnd();
return true;
}
return false;
}
/* 0000072C-00000878 .text checkPath__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::checkPath() {
/* Nonmatching */
bool daGy_Ctrl_c::checkPath() {
if (dComIfGp_event_runCheck()) {
return false;
}
for (s32 i = 0; i < ARRAY_SSIZE(m3EC); i++) {
s16 tmp = 0xFFF;
s16 tmp2 = tmp * i;
#if VERSION == VERSION_DEMO
cXyz sp14(m348, 0.0f, l_HIO.m28);
#else
cXyz sp14(m348, 0.0f, 0.0f);
#endif
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::YrotM(tmp2);
mDoMtx_stack_c::transM(sp14.x, sp14.y, sp14.z);
m3EC[i].x = mDoMtx_stack_c::get()[0][3];
m3EC[i].y = mDoMtx_stack_c::get()[1][3];
m3EC[i].z = mDoMtx_stack_c::get()[2][3];
#if VERSION == VERSION_DEMO
m3EC[i].y = getWaterY(m3EC[i]);
#endif
cXyz sp08 = m3EC[i];
sp08.y += l_HIO.m24;
#if VERSION > VERSION_DEMO
m3EC[i].y += l_HIO.m28;
#endif
if (lineCheck(&sp08, &m3EC[i])) {
return false;
}
}
return true;
}
/* 00000878-00000AC8 .text setPathPos__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::setPathPos() {
/* Nonmatching */
for (s32 i = 0; i < m329; i++) {
s16 tmp2 = (s16)(0xffff / m329);
s16 tmp3 = tmp2 * i;
m308[i] = m34C + tmp3;
s16 uVar1 = m308[i];
s16 uVar2 = uVar1 + 0x500;
#if VERSION == VERSION_DEMO
f32 tmp = l_HIO.m10 * cM_ssin(uVar1);
tmp = m348 + tmp;
#else
f32 tmp = m348 + l_HIO.m10 * cM_ssin(uVar1);
#endif
cXyz sp14;
sp14.set(tmp, 0.0f, 0.0f);
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::YrotM(uVar1);
mDoMtx_stack_c::transM(sp14.x, sp14.y, sp14.z);
m290[i].x = mDoMtx_stack_c::get()[0][3];
m290[i].y = mDoMtx_stack_c::get()[1][3];
m290[i].z = mDoMtx_stack_c::get()[2][3];
m290[i].y = getWaterY(m290[i]);
sp14.set(tmp, 0.0f, l_HIO.m28);
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::YrotM(uVar2);
mDoMtx_stack_c::transM(sp14.x, sp14.y, sp14.z);
m2CC[i].x = mDoMtx_stack_c::get()[0][3];
m2CC[i].y = mDoMtx_stack_c::get()[1][3];
m2CC[i].z = mDoMtx_stack_c::get()[2][3];
cXyz sp08 = m2CC[i];
sp08.y += l_HIO.m24;
m2CC[i].y = getWaterY(m2CC[i]);
if (lineCheck(&sp08, &m2CC[i])) {
m312[i] = 0;
} else {
m312[i] = 1;
}
}
cLib_addCalc2(&m348, m318, 0.1f, l_HIO.m2C);
}
/* 00000AC8-00000C14 .text modeProc__11daGy_Ctrl_cFQ211daGy_Ctrl_c6Proc_ei */
void daGy_Ctrl_c::modeProc(daGy_Ctrl_c::Proc_e, int) {
/* Nonmatching */
void daGy_Ctrl_c::modeProc(daGy_Ctrl_c::Proc_e arg1, int arg2) {
typedef void (daGy_Ctrl_c::*ModeFunc)();
struct ModeData {
/* 0x00 */ ModeFunc init;
/* 0x0C */ ModeFunc exec;
/* 0x18 */ char* name;
}; // size = 0x1C
static ModeData mode_tbl[] = {
{
&daGy_Ctrl_c::modeSwWaitInit,
&daGy_Ctrl_c::modeSwWait,
"SW_WAIT",
},
{
&daGy_Ctrl_c::modeCreateInit,
&daGy_Ctrl_c::modeCreate,
"CREATE",
},
{
&daGy_Ctrl_c::modeWaitInit,
&daGy_Ctrl_c::modeWait,
"WAIT",
},
{
&daGy_Ctrl_c::modeHideInit,
&daGy_Ctrl_c::modeHide,
"HIDE",
},
};
if (arg1 == 0) {
m324 = arg2;
(this->*mode_tbl[m324].init)();
} else if (arg1 == 1) {
(this->*mode_tbl[m324].exec)();
}
}
/* 00000C14-00000C18 .text modeSwWaitInit__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::modeSwWaitInit() {
/* Nonmatching */
}
/* 00000C18-00000C8C .text modeSwWait__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::modeSwWait() {
/* Nonmatching */
s32 sw;
if (m328 == 1) {
sw = fopAcM_GetRoomNo(this);
} else if (m328 == 0) {
sw = m334;
}
if (dComIfGs_isSwitch(m330, sw)) {
modeProc(PROC_0_e, 1);
}
}
/* 00000C8C-00000CA0 .text modeCreateInit__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::modeCreateInit() {
/* Nonmatching */
m350 = l_HIO.m06;
}
/* 00000CA0-00000E50 .text modeCreate__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::modeCreate() {
/* Nonmatching */
if (m328 == 1 && m344 == 0) {
modeProc(PROC_0_e, 3);
} else if (m3E8 == 0) {
modeProc(PROC_0_e, 3);
} else if (fopAcM_Search(searchNearActor_CB, this) != NULL) {
modeProc(PROC_0_e, 3);
} else {
if (m31C < m329 && cLib_calcTimer(&m350) == 0) {
cXyz sp18 = m290[m31C];
csXyz sp10(0, 0, 0);
sp10.y = m308[m31C];
sp18.y = -1000.0f;
m360[m31C] = fopAcM_createChild(PROC_GY, fopAcM_GetID(this), 0xffffffff, &sp18, tevStr.mRoomNo, &sp10);
m374[m31C] = true;
m350 = l_HIO.m08;
}
if (m31C == m329) {
modeProc(PROC_0_e, 2);
}
setPathPos();
}
}
/* 00000E50-00000E54 .text modeWaitInit__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::modeWaitInit() {
/* Nonmatching */
static const GXColor color_ok = {0x00, 0xFF, 0x00, 0x80};
static const GXColor color_ng = {0xFF, 0x00, 0x00, 0x80};
}
/* 00000E54-00000F00 .text modeWait__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::modeWait() {
/* Nonmatching */
if (m328 == 1 && m344 == 0) {
modeProc(PROC_0_e, 3);
} else if (m3E8 == 0) {
modeProc(PROC_0_e, 3);
} else if (fopAcM_Search(searchNearActor_CB, this) != NULL) {
modeProc(PROC_0_e, 3);
} else {
deadCheckGy();
setPathPos();
}
}
/* 00000F00-00000F18 .text modeHideInit__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::modeHideInit() {
/* Nonmatching */
#if VERSION > VERSION_DEMO
m4B0 = REG8_S(8) + 30;
#endif
}
/* 00000F18-00000FFC .text modeHide__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::modeHide() {
/* Nonmatching */
#if VERSION == VERSION_DEMO
if (m328 == 1) {
if (m344 == 1 && m3E8 == 1) {
modeProc(PROC_0_e, 1);
}
} else if (m328 == 0 && m3E8 == 1) {
modeProc(PROC_0_e, 1);
}
#else
bool bVar1 = false;
if (m328 == 1) {
if (m344 == 1 && m3E8 == 1) {
bVar1 = true;
}
} else if (m328 == 0 && m3E8 == 1) {
bVar1 = true;
}
if (cLib_calcTimer(&m4B0) == 0) {
if (fopAcM_Search(searchNearActor_CB, this) != NULL) {
bVar1 = false;
m4B0 = REG8_S(9) + 30;
}
} else {
bVar1 = false;
}
if (bVar1 && m3E8 == 1) {
modeProc(PROC_0_e, 1);
}
#endif
}
/* 00000FFC-0000109C .text deadCheckGy__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::deadCheckGy() {
/* Nonmatching */
s32 uVar3 = 0;
for (s32 i = 0; i < m329; i++) {
if (m374[i] == 1 && fopAcM_SearchByID(m360[i]) == NULL) {
uVar3++;
}
}
if (uVar3 == m329) {
fopAcM_delete(this);
}
}
/* 0000109C-00001100 .text _execute__11daGy_Ctrl_cFv */
bool daGy_Ctrl_c::_execute() {
/* Nonmatching */
setTarget();
m344 = setPathTargetPos();
m3E8 = checkPath();
modeProc(PROC_1_e, 4);
#if VERSION > VERSION_DEMO
m334 = fopAcM_GetRoomNo(this);
#endif
return false;
}
/* 00001100-00001210 .text _draw__11daGy_Ctrl_cFv */
bool daGy_Ctrl_c::_draw() {
/* Nonmatching */
if (l_HIO.m04 != 0) {
cXyz sp2C = current.pos;
sp2C.y = sp2C.y + 100.0f;
for (s32 i = 0; i < m329; i++) {
cXyz sp20 = m290[i];
sp20.y += 500.0f;
}
for (s32 i = 0; i < ARRAY_SSIZE(m3EC); i++) {
cXyz sp14 = m3EC[i];
sp14.y += l_HIO.m24;
}
if (m328 == 1) {
cXyz sp08 = m338;
sp08.y = current.pos.y + 100.0f;
}
}
return true;
}
/* 00001210-00001250 .text createInitNoArer__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::createInitNoArer() {
/* Nonmatching */
fopAcM_setStageLayer(this);
m331 = 1;
m334 = fopAcM_GetRoomNo(this);
}
/* 00001250-000012D4 .text createInit__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::createInit() {
/* Nonmatching */
if (m330 != 0xff) {
modeProc(PROC_0_e, 0);
} else {
modeProc(PROC_0_e, 1);
}
m320 = 0;
m338 = current.pos;
if (m328 == 0) {
createInitNoArer();
}
}
/* 000012D4-000012F8 .text getParam__11daGy_Ctrl_cFUlUcUc */
void daGy_Ctrl_c::getParam(unsigned long, unsigned char, unsigned char) {
/* Nonmatching */
u8 daGy_Ctrl_c::getParam(unsigned long arg1, unsigned char arg2, unsigned char arg3) {
return ((1 << arg3) - 1) & (arg1 >> arg2);
}
/* 000012F8-000013F8 .text getArg__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::getArg() {
/* Nonmatching */
u32 uVar3 = fopAcM_GetParam(this);
m328 = getParam(uVar3, 0, 4);
m329 = getParam(uVar3, 4, 4);
u8 uVar1 = getParam(uVar3, 8, 8);
m330 = getParam(uVar3, 0x18, 8);
if (m328 == 0xf) {
m328 = 0;
}
if (m329 == 0xf) {
m329 = 1;
}
if (uVar1 == 0xff) {
m32C = 10000.0f;
} else {
m32C = uVar1 * 1000.0f;
}
}
/* 000013F8-00001458 .text checkGyCtrlExist__11daGy_Ctrl_cFv */
void daGy_Ctrl_c::checkGyCtrlExist() {
/* Nonmatching */
bool daGy_Ctrl_c::checkGyCtrlExist() {
s32 local_8 = PROC_GY_CTRL;
daGy_Ctrl_c* pfVar1 = (daGy_Ctrl_c*)fopAcM_SearchByName(local_8);
if ((pfVar1 != NULL) && (pfVar1->m328 == 0) && (pfVar1->m331 == 1)) {
return true;
}
return false;
}
/* 00001458-000016AC .text _create__11daGy_Ctrl_cFv */
cPhs_State daGy_Ctrl_c::_create() {
/* Nonmatching */
fopAcM_SetupActor(this, daGy_Ctrl_c);
getArg();
if (m328 == 0 && checkGyCtrlExist()) {
return cPhs_ERROR_e;
}
if (!dComIfGs_checkGetItem(dItem_BOOMERANG_e)) {
return cPhs_ERROR_e;
}
createInit();
return cPhs_COMPLEATE_e;
}
/* 00001C3C-00001C44 .text _delete__11daGy_Ctrl_cFv */
bool daGy_Ctrl_c::_delete() {
/* Nonmatching */
return true;
}
/* 00001C44-00001C64 .text daGy_CtrlCreate__FPv */