d_a_tag_* TUs mostly matching for debug (#3054)

* d_a_tag_event debug almost matching

* d_a_tag_msg debug almost matching

* d_a_tag_attention almost matching

* d_a_tag_chkpoint debug almost matching (weak func order)

* d_a_tag_evt debug almost matching (extra weak fns)

* d_a_tag_evtarea debug almost matching (weak func order)

* d_a_tag_evtmsg debug almost matching (weak func order)

* d_a_tag_mist debug almost matching (weak func order)

* d_a_tag_howl debug almost matching (weak func order)

* d_a_tag_lantern debug almost matching (weak func order)

* d_a_tag_push debug almost matching (weak func order)

* d_a_tag_telop debug almost matching (weak func order)

* d_a_tag_CstaSw debug almost matching (weak func order)

* d_a_tag_ajnot debug almost matching (weak func order)

* d_a_tag_attack_item debug almost matching (weak func order)

* d_a_tag_gstart debug almost matching (weak func order)

* d_a_tag_hinit debug almost matching (debug weak func order)

* d_a_tag_hjump debug almost matching (weak func order)

* d_a_tag_hstop debug almost matching (weak func order)

* d_a_tag_lv2prchk debug almost matching (weak func order)

* d_a_tag_magne debug almost matching (weak func order)

* d_a_tag_mhint debug almost matching (weak func order)

* d_a_tag_mstop debug almost matching (weak func order)

* d_a_tag_spring debug almost matching (weak func order)

* d_a_tag_statue_evt debug almost matching (weak func order)

* d_a_tag_arena debug almost matching (weak func order)

* d_a_tag_Lv6Gate debug almost matching (weak func order)

* d_a_tag_Lv7Gate debug almost matching (weak func order)

* d_a_tag_Lv8Gate debug almost matching (.data + weak func order)

* d_a_tag_TWgate debug almost matching (weak func order)

* d_a_tag_lv6CstaSw debug almost matching (weak func order)

* d_a_tag_assistance debug almost matching (weak func order)

* d_a_tag_bottle_item debug almost matching (weak func order)

* d_a_tag_chgrestart debug almost matching (weak func order)

* d_a_tag_csw debug almost matching (weak func order)

* d_a_tag_escape debug almost matching (weak func order)

* d_a_tag_firewall debug almost matching (weak func order)

* d_a_tag_gra debug almost matching (weak func order)

* d_a_tag_guard debug almost matching (weak func order)

* d_a_tag_instruction debug almost matching (weak func order)

* d_a_tag_kago_fall debug almost matching (weak func order)

* d_a_tag_lightball debug almost matching (weak func order)

* d_a_tag_lv5soup debug almost matching (weak func order)

* d_a_tag_mmsg debug almost matching (weak func order)

* d_a_tag_mwait debug almost matching (weak func order)

* d_a_tag_myna2 debug almost matching (weak func order)

* d_a_tag_myna_light debug almost matching (weak func order)

* d_a_tag_pachi debug almost matching (weak func order)

* d_a_tag_poFire debug almost matching (weak func order)

* d_a_tag_qs debug almost matching (small mismatch in search)

* d_a_tag_ret_room debug almost matching (weak func order)

* d_a_tag_river_back debug almost matching (weak func order)

* d_a_tag_rmbit_sw debug almost matching (weak func order)

* d_a_tag_schedule debug almost matching (weak func order)

* d_a_tag_setBall debug almost matching (weak func order)

* d_a_tag_setrestart debug almost matching (weak func order)

* d_a_tag_shop_item debug almost matching (weak func order)

* d_a_tag_smk_emt debug almost matching (weak func order)

* d_a_tag_spinner debug almost matching (weak func order)

* d_a_tag_sspath debug almost matching (weak func order)

* d_a_tag_ss_drink debug almost matching (weak func order)

* d_a_tag_stream debug almost matching (weak func order)

* d_a_tag_theB_hint debug almost matching (weak func order)

* d_a_tag_watchge debug almost matching (weak func order)

* d_a_tag_waterfall debug almost matching (weak func order)

* d_a_tag_allmato debug almost matching (weak func order)

* d_a_tag_camera debug almost matching (extra weak fns)

* d_a_tag_wara_howl debug almost matching (RTTI mismatch?)

* d_a_tag_yami debug almost matching (weak func order)

* Fix Shield regressions related to d_a_tag_* debug work
This commit is contained in:
Max Roncace
2026-01-19 21:11:54 -05:00
committed by GitHub
parent 1817d3123f
commit a0a5b0cc38
121 changed files with 3262 additions and 1494 deletions
+2 -2
View File
@@ -5275,7 +5275,7 @@ void daAlink_c::setIceSlipSpeed() {
void daAlink_c::setPolygonSpeed() {
offNoResetFlg3(daPy_FLG3(FLG3_UNK_1000 | FLG3_UNK_2000));
if ((!checkEventRun() || checkNoResetFlg0(daPy_FLG0(FLG0_UNK_10000 | FLG0_UNK_4000))) && !checkMagneBootsOn()) {
if ((!checkEventRun() || checkNoResetFlg0(daPy_FLG0(FLG0_DEMO_STREAM_ACCEPT | FLG0_UNK_4000))) && !checkMagneBootsOn()) {
cM3dGPla tripla;
if (checkNoResetFlg3(FLG3_MIDNA_TALK_POLY_SPEED)) {
offNoResetFlg3(FLG3_MIDNA_TALK_POLY_SPEED);
@@ -13097,7 +13097,7 @@ void daAlink_c::posMove() {
current.pos.x += mWindSpeed.x;
current.pos.z += mWindSpeed.z;
}
} else if (checkNoResetFlg0(daPy_FLG0(FLG0_UNK_10000 | FLG0_UNK_4000))) {
} else if (checkNoResetFlg0(daPy_FLG0(FLG0_DEMO_STREAM_ACCEPT | FLG0_UNK_4000))) {
current.pos += field_0x3594;
}
} else if (checkOctaIealSpecialCollect()) {
+1 -1
View File
@@ -888,7 +888,7 @@ void daAlink_c::resetSpecialEvent() {
void daAlink_c::endDemoMode() {
BOOL flyAtnWait = checkFlyAtnWait();
endHighModel();
offNoResetFlg0(daPy_FLG0(FLG0_UNK_10000 | FLG0_UNK_400));
offNoResetFlg0(daPy_FLG0(FLG0_DEMO_STREAM_ACCEPT | FLG0_UNK_400));
field_0x06f4 = NULL;
if (field_0x06f8 != NULL) {
+44 -11
View File
@@ -6,12 +6,23 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_CstaSw.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
daTagCstaSw_HIO_c l_HIO;
daTagCstaSw_HIO_c::daTagCstaSw_HIO_c() {
unk_0x4 = 0;
show_range = 0;
}
#if DEBUG
void daTagCstaSw_HIO_c::genMessage(JORMContext* ctx) {
// "Show range"
ctx->genCheckBox("範囲表示", &show_range, 1);
}
#endif
void daTagCstaSw_c::setBaseMtx() {
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
@@ -21,12 +32,20 @@ int daTagCstaSw_c::create() {
fopAcM_ct(this, daTagCstaSw_c);
mSwitch = getSw();
setBaseMtx();
#if DEBUG
// "Stone statue SW tag"
l_HIO.entryHIO("石像SWタグ");
#endif
return cPhs_COMPLEATE_e;
}
fopAc_ac_c* daTagCstaSw_c::searchSekizoAct(void* i_actor, void*) {
if (i_actor && fopAcM_IsActor(i_actor) && fopAcM_GetProfName(i_actor) == PROC_CSTAF) {
return (fopAc_ac_c*)i_actor;
fopAc_ac_c* daTagCstaSw_c::searchSekizoAct(void* i_actor, void* param_1) {
fopAc_ac_c* actor2 = (fopAc_ac_c*)param_1;
fopAc_ac_c* actor = (fopAc_ac_c*)i_actor;
if (actor && fopAcM_IsActor(actor) && fopAcM_GetProfName(actor) == PROC_CSTAF) {
return actor;
}
return NULL;
}
@@ -40,7 +59,8 @@ bool daTagCstaSw_c::areaCheck() {
}
cXyz vec_to_actor = current.pos - sekizo_p->current.pos;
if (vec_to_actor.absXZ() <= scale.x * 100.0f) {
f32 dist_to_actor = vec_to_actor.absXZ();
if (dist_to_actor <= scale.x * 100.0f) {
in_area = true;
}
@@ -48,7 +68,8 @@ bool daTagCstaSw_c::areaCheck() {
}
int daTagCstaSw_c::Execute() {
if (areaCheck() == 1) {
bool checkResult = areaCheck();
if (checkResult == 1) {
if (!fopAcM_isSwitch(this, mSwitch)) {
fopAcM_onSwitch(this, mSwitch);
}
@@ -61,10 +82,23 @@ int daTagCstaSw_c::Execute() {
}
int daTagCstaSw_c::Draw() {
#if DEBUG
if (l_HIO.show_range) {
g_env_light.settingTevStruct(16, &current.pos, &tevStr);
GXColor color = (GXColor){0, 0, 0xff, 0x80};
dDbVw_drawCylinderXlu(current.pos, scale.x * 100.0f, scale.y * 100.0f, color, 1);
}
#endif
return 1;
}
int daTagCstaSw_c::Delete() {
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
@@ -77,17 +111,16 @@ static int daTagCstaSw_Execute(daTagCstaSw_c* i_this) {
}
static int daTagCstaSw_Delete(daTagCstaSw_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->Delete();
}
static int daTagCstaSw_Create(fopAc_ac_c* i_this) {
return static_cast<daTagCstaSw_c*>(i_this)->create();
daTagCstaSw_c* cstaSw = static_cast<daTagCstaSw_c*>(i_this);
int id = fopAcM_GetID(i_this);
return cstaSw->create();
}
daTagCstaSw_HIO_c::~daTagCstaSw_HIO_c() {}
static daTagCstaSw_HIO_c l_HIO;
static actor_method_class l_daTagCstaSw_Method = {
(process_method_func)daTagCstaSw_Create, (process_method_func)daTagCstaSw_Delete,
(process_method_func)daTagCstaSw_Execute, (process_method_func)NULL,
+43 -35
View File
@@ -10,29 +10,32 @@
#include "d/actor/d_a_player.h"
#include "d/d_procname.h"
static int createSolidHeap(fopAc_ac_c* i_this) {
return static_cast<daTagLv6Gate_c*>(i_this)->createHeap();
}
static f32 const l_minRelative[] = {-700.0f, -300.0f, -2000.0f};
static f32 const l_maxRelative[] = {700.0f, 0.0f, 1000.0f};
static char* l_arcName = "Lv6Gate";
int daTagLv6Gate_c::createHeap() {
static int createSolidHeap(fopAc_ac_c* i_this) {
daTagLv6Gate_c* gate = static_cast<daTagLv6Gate_c*>(i_this);
return gate->createHeap();
}
inline int daTagLv6Gate_c::createHeap() {
J3DAnmTextureSRTKey* btk;
J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 15);
mpModel[0] = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000284);
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 15);
JUT_ASSERT(92, modelData != NULL);
mpModel[0] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000284);
if (mpModel[0] == NULL) {
return 0;
}
btk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(l_arcName, 19);
JUT_ASSERT(100, btk != NULL);
mpBtk[0] = new mDoExt_btkAnm();
if (mpBtk[0] == NULL ||
!mpBtk[0]->init(model_data, btk, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1))
!mpBtk[0]->init(modelData, btk, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1))
{
return 0;
}
@@ -42,15 +45,17 @@ int daTagLv6Gate_c::createHeap() {
}
btk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(l_arcName, 20);
JUT_ASSERT(108, btk != NULL);
mpBtk[1] = new mDoExt_btkAnm();
if (mpBtk[1] == NULL ||
!mpBtk[1]->init(model_data, btk, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1))
!mpBtk[1]->init(modelData, btk, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1))
{
return 0;
}
model_data = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 16);
mpModel[1] = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000084);
modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 16);
JUT_ASSERT(115, modelData != NULL);
mpModel[1] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (mpModel[1] == NULL) {
return 0;
}
@@ -68,7 +73,9 @@ int daTagLv6Gate_c::createHeap() {
}
static int daTagLv6Gate_Create(fopAc_ac_c* i_this) {
return static_cast<daTagLv6Gate_c*>(i_this)->create();
daTagLv6Gate_c* gate = static_cast<daTagLv6Gate_c*>(i_this);
int id = fopAcM_GetID(i_this);
return gate->create();
}
void daTagLv6Gate_c::initBaseMtx() {
@@ -76,13 +83,13 @@ void daTagLv6Gate_c::initBaseMtx() {
mDoMtx_stack_c::transS(0.0f, 0.0f, 0.0f);
mDoMtx_stack_c::YrotM(0);
MTXCopy(mDoMtx_stack_c::get(), field_0x6f8[0]);
cMtx_copy(mDoMtx_stack_c::get(), field_0x6f8[0]);
mpModel[0]->setBaseTRMtx(mDoMtx_stack_c::get());
mBgW[0].Move();
mDoMtx_stack_c::transS(0.0f, 2887.0f, -8330.0f);
mDoMtx_stack_c::YrotM(0);
MTXCopy(mDoMtx_stack_c::get(), field_0x6f8[1]);
cMtx_copy(mDoMtx_stack_c::get(), field_0x6f8[1]);
mpModel[1]->setBaseTRMtx(mDoMtx_stack_c::get());
mBgW[1].Move();
}
@@ -159,27 +166,25 @@ inline int daTagLv6Gate_c::execute() {
actor1 = NULL;
fopAcM_SearchByID(parentActorID, &actor1);
if (actor1 == NULL) {
break;
if (actor1 != NULL) {
fopAcM_GetOldPosition_p(actor1)->set(pos);
fopAcM_GetPosition_p(actor1)->set(pos);
#if PLATFORM_GCN
actor2 = NULL;
fopAcM_SearchByName(PROC_NPC_TKC, &actor2);
if (actor2 == NULL) {
break;
}
*fopAcM_GetOldPosition_p(actor2) = pos;
*fopAcM_GetPosition_p(actor2) = pos;
#endif
}
fopAcM_GetOldPosition_p(actor1)->set(pos);
fopAcM_GetPosition_p(actor1)->set(pos);
#if VERSION != VERSION_SHIELD_DEBUG
actor2 = NULL;
fopAcM_SearchByName(PROC_NPC_TKC, &actor2);
if (actor2 == NULL) {
break;
}
*fopAcM_GetOldPosition_p(actor2) = pos;
*fopAcM_GetPosition_p(actor2) = pos;
#endif
break;
}
case '0005':
break;
case '0006':
fopAcM_onSwitch(this, getSwitchNo2());
mpBtk[0]->setFrame(mpBtk[0]->getEndFrame());
@@ -189,7 +194,9 @@ inline int daTagLv6Gate_c::execute() {
fopAcM_delete(parentActorID);
break;
default:
int unused; // debug: force extra b instruction at end of case
JUT_ASSERT(332, FALSE);
break;
}
}
@@ -333,8 +340,8 @@ int daTagLv6Gate_c::draw() {
}
for (u16 i = 0; i < 2; i++) {
J3DModelData* model_data = mpModel[1]->getModelData();
model_data->getMaterialNodePointer(i)->getTevKColor(3)->a = field_0x760[i];
J3DMaterial* material = mpModel[1]->getModelData()->getMaterialNodePointer(i);
material->getTevKColor(3)->a = field_0x760[i];
}
g_env_light.setLightTevColorType_MAJI(mpModel[1], &tevStr);
@@ -360,6 +367,7 @@ daTagLv6Gate_c::~daTagLv6Gate_c() {
}
static int daTagLv6Gate_Delete(daTagLv6Gate_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagLv6Gate_c();
return 1;
}
+63 -75
View File
@@ -18,14 +18,16 @@ int daTagLv7Gate_c::createHeap() {
return 1;
}
J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 11);
mpModel = mDoExt_J3DModel__create(model_data, 0, 0x11000084);
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 11);
JUT_ASSERT(92, modelData != NULL);
mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11000084);
if (mpModel == NULL) {
return 0;
}
J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, 7);
JUT_ASSERT(100, bck != NULL);
mpBck = new mDoExt_bckAnm();
@@ -37,11 +39,14 @@ int daTagLv7Gate_c::createHeap() {
}
static int createSolidHeap(fopAc_ac_c* i_this) {
return static_cast<daTagLv7Gate_c*>(i_this)->createHeap();
daTagLv7Gate_c* gate = static_cast<daTagLv7Gate_c*>(i_this);
return gate->createHeap();
}
static int daTagLv7Gate_Create(fopAc_ac_c* i_this) {
return static_cast<daTagLv7Gate_c*>(i_this)->create();
daTagLv7Gate_c* gate = static_cast<daTagLv7Gate_c*>(i_this);
int id = fopAcM_GetID(i_this);
return gate->create();
}
int daTagLv7Gate_c::create() {
@@ -66,48 +71,46 @@ int daTagLv7Gate_c::create() {
return phase;
}
void daTagLv7Gate_c::setPath(u8 i_path_ID) {
int daTagLv7Gate_c::setPath(int i_path_ID) {
mRoomPath = dPath_GetRoomPath(i_path_ID, fopAcM_GetRoomNo(this));
if (mRoomPath != NULL) {
dPnt* pnt = dPath_GetPnt(mRoomPath, 0);
cXyz pos1 = pnt->m_position;
pnt = dPath_GetPnt(mRoomPath, 1);
cXyz pos2 = pnt->m_position;
mPos1 = pos1;
// Fake match?
s16 angle_y = cLib_targetAngleY(&pos1, &pos2);
// s16 angle_x = cLib_targetAngleX(&pos1, &pos2);
// field_0x594.set(-angle_x, angle_y, 0);
field_0x594.x = -cLib_targetAngleX(&pos1, &pos2);
// field_0x594.x = -angle_x;
field_0x594.y = angle_y;
field_0x594.z = 0;
mDistance = sqrtf(PSVECSquareDistance((Vec*)&mPos1, (Vec*)&pos2));
field_0x5a0 = 1;
mPos2 = pos2;
if (mRoomPath == NULL) {
return 0;
}
cXyz pos1 = dPath_GetPnt(mRoomPath, 0)->m_position;
cXyz pos2 = dPath_GetPnt(mRoomPath, 1)->m_position;
mPos1.set(pos1);
field_0x594.set(-cLib_targetAngleX(&pos1, &pos2), cLib_targetAngleY(&pos1, &pos2), 0);
mDistance = mPos1.abs(pos2);
field_0x5a0 = 1;
mPos2.set(pos2);
return 1;
}
void daTagLv7Gate_c::initBaseMtx() {
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
if (mpModel != NULL) {
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
setBaseMtx();
}
}
void daTagLv7Gate_c::setBaseMtx() {
if (mpModel) {
cXyz local_34(0.0f, 0.0f, speedF);
mDoMtx_stack_c::transS(mPos1);
mDoMtx_stack_c::ZXYrotM((csXyz&)field_0x594);
mDoMtx_stack_c::multVec(&local_34, (Vec*)&mPos1);
MTXCopy(mDoMtx_stack_c::get(), mpModel->mBaseTransformMtx);
attention_info.position = mPos1;
if (mpModel == NULL) {
return;
}
cXyz local_34(0.0f, 0.0f, speedF);
mDoMtx_stack_c::transS(mPos1);
mDoMtx_stack_c::ZXYrotM(field_0x594);
mDoMtx_stack_c::multVec(&local_34, &mPos1);
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
attention_info.position = mPos1;
}
void daTagLv7Gate_c::create_init() {
@@ -119,14 +122,11 @@ void daTagLv7Gate_c::create_init() {
field_0x5b0 = false;
field_0x5b1 = false;
setPath(getPathID() & 0xFF);
setPath(getPathID());
attention_info.position = mPos1;
if (mpModel) {
initBaseMtx();
setBaseMtx();
}
initBaseMtx();
// City in the Sky clear
if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[268])) {
@@ -149,13 +149,9 @@ void daTagLv7Gate_c::create_init() {
fopAcM_create(PROC_NPC_TKS, 7, &pos, fopAcM_GetRoomNo(this), &local_54, NULL, -1);
pos.x = 2603.315f;
pos.y = -200.0f;
pos.z = 5485.9224f;
pos.set(2603.315f, -200.0f, 5485.9224f);
local_54.x = 0.0f;
local_54.y = -0x4000;
local_54.z = 0.0f;
local_54.set(0, -0x4000, 0);
fopAcM_create(PROC_NPC_TKJ, 0, &pos, fopAcM_GetRoomNo(this), &local_54, NULL, -1);
}
@@ -163,6 +159,7 @@ void daTagLv7Gate_c::create_init() {
eventInfo.setArchiveName(l_arcName);
dComIfGp_getEventManager().setObjectArchive(eventInfo.getArchiveName());
mEvtId = dComIfGp_getEventManager().getEventIdx(this, mEvName, -1);
JUT_ASSERT(204, mEvtId != -1);
fopAcM_orderOtherEventId(this, mEvtId, -1, -1, 2, 1);
}
@@ -187,7 +184,7 @@ void daTagLv7Gate_c::flyAnime() {
if (bck_anm == bck_anm_3) {
if (field_0x5ac < 150) {
field_0x5ac += 1;
field_0x5ac += (u16)1;
if (field_0x5ac >= 150) {
bck = bck_anm_4;
attribute = J3DFrameCtrl::EMode_NONE;
@@ -199,10 +196,7 @@ void daTagLv7Gate_c::flyAnime() {
attribute = J3DFrameCtrl::EMode_NONE;
}
} else {
// } else if (mpBck->isStop()) {
// Fake match?
mDoExt_bckAnm* tmp = mpBck;
if (tmp->isStop()) {
if (mpBck->isStop()) {
if (bck_anm == bck_anm_2) {
bck = bck_anm_3;
attribute = J3DFrameCtrl::EMode_LOOP;
@@ -287,46 +281,39 @@ int daTagLv7Gate_c::execute() {
return 1;
}
bool daTagLv7Gate_c::checkPoint(f32 i_speed) {
bool daTagLv7Gate_c::checkPoint(cXyz& i_point, f32 i_speed) {
dPnt* pnt = dPath_GetPnt(mRoomPath, field_0x5a0);
mDistance -= i_speed;
if (sqrtf(PSVECSquareDistance((Vec*)&mPos1, (Vec*)&pnt->m_position)) < i_speed ||
if (i_point.abs(pnt->m_position) < i_speed ||
mDistance < 0.0f) {
return true;
}
}
return false;
}
bool daTagLv7Gate_c::setNextPoint() {
bool bVar1;
dPath_GetPnt(mRoomPath, field_0x5a0);
dPnt* unusedPnt = dPath_GetPnt(mRoomPath, field_0x5a0);
dPnt* pnt;
field_0x5a0 += 1;
if (field_0x5a0 >= mRoomPath->m_num) {
field_0x5a0 = mRoomPath->m_num - 1;
mDistance = 0;
bVar1 = true;
return true;
} else {
dPnt* pnt = dPath_GetPnt(mRoomPath, field_0x5a0);
cXyz pos1(mPos1.x, 0.0f, mPos1.z);
cXyz pos2(pnt->m_position.x, 0.0f, pnt->m_position.z);
mDistance = sqrtf(PSVECSquareDistance((Vec*)&pos1, (Vec*)&pos2));
mPos2 = pnt->m_position;
bVar1 = false;
pnt = dPath_GetPnt(mRoomPath, field_0x5a0);
mDistance = mPos1.absXZ(pnt->m_position);
mPos2.set(pnt->m_position);
return false;
}
if (bVar1) {
field_0x5b1 = false;
speedF = 0;
}
return bVar1;
}
void daTagLv7Gate_c::calcFly() {
f32 speed = speedF;
if (checkPoint(speed)) {
setNextPoint();
if (checkPoint(mPos1, speedF)) {
if (setNextPoint()) {
field_0x5b1 = false;
speedF = 0.0f;
}
}
s16 angle_x = -cLib_targetAngleX(&mPos1, &mPos2);
s16 angle_y = cLib_targetAngleY(&mPos1, &mPos2);
@@ -361,6 +348,7 @@ daTagLv7Gate_c::~daTagLv7Gate_c() {
}
static int daTagLv7Gate_Delete(daTagLv7Gate_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagLv7Gate_c();
return 1;
}
+21 -13
View File
@@ -11,7 +11,8 @@
static char* l_arcName = "Lv8Gate";
static int createSolidHeap(fopAc_ac_c* i_this) {
return static_cast<daTagLv8Gate_c*>(i_this)->createHeap();
daTagLv8Gate_c* gate = static_cast<daTagLv8Gate_c*>(i_this);
return gate->createHeap();
}
daTagLv8Gate_c::~daTagLv8Gate_c() {
@@ -43,21 +44,20 @@ inline int daTagLv8Gate_c::create() {
fopAcM_ct(this, daTagLv8Gate_c);
cPhs__Step step;
/* dSv_event_flag_c::F_0354 - Cutscene - [cutscene] Mirror complete */
/* dSv_event_flag_c::F_0354 - Cutscene - [cutscene] Mirror complete */
if (!dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[354])) {
step = cPhs_ERROR_e;
return cPhs_ERROR_e;
} else {
step = (cPhs__Step)dComIfG_resLoad(&mPhaseReq, l_arcName);
if (step == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, createSolidHeap, 0x1600)) {
step = cPhs_ERROR_e;
return cPhs_ERROR_e;
} else {
create_init();
}
}
return step;
}
return step;
}
inline int daTagLv8Gate_c::draw() {
@@ -81,18 +81,24 @@ inline int daTagLv8Gate_c::draw() {
dComIfGd_setList();
if (mpBck != NULL) {
mpModel->getModelData()->getJointNodePointer(0)->setMtxCalc(NULL);
mpBck->remove(mpModel->getModelData());
}
}
return TRUE;
}
// this function and ::execute seem to be inline, but somehow both this function's .data and .rodata
// are supposed to be placed before ::execute's (.data order is reversed for inline functions but
// .rodata order is not)
// retail function order also suggests that this function comes first
int daTagLv8Gate_c::createHeap() {
if (strcmp(dComIfGp_getStartStageName(), "D_MN08") == 0) {
J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 8);
mpModel = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000084);
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 8);
JUT_ASSERT(275, modelData != NULL);
mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, 5);
JUT_ASSERT(283, bck != NULL);
mpBck = new mDoExt_bckAnm();
if (mpBck == NULL ||
!mpBck->init(bck, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false))
@@ -105,15 +111,16 @@ int daTagLv8Gate_c::createHeap() {
}
static int daTagLv8Gate_Create(fopAc_ac_c* i_this) {
daTagLv8Gate_c* a_this = static_cast<daTagLv8Gate_c*>(i_this);
return a_this->create();
daTagLv8Gate_c* gate = static_cast<daTagLv8Gate_c*>(i_this);
int id = fopAcM_GetID(i_this);
return gate->create();
}
static int daTagLv8Gate_Execute(daTagLv8Gate_c* i_this) {
return i_this->execute();
}
inline int daTagLv8Gate_c::execute() {
int daTagLv8Gate_c::execute() {
if (dComIfGp_event_runCheck() && !eventInfo.checkCommandTalk()) {
dEvent_manager_c& eventManager = dComIfGp_getEventManager();
s32 cut_index = eventManager.getMyStaffId(l_arcName, NULL, 0);
@@ -132,8 +139,8 @@ inline int daTagLv8Gate_c::execute() {
if (mirror_table != NULL) {
static_cast<daObjMirrorTable_c*>(mirror_table)->setEffect();
}
break;
}
break;
case '0002':
dStage_changeScene(getSceneNo(), 0.0f, 0, fopAcM_GetRoomNo(this), 0, -1);
break;
@@ -215,6 +222,7 @@ static int daTagLv8Gate_IsDelete(daTagLv8Gate_c* i_this) {
}
static int daTagLv8Gate_Delete(daTagLv8Gate_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagLv8Gate_c();
return TRUE;
}
+276 -143
View File
@@ -4,12 +4,13 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_TWgate.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "d/actor/d_a_player.h"
#include "d/actor/d_a_tag_TWgate.h"
#include "d/d_com_inf_game.h"
#include "d/d_debug_viewer.h"
#include "d/d_msg_object.h"
#include "f_op/f_op_actor_mng.h"
#include "JSystem/JUtility/JUTAssert.h"
struct daTagTWGate_zevParam {
/* 0x00 */ char* mArcName;
@@ -23,13 +24,11 @@ struct daTagTWGate_zevParam {
/* 0x1B */ s8 mLayer;
};
void daTagTWGate_c::initWait() {
mEventID = -1;
}
daTagTWGate_Attr_c const daTagTWGate_c::mAttr = {};
u8 const daTagTWGate_c::mAttr[1] = {
0x00,
};
#if DEBUG
daTagTWGate_Hio_c daTagTWGate_c::mHio;
#endif
static daTagTWGate_zevParam const l_zevParamTbl[4] = {
{
@@ -80,7 +79,7 @@ static daTagTWGate_zevParam const l_zevParamTbl[4] = {
static const char* l_myName = "Gate";
actionFunc daTagTWGate_c::ActionTable[13][2] = {
const actionFunc daTagTWGate_c::ActionTable[][2] = {
{&daTagTWGate_c::initWait, &daTagTWGate_c::executeWait},
{&daTagTWGate_c::initDemoFilone1, &daTagTWGate_c::executeDemoFilone1},
{&daTagTWGate_c::initDemoFilone2, &daTagTWGate_c::executeDemoFilone2},
@@ -96,59 +95,117 @@ actionFunc daTagTWGate_c::ActionTable[13][2] = {
{&daTagTWGate_c::initDemoHyral3, &daTagTWGate_c::executeDemoHyral3},
};
void daTagTWGate_c::executeWait() {
f32 radius = pow(scale.x * 100.0f, 2.0f);
f32 distance = fopAcM_searchActorDistanceXZ2(this, (fopAc_ac_c*)dComIfGp_getPlayer(0));
#if DEBUG
daTagTWGate_Hio_c::daTagTWGate_Hio_c() {
field_0x8 = 0;
default_set();
}
if (distance < radius) {
void daTagTWGate_Hio_c::ct() {
if (field_0x8++ == 0) {
// "Twilight Gate tag"
entryHIO("トワイライトゲートタグ");
}
}
void daTagTWGate_Hio_c::dt() {
if (--field_0x8 == 0) {
removeHIO();
}
}
void daTagTWGate_Hio_c::default_set() {
attr = daTagTWGate_c::mAttr;
}
void daTagTWGate_Hio_c::genMessage(JORMContext* ctx) {
// "Twilight Gate tag parameter settings"
ctx->genLabel("§ トワイライトゲートタグ パラメータ設定 §\n", 0);
// "Draw range"
ctx->genCheckBox("範囲描画", &attr.show_range, 1);
}
#endif
inline daTagTWGate_c::~daTagTWGate_c() {
dComIfG_resDelete(&mPhaseZevArc, l_zevParamTbl[mType].mArcName);
if (mPhaseMdRes.id != cPhs_INIT_e) {
dComIfG_resDelete(&mPhaseMdRes, "TWGate_Md");
}
if (mPhasePyRes.id != cPhs_INIT_e) {
dComIfG_resDelete(&mPhasePyRes, mIsWolf ? "TWGate_Wf" : "TWGate_Lk");
}
#if DEBUG
mHio.dt();
#endif
}
void daTagTWGate_c::initWait() {
mEventID = -1;
}
void daTagTWGate_c::setAction(Mode_e i_action) {
JUT_ASSERT(233, i_action < MODE_MAX_e);
int oldActionID = mActionID;
mActionID = i_action;
mAction = ActionTable[mActionID];
callInit();
}
void daTagTWGate_c::callInit() {
JUT_ASSERT(289, mAction != NULL);
(this->*(*mAction))();
}
void daTagTWGate_c::callExecute() {
JUT_ASSERT(302, mAction != NULL);
(this->*mAction[1])();
Z2GetAudioMgr()->seStartLevel(Z2SE_OBJ_DARK_GATE, &current.pos,
0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
}
void daTagTWGate_c::executeWait() {
f32 radius = std::pow(scale.x * 100.0f, 2.0f);
if (fopAcM_searchPlayerDistanceXZ2(this) < radius) {
if (field_0x5de == 0) {
field_0x5de = 1;
switch (mType) {
case TYPE_FILONE:
if (fopAcM_isSwitch(this, getSwitch())) {
mActionID = ACT_DEMO_FILONE_2;
mAction = &ActionTable[mActionID][0];
(this->**mAction)();
setAction(ACT_DEMO_FILONE_2);
} else {
mActionID = ACT_DEMO_FILONE_1;
mAction = &ActionTable[mActionID][0];
(this->**mAction)();
setAction(ACT_DEMO_FILONE_1);
}
break;
case TYPE_ORDIN:
if (fopAcM_isSwitch(this, getSwitch())) {
mActionID = ACT_DEMO_ORDIN_2;
mAction = &ActionTable[mActionID][0];
(this->**mAction)();
setAction(ACT_DEMO_ORDIN_2);
} else {
mActionID = ACT_DEMO_ORDIN_1;
mAction = &ActionTable[mActionID][0];
(this->**mAction)();
setAction(ACT_DEMO_ORDIN_1);
}
break;
case TYPE_RANAIL:
if (fopAcM_isSwitch(this, getSwitch())) {
mActionID = ACT_DEMO_RANAIL_2;
mAction = &ActionTable[mActionID][0];
(this->**mAction)();
setAction(ACT_DEMO_RANAIL_2);
} else {
mActionID = ACT_DEMO_RANAIL_1;
mAction = &ActionTable[mActionID][0];
(this->**mAction)();
setAction(ACT_DEMO_RANAIL_1);
}
break;
case TYPE_HYRAL:
if (fopAcM_isSwitch(this, getSwitch())) {
mActionID = ACT_DEMO_HYRAL_2;
mAction = &ActionTable[mActionID][0];
(this->**mAction)();
setAction(ACT_DEMO_HYRAL_2);
} else {
mActionID = ACT_DEMO_HYRAL_1;
mAction = &ActionTable[mActionID][0];
(this->**mAction)();
setAction(ACT_DEMO_HYRAL_1);
}
break;
default:
// "Twilight Gate demo tag argument 0 error Type=%d
OS_REPORT("\nトワイライトゲートデモタグ 引数0エラー Type=%d\n\n", mType);
JUT_ASSERT(344, FALSE);
}
}
} else {
@@ -166,34 +223,36 @@ void daTagTWGate_c::executeDemoFilone1() {
dEvent_manager_c& event_manager = dComIfGp_getEventManager();
int staffId = event_manager.getMyStaffId(l_myName, NULL, 0);
int* cutName;
if (staffId != -1) {
int* cutName = (int*)event_manager.getMyNowCutName(staffId);
cutName = (int*)event_manager.getMyNowCutName(staffId);
if (event_manager.getIsAddvance(staffId)) {
switch (*cutName) {
case 0x30303031:
dComIfGp_getEvent()->setSkipProc(this, dEv_noFinishSkipProc, 0);
dComIfGp_getEvent()->startCheckSkipEdge(this);
break;
default:
JUT_ASSERT(395, FALSE);
}
}
switch (*cutName) {
case 0x30303031:
if (dComIfGp_getEvent()->chkFlag2(8)) {
if (dComIfGp_getEvent()->checkSkipEdge()) {
dComIfGp_getEvent()->onSkipFade();
mActionID = ACT_DEMO_FILONE_2;
mAction = ActionTable[mActionID];
(this->**mAction)();
setAction(ACT_DEMO_FILONE_2);
}
event_manager.cutEnd(staffId);
break;
default:
JUT_ASSERT(407, FALSE);
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 &&
event_manager.endCheck(mEventID))
{
mActionID = ACT_DEMO_FILONE_2;
mAction = ActionTable[mActionID];
(this->**mAction)();
setAction(ACT_DEMO_FILONE_2);
}
}
}
@@ -213,12 +272,13 @@ void daTagTWGate_c::initDemoFilone2() {
}
void daTagTWGate_c::executeDemoFilone2() {
s32 staffId = dComIfGp_evmng_getMyStaffId(l_myName, NULL, 0);
dEvent_manager_c& eventManager = dComIfGp_getEventManager();
s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0);
if (staffId != -1) {
int* cutName = (int*)dComIfGp_getEventManager().getMyNowCutName(staffId);
int* cutName = (int*)eventManager.getMyNowCutName(staffId);
if (dComIfGp_evmng_getIsAddvance(staffId)) {
if (eventManager.getIsAddvance(staffId)) {
switch (*cutName) {
case '0002':
initTalk(0xBC1, NULL);
@@ -226,40 +286,43 @@ void daTagTWGate_c::executeDemoFilone2() {
case '0001':
case '0003':
break;
default:
JUT_ASSERT(480, FALSE);
}
}
switch (*cutName) {
case '0001':
case '0003':
dComIfGp_evmng_cutEnd(staffId);
eventManager.cutEnd(staffId);
break;
case '0002':
if (talkProc(NULL, 1, NULL)) {
if (mMsgFlow.getChoiceNo() == 0) {
mActionID = ACT_DEMO_FILONE_3;
mAction = ActionTable[mActionID];
(this->**mAction)();
int choiceNo = mMsgFlow.getChoiceNo();
// "Two-way branch %s" / "Yes" / "No"
OS_REPORT("二択分岐 %s\n", choiceNo == 0 ? "はい" : "いいえ");
if (choiceNo == 0) {
setAction(ACT_DEMO_FILONE_3);
}
dComIfGp_evmng_cutEnd(staffId);
eventManager.cutEnd(staffId);
}
break;
default:
JUT_ASSERT(497, FALSE);
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 &&
dComIfGp_evmng_endCheck(mEventID)) {
dComIfGp_getEvent()->reset();
eventManager.endCheck(mEventID)) {
dComIfGp_event_reset();
field_0x5e0 = 0;
mActionID = ACT_WAIT;
mAction = ActionTable[mActionID];
(this->**mAction)();
setAction(ACT_WAIT);
}
}
}
void daTagTWGate_c::initDemoFilone3() {
field_0x5de = 1;
mIsWolf = (dComIfGp_getLinkPlayer()->mNoResetFlg1 >> 25) & 1; // checking if wolf?
mIsWolf = daPy_py_c::checkNowWolf() ? TRUE : FALSE;
eventInfo.setArchiveName(l_zevParamTbl[mType].mArcName);
dComIfGp_getEventManager().setObjectArchive(eventInfo.getArchiveName());
mEventID =
@@ -269,17 +332,18 @@ void daTagTWGate_c::initDemoFilone3() {
}
void daTagTWGate_c::executeDemoFilone3() {
s32 staffId = dComIfGp_evmng_getMyStaffId(l_myName, NULL, 0);
dEvent_manager_c& eventManager = dComIfGp_getEventManager();
s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0);
if (staffId != -1) {
int* cutName = (int*)dComIfGp_getEventManager().getMyNowCutName(staffId);
int* cutName = (int*)eventManager.getMyNowCutName(staffId);
if (dComIfGp_evmng_getIsAddvance(staffId)) {
if (eventManager.getIsAddvance(staffId)) {
switch (*cutName) {
case 0x30303031:
break;
case 0x30303032:
dComIfGp_getEvent()->setSkipProc(this, dEv_noFinishSkipProc, 0);
dComIfGp_getEvent()->startCheckSkipEdge(this);
field_0x5e1 = 0;
break;
case 0x30303033:
@@ -287,50 +351,46 @@ void daTagTWGate_c::executeDemoFilone3() {
mpMorf->setPlaySpeed(1.0f);
field_0x5e0 = 1;
break;
default:
JUT_ASSERT(560, FALSE);
}
}
switch (*cutName) {
case 0x30303031: {
case 0x30303031:
int modelSts = downloadModels();
if (modelSts == 1) {
dComIfGp_evmng_cutEnd(staffId);
eventManager.cutEnd(staffId);
} else if (modelSts == -1) {
dComIfGp_setNextStage(l_zevParamTbl[mType].mStage, l_zevParamTbl[mType].mPoint,
l_zevParamTbl[mType].mRoomNo, l_zevParamTbl[mType].mLayer);
}
break;
}
case 0x30303032: {
if (dComIfGp_getEvent()->chkFlag2(8)) {
case 0x30303032:
if (dComIfGp_getEvent()->checkSkipEdge()) {
dComIfGp_getEvent()->onSkipFade();
dComIfGp_setNextStage(l_zevParamTbl[mType].mStage, l_zevParamTbl[mType].mPoint,
l_zevParamTbl[mType].mRoomNo, l_zevParamTbl[mType].mLayer);
}
u8 old_5e1 = field_0x5e1;
field_0x5e1++;
if (old_5e1 == 43) {
if (field_0x5e1++ == 43) {
daPy_py_c* player = daPy_getPlayerActorClass();
csXyz sxyz(0, player->shape_angle.y + 0x8000, 0);
cXyz pos;
csXyz sxyz(0, fopAcM_GetShapeAngle_p(player)->y + 0x8000, 0);
mDoMtx_stack_c::transS(player->current.pos);
mDoMtx_stack_c::transS(fopAcM_GetPosition(player));
mDoMtx_stack_c::YrotM(sxyz.y);
mDoMtx_stack_c::transM(0.0f, 240.0f, -710.0f);
cXyz pos;
pos.x = mDoMtx_stack_c::get()[0][3];
pos.y = mDoMtx_stack_c::get()[1][3];
pos.z = mDoMtx_stack_c::get()[2][3];
mDoMtx_stack_c::multVecZero(&pos);
dComIfGp_particle_set(0x86C5, &pos, &sxyz, NULL);
mDoAud_seStart(Z2SE_OBJ_DARK_GATE_RIPPLE, &pos, 0, 0);
dComIfGp_evmng_cutEnd(staffId);
Z2GetAudioMgr()->seStart(Z2SE_OBJ_DARK_GATE_RIPPLE, &pos,
0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
eventManager.cutEnd(staffId);
}
break;
}
case 0x30303033:
if (dComIfGp_getEvent()->chkFlag2(8)) {
if (dComIfGp_getEvent()->checkSkipEdge()) {
dComIfGp_getEvent()->onSkipFade();
dComIfGp_setNextStage(l_zevParamTbl[mType].mStage,
l_zevParamTbl[mType].mPoint,
@@ -339,18 +399,19 @@ void daTagTWGate_c::executeDemoFilone3() {
}
if (mpMorf->isStop()) {
dComIfGp_evmng_cutEnd(staffId);
eventManager.cutEnd(staffId);
}
break;
default:
JUT_ASSERT(621, FALSE);
break;
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 &&
dComIfGp_evmng_endCheck(mEventID)) {
dComIfGp_getEvent()->reset();
eventManager.endCheck(mEventID)) {
dComIfGp_event_reset();
field_0x5e0 = 0;
mActionID = ACT_WAIT;
mAction = ActionTable[mActionID];
(this->**mAction)();
setAction(ACT_WAIT);
}
}
}
@@ -364,13 +425,16 @@ void daTagTWGate_c::initDemoOrdin1() {
void daTagTWGate_c::executeDemoOrdin1() {
dEvent_manager_c& evtMng = dComIfGp_getEventManager();
int staffId = evtMng.getMyStaffId(l_myName, NULL, 0);
int* cutName;
if (staffId != -1) {
int* cutName = (int*)evtMng.getMyNowCutName(staffId);
cutName = (int*)evtMng.getMyNowCutName(staffId);
if (evtMng.getIsAddvance(staffId)) {
switch (*cutName) {
case '0001':
dComIfGp_getEvent()->startCheckSkipEdge(this);
break;
default:
JUT_ASSERT(674, FALSE);
}
}
switch (*cutName) {
@@ -381,6 +445,9 @@ void daTagTWGate_c::executeDemoOrdin1() {
}
evtMng.cutEnd(staffId);
break;
default:
JUT_ASSERT(686, FALSE);
break;
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 && evtMng.endCheck(mEventID)) {
setAction(ACT_DEMO_ORDIN_2);
@@ -417,23 +484,30 @@ void daTagTWGate_c::executeDemoOrdin2() {
break;
case '0003':
break;
default:
JUT_ASSERT(749, FALSE);
break;
}
}
int choiceNo;
switch(*cutName) {
switch (*cutName) {
case '0001':
case '0003':
evtMng.cutEnd(staffId);
break;
case '0002':
if (talkProc(NULL, 1, NULL)) {
choiceNo = mMsgFlow.getChoiceNo();
int choiceNo = mMsgFlow.getChoiceNo();
// "Two-way branch %s" / "Yes" / "No"
OS_REPORT("二択分岐 %s\n", choiceNo == 0 ? "はい" : "いいえ");
if (choiceNo == 0) {
setAction(ACT_DEMO_ORDIN_3);
}
evtMng.cutEnd(staffId);
}
break;
default:
JUT_ASSERT(766, FALSE);
break;
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 &&
@@ -447,7 +521,7 @@ void daTagTWGate_c::executeDemoOrdin2() {
void daTagTWGate_c::initDemoOrdin3() {
field_0x5de = 1;
mIsWolf = (dComIfGp_getLinkPlayer()->mNoResetFlg1 >> 25) & 1; // checking if wolf?
mIsWolf = daPy_py_c::checkNowWolf() ? TRUE : FALSE;
eventInfo.setArchiveName(l_zevParamTbl[mType].mArcName);
dComIfGp_getEventManager().setObjectArchive(eventInfo.getArchiveName());
mEventID =
@@ -477,7 +551,7 @@ void daTagTWGate_c::executeDemoOrdin3() {
field_0x5e0 = 1;
break;
default:
JUT_PANIC(829, "0");
JUT_ASSERT(829, FALSE);
break;
}
@@ -527,7 +601,7 @@ void daTagTWGate_c::executeDemoOrdin3() {
}
break;
default:
JUT_PANIC(890, "0");
JUT_ASSERT(890, FALSE);
break;
}
@@ -547,13 +621,17 @@ void daTagTWGate_c::initDemoRanail1() {
void daTagTWGate_c::executeDemoRanail1() {
dEvent_manager_c& evtMng = dComIfGp_getEventManager();
int staffId = evtMng.getMyStaffId(l_myName, NULL, 0);
int* cutName;
if (staffId != -1) {
int* cutName = (int*)evtMng.getMyNowCutName(staffId);
cutName = (int*)evtMng.getMyNowCutName(staffId);
if (evtMng.getIsAddvance(staffId)) {
switch (*cutName) {
case '0001':
dComIfGp_getEvent()->startCheckSkipEdge(this);
break;
default:
JUT_ASSERT(943, FALSE);
break;
}
}
switch (*cutName) {
@@ -564,6 +642,9 @@ void daTagTWGate_c::executeDemoRanail1() {
}
evtMng.cutEnd(staffId);
break;
default:
JUT_ASSERT(955, FALSE);
break;
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 && evtMng.endCheck(mEventID)) {
setAction(ACT_DEMO_RANAIL_2);
@@ -600,23 +681,30 @@ void daTagTWGate_c::executeDemoRanail2() {
break;
case '0003':
break;
default:
JUT_ASSERT(1018, FALSE);
break;
}
}
int choiceNo;
switch(*cutName) {
switch (*cutName) {
case '0001':
case '0003':
evtMng.cutEnd(staffId);
break;
case '0002':
if (talkProc(NULL, 1, NULL)) {
choiceNo = mMsgFlow.getChoiceNo();
int choiceNo = mMsgFlow.getChoiceNo();
// "Two-way branch" / "Yes" / "No"
OS_REPORT("二択分岐 %s\n", choiceNo == 0 ? "はい" : "いいえ");
if (choiceNo == 0) {
setAction(ACT_DEMO_RANAIL_3);
}
evtMng.cutEnd(staffId);
}
break;
default:
JUT_ASSERT(1035, FALSE);
break;
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 &&
@@ -630,7 +718,7 @@ void daTagTWGate_c::executeDemoRanail2() {
void daTagTWGate_c::initDemoRanail3() {
field_0x5de = 1;
mIsWolf = (dComIfGp_getLinkPlayer()->mNoResetFlg1 >> 25) & 1; // checking if wolf?
mIsWolf = daPy_py_c::checkNowWolf() ? TRUE : FALSE;
eventInfo.setArchiveName(l_zevParamTbl[mType].mArcName);
dComIfGp_getEventManager().setObjectArchive(eventInfo.getArchiveName());
mEventID =
@@ -662,7 +750,7 @@ void daTagTWGate_c::executeDemoRanail3() {
field_0x5e0 = 1;
break;
default:
JUT_PANIC(1099, "0");
JUT_ASSERT(1099, FALSE);
break;
}
}
@@ -711,7 +799,7 @@ void daTagTWGate_c::executeDemoRanail3() {
}
break;
default:
JUT_PANIC(1160, "0");
JUT_ASSERT(1160, FALSE);
break;
}
@@ -731,13 +819,16 @@ void daTagTWGate_c::initDemoHyral1() {
void daTagTWGate_c::executeDemoHyral1() {
dEvent_manager_c& evtMng = dComIfGp_getEventManager();
int staffId = evtMng.getMyStaffId(l_myName, NULL, 0);
int* cutName;
if (staffId != -1) {
int* cutName = (int*)evtMng.getMyNowCutName(staffId);
cutName = (int*)evtMng.getMyNowCutName(staffId);
if (evtMng.getIsAddvance(staffId)) {
switch (*cutName) {
case '0001':
dComIfGp_getEvent()->startCheckSkipEdge(this);
break;
default:
JUT_ASSERT(1213, FALSE);
}
}
switch (*cutName) {
@@ -748,6 +839,9 @@ void daTagTWGate_c::executeDemoHyral1() {
}
evtMng.cutEnd(staffId);
break;
default:
JUT_ASSERT(1225, FALSE);
break;
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 && evtMng.endCheck(mEventID)) {
setAction(ACT_DEMO_HYRAL_2);
@@ -783,23 +877,28 @@ void daTagTWGate_c::executeDemoHyral2() {
case '0002':
initTalk(0xbc1, NULL);
break;
default:
JUT_ASSERT(1288, FALSE);
}
}
int choiceNo;
switch(*piVar3) {
switch (*piVar3) {
case '0001':
case '0003':
eventMgr.cutEnd(staffId);
break;
case '0002':
if (talkProc(NULL, 1, NULL)) {
choiceNo = mMsgFlow.getChoiceNo();
int choiceNo = mMsgFlow.getChoiceNo();
OS_REPORT("二択分岐 %s\n", choiceNo == 0 ? "はい" : "いいえ");
if (choiceNo == 0) {
setAction(ACT_DEMO_HYRAL_3);
}
eventMgr.cutEnd(staffId);
}
break;
default:
JUT_ASSERT(1305, FALSE);
break;
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 &&
eventMgr.endCheck(mEventID))
@@ -812,7 +911,7 @@ void daTagTWGate_c::executeDemoHyral2() {
void daTagTWGate_c::initDemoHyral3() {
field_0x5de = 1;
mIsWolf = (dComIfGp_getLinkPlayer()->mNoResetFlg1 >> 25) & 1; // checking if wolf?
mIsWolf = daPy_py_c::checkNowWolf() ? TRUE : FALSE;
eventInfo.setArchiveName(l_zevParamTbl[mType].mArcName);
dComIfGp_getEventManager().setObjectArchive(eventInfo.getArchiveName());
mEventID =
@@ -841,6 +940,8 @@ void daTagTWGate_c::executeDemoHyral3() {
mpMorf->setPlaySpeed(1.0f);
field_0x5e0 = 1;
break;
default:
JUT_ASSERT(1368, FALSE);
}
}
switch(*piVar3) {
@@ -883,6 +984,9 @@ void daTagTWGate_c::executeDemoHyral3() {
eventMgr.cutEnd(staffId);
}
break;
default:
JUT_ASSERT(1417, FALSE);
break;
}
if (eventInfo.checkCommandDemoAccrpt() && mEventID != -1 &&
eventMgr.endCheck(mEventID))
@@ -894,17 +998,15 @@ void daTagTWGate_c::executeDemoHyral3() {
}
void daTagTWGate_c::initBaseMtx() {
cullMtx = mpMorf->getModel()->getBaseTRMtx();
fopAc_ac_c* player = (fopAc_ac_c*)dComIfGp_getPlayer(0);
fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx());
fopAc_ac_c* player = daPy_getPlayerActorClass();
shape_angle.y = player->shape_angle.y + 0x8000;
mDoMtx_stack_c::transS(player->current.pos);
shape_angle.y = fopAcM_GetShapeAngle_p(player)->y + 0x8000;
mDoMtx_stack_c::transS(fopAcM_GetPosition(player));
mDoMtx_stack_c::YrotM(shape_angle.y);
mDoMtx_stack_c::transM(0.0f, 250.0f, -840.0f);
current.pos.x = mDoMtx_stack_c::get()[0][3];
current.pos.y = mDoMtx_stack_c::get()[1][3];
current.pos.z = mDoMtx_stack_c::get()[2][3];
mDoMtx_stack_c::multVecZero(&current.pos);
mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
}
@@ -917,14 +1019,18 @@ int daTagTWGate_c::downloadModels() {
}
if (phase_state == cPhs_COMPLEATE_e) {
if (fopAcM_entrySolidHeap(this, createHeapCallBack, 0x3140)) {
return 1;
} else {
if (!fopAcM_entrySolidHeap(this, createHeapCallBack, 0x3140)) {
return -1;
} else {
return 1;
}
}
return phase_state == cPhs_ERROR_e ? -1 : 0;
if (phase_state == cPhs_ERROR_e) {
return -1;
} else {
return 0;
}
}
void daTagTWGate_c::initTalk(int param_0, fopAc_ac_c** param_1) {
@@ -957,13 +1063,17 @@ bool daTagTWGate_c::talkProc(int* param_1, int param_2, fopAc_ac_c** param_3) {
}
int daTagTWGate_c::createHeapCallBack(fopAc_ac_c* i_actor) {
return ((daTagTWGate_c*)i_actor)->CreateHeap();
daTagTWGate_c* gate = static_cast<daTagTWGate_c*>(i_actor);
return gate->CreateHeap();
}
int daTagTWGate_c::CreateHeap() {
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes("TWGate_Md", 7));
J3DModelData* mdlData_p = NULL;
int var_r27 = 0;
mdlData_p = static_cast<J3DModelData*>(dComIfG_getObjectRes("TWGate_Md", 7));
JUT_ASSERT(1685, NULL != mdlData_p);
mpMorf =
new mDoExt_McaMorfSO(modelData, NULL, NULL,
new mDoExt_McaMorfSO(mdlData_p, NULL, NULL,
static_cast<J3DAnmTransform*>(dComIfG_getObjectRes("TWGate_Md", 4)),
0, 0.0f, 0, -1, NULL, 0, 0x11000084);
@@ -986,7 +1096,7 @@ int daTagTWGate_c::create() {
int phase_state;
if (dComIfGs_isDarkClearLV(l_zevParamTbl[mType].mLv)) {
phase_state = cPhs_ERROR_e;
return cPhs_ERROR_e;
} else {
phase_state = dComIfG_resLoad(&mPhaseZevArc, l_zevParamTbl[mType].mArcName);
if (phase_state == cPhs_COMPLEATE_e) {
@@ -997,36 +1107,59 @@ int daTagTWGate_c::create() {
return phase_state;
}
static int daTagTWGate_Create(fopAc_ac_c* i_actor) {
return ((daTagTWGate_c*)i_actor)->create();
}
inline daTagTWGate_c::~daTagTWGate_c() {
dComIfG_resDelete(&mPhaseZevArc, l_zevParamTbl[mType].mArcName);
if (mPhaseMdRes.id != cPhs_INIT_e) {
dComIfG_resDelete(&mPhaseMdRes, "TWGate_Md");
int daTagTWGate_c::draw() {
if (field_0x5e0 != 0) {
mpMorf->entryDL();
}
if (mPhasePyRes.id != cPhs_INIT_e) {
dComIfG_resDelete(&mPhasePyRes, mIsWolf ? "TWGate_Wf" : "TWGate_Lk");
#if DEBUG
if (attr().show_range) {
dDbVw_drawCylinderOpa(current.pos, scale.x * 100.0f, scale.y * 100.0f, (GXColor){0xff, 0xff, 0xff, 0xff}, 1);
}
}
#endif
static int daTagTWGate_Delete(daTagTWGate_c* i_gate) {
i_gate->~daTagTWGate_c();
return 1;
}
static int daTagTWGate_Execute(daTagTWGate_c* i_gate) {
return i_gate->execute();
void daTagTWGate_c::create_init() {
#if DEBUG
mHio.ct();
#endif
field_0x5e0 = 0;
setAction(ACT_WAIT);
}
static int daTagTWGate_Draw(daTagTWGate_c* i_gate) {
return i_gate->draw();
static int daTagTWGate_Create(fopAc_ac_c* i_this) {
daTagTWGate_c* gate = static_cast<daTagTWGate_c*>(i_this);
fopAcM_RegisterCreateID(i_this, "Tag_TWGate");
return gate->create();
}
static int daTagTWGate_IsDelete(daTagTWGate_c*) {
static int daTagTWGate_Delete(daTagTWGate_c* i_this) {
fopAcM_RegisterDeleteID(i_this, "Tag_TWGate");
i_this->~daTagTWGate_c();
return 1;
}
int daTagTWGate_c::execute() {
callExecute();
if (field_0x5e0 != 0) {
mpMorf->play(0, 0);
mpMorf->modelCalc();
}
return 1;
}
static int daTagTWGate_Execute(daTagTWGate_c* i_this) {
return i_this->execute();
}
static int daTagTWGate_Draw(daTagTWGate_c* i_this) {
return i_this->draw();
}
static int daTagTWGate_IsDelete(daTagTWGate_c* i_this) {
return 1;
}
+4 -1
View File
@@ -15,12 +15,15 @@ int daTagAJnot_c::create() {
}
static int daTagAJnot_Create(fopAc_ac_c* i_this) {
return static_cast<daTagAJnot_c*>(i_this)->create();
daTagAJnot_c* ajNot = static_cast<daTagAJnot_c*>(i_this);
int id = fopAcM_GetID(i_this);
return ajNot->create();
}
daTagAJnot_c::~daTagAJnot_c() {}
static int daTagAJnot_Delete(daTagAJnot_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagAJnot_c();
return 1;
}
+41 -23
View File
@@ -2,8 +2,8 @@
#include "d/actor/d_a_tag_allmato.h"
#include "d/actor/d_a_npc4.h"
#include "d/actor/d_a_obj_itamato.h"
#include "d/actor/d_a_obj_boumato.h"
#include "d/actor/d_a_obj_itamato.h"
#include "d/actor/d_a_arrow.h"
#include "f_op/f_op_camera_mng.h"
@@ -268,10 +268,14 @@ static fopAc_ac_c* l_findActorPtrs[100];
static u32 l_findCount;
void* daTag_AllMato_c::srchBouMato(void* i_actor, void* i_data) {
if (l_findCount < 100 && i_actor != NULL && i_actor != i_data) {
if (fopAcM_IsExecuting(fopAcM_GetID(i_actor)) && fopAcM_GetName(i_actor) == PROC_OBJ_BOUMATO) {
l_findActorPtrs[l_findCount] = (fopAc_ac_c*)i_actor;
l_findCount++;
void* data = i_data;
if (l_findCount < 100) {
fopAc_ac_c* actor = (fopAc_ac_c*)i_actor;
if (actor != NULL && actor != data) {
if (fopAcM_IsExecuting(fopAcM_GetID(actor)) && fopAcM_GetName(i_actor) == PROC_OBJ_BOUMATO) {
l_findActorPtrs[l_findCount] = actor;
l_findCount++;
}
}
}
@@ -279,10 +283,14 @@ void* daTag_AllMato_c::srchBouMato(void* i_actor, void* i_data) {
}
void* daTag_AllMato_c::srchItaMato(void* i_actor, void* i_data) {
if (l_findCount < 100 && i_actor != NULL && i_actor != i_data) {
if (fopAcM_IsExecuting(fopAcM_GetID(i_actor)) && fopAcM_GetName(i_actor) == PROC_OBJ_ITAMATO) {
l_findActorPtrs[l_findCount] = (fopAc_ac_c*)i_actor;
l_findCount++;
void* data = i_data;
if (l_findCount < 100) {
fopAc_ac_c* actor = (fopAc_ac_c*)i_actor;
if (actor != NULL && actor != data) {
if (fopAcM_IsExecuting(fopAcM_GetID(actor)) && fopAcM_GetName(i_actor) == PROC_OBJ_ITAMATO) {
l_findActorPtrs[l_findCount] = actor;
l_findCount++;
}
}
}
@@ -290,10 +298,14 @@ void* daTag_AllMato_c::srchItaMato(void* i_actor, void* i_data) {
}
void* daTag_AllMato_c::srchTaro(void* i_actor, void* i_data) {
if (l_findCount < 100 && i_actor != NULL && i_actor != i_data) {
if (fopAcM_IsExecuting(fopAcM_GetID(i_actor)) && fopAcM_GetName(i_actor) == PROC_NPC_TARO) {
l_findActorPtrs[l_findCount] = (fopAc_ac_c*)i_actor;
l_findCount++;
void* data = i_data;
if (l_findCount < 100) {
fopAc_ac_c* actor = (fopAc_ac_c*)i_actor;
if (actor != NULL && actor != data) {
if (fopAcM_IsExecuting(fopAcM_GetID(actor)) && fopAcM_GetName(i_actor) == PROC_NPC_TARO) {
l_findActorPtrs[l_findCount] = actor;
l_findCount++;
}
}
}
@@ -301,10 +313,14 @@ void* daTag_AllMato_c::srchTaro(void* i_actor, void* i_data) {
}
void* daTag_AllMato_c::srchArrow(void* i_actor, void* i_data) {
if (l_findCount < 100 && i_actor != NULL && i_actor != i_data) {
if (fopAcM_IsExecuting(fopAcM_GetID(i_actor)) && fopAcM_GetName(i_actor) == PROC_ARROW) {
l_findActorPtrs[l_findCount] = (fopAc_ac_c*)i_actor;
l_findCount++;
void* data = i_data;
if (l_findCount < 100) {
fopAc_ac_c* actor = (fopAc_ac_c*)i_actor;
if (actor != NULL && actor != data) {
if (fopAcM_IsExecuting(fopAcM_GetID(actor)) && fopAcM_GetName(i_actor) == PROC_ARROW) {
l_findActorPtrs[l_findCount] = actor;
l_findCount++;
}
}
}
@@ -436,11 +452,12 @@ fopAc_ac_c* daTag_AllMato_c::getTaroActorP() {
fopAc_ac_c* boumato_actor_p = NULL;
fopAc_ac_c* itamato_actor_p = NULL;
int sp14 = 0;
for (int i = 0; i < 499; i++) {
for (int j = 0; j < mBouMatoActorNum; j++) {
boumato_actor_p = mBouMatoActorMngr[j].getActorP();
if (boumato_actor_p != NULL) {
int sp14 = ((daObj_BouMato_c*)boumato_actor_p)->checkCrs(arrow_p, field_0x590[i], field_0x590[i + 1], sp94.abs() + arrow_p->getArrowOutLength());
sp14 = ((daObj_BouMato_c*)boumato_actor_p)->checkCrs(arrow_p, field_0x590[i], field_0x590[i + 1], sp94.abs() + arrow_p->getArrowOutLength());
if (sp14 != 0) {
mBrkMatoActorMngr.entry(mBouMatoActorMngr[j].getActorP());
return sp14;
@@ -451,7 +468,7 @@ fopAc_ac_c* daTag_AllMato_c::getTaroActorP() {
for (int j = 0; j < mItaMatoActorNum; j++) {
itamato_actor_p = mItaMatoActorMngr[j].getActorP();
if (itamato_actor_p != NULL) {
int sp14 = ((daObj_ItaMato_c*)itamato_actor_p)->checkCrs(arrow_p, field_0x590[i], field_0x590[i + 1], sp94.abs() + arrow_p->getArrowOutLength());
sp14 = ((daObj_ItaMato_c*)itamato_actor_p)->checkCrs(arrow_p, field_0x590[i], field_0x590[i + 1], sp94.abs() + arrow_p->getArrowOutLength());
if (sp14 != 0) {
mBrkMatoActorMngr.entry(mItaMatoActorMngr[j].getActorP());
return sp14;
@@ -466,7 +483,7 @@ fopAc_ac_c* daTag_AllMato_c::getTaroActorP() {
}
int daTag_AllMato_c::checkCrsMato2() {
fopAc_ac_c* sp28;
fopAc_ac_c* sp28 = NULL;
getArrowActorP();
for (int i = 0; i < (int)l_findCount; i++) {
@@ -499,13 +516,13 @@ int daTag_AllMato_c::checkCrsMato2() {
}
fopAc_ac_c* sp18 = NULL;
fopAc_ac_c* sp14 = NULL;
int sp14 = NULL;
for (int i = 0; i < 499; i++) {
for (int j = 0; j < mBouMatoActorNum; j++) {
sp18 = mBouMatoActorMngr[j].getActorP();
if (sp18 != NULL) {
int sp14 = ((daObj_BouMato_c*)sp18)->checkCrs(arrow_p, field_0x590[i], field_0x590[i + 1], sp80.abs() + arrow_p->getArrowOutLength());
sp14 = ((daObj_BouMato_c*)sp18)->checkCrs(arrow_p, field_0x590[i], field_0x590[i + 1], sp80.abs() + arrow_p->getArrowOutLength());
if (sp14 != 0) {
mBrkMatoActorMngr.entry(mBouMatoActorMngr[j].getActorP());
return sp14;
@@ -520,10 +537,11 @@ int daTag_AllMato_c::checkCrsMato2() {
}
int daTag_AllMato_c::checkBrkMato() {
daObj_ItaMato_c* actor_p = NULL;
int rt = 0;
for (int i = 0; i < mItaMatoActorNum; i++) {
daObj_ItaMato_c* actor_p = (daObj_ItaMato_c*)mItaMatoActorMngr[i].getActorP();
actor_p = (daObj_ItaMato_c*)mItaMatoActorMngr[i].getActorP();
rt = actor_p->checkBrk();
if (rt != 0) {
mBrkMatoActorMngr.entry(mItaMatoActorMngr[i].getActorP());
+2
View File
@@ -9,10 +9,12 @@
static int daTagArena_Create(fopAc_ac_c* i_this) {
daTagArena_c* arena_tag = (daTagArena_c*)i_this;
int id = fopAcM_GetID(i_this);
return arena_tag->create();
}
static int daTagArena_Delete(daTagArena_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagArena_c();
return 1;
}
+20
View File
@@ -7,8 +7,27 @@
#include "d/actor/d_a_tag_assistance.h"
void daTagAssist_c::create_init() {
attention_info.flags = 0;
field_0x570 = -1;
}
int daTagAssist_c::create() {
fopAcM_ct(this, daTagAssist_c);
create_init();
return cPhs_COMPLEATE_e;
}
int daTagAssist_c::execute() {
if (fopAcM_searchPlayerDistanceXZ(this) < scale.x * 100.0f) {
// empty block
}
return 1;
}
static int daTagAssist_Create(fopAc_ac_c* i_this) {
daTagAssist_c* tag_assist = (daTagAssist_c*)i_this;
int id = fopAcM_GetID(i_this);
return tag_assist->create();
}
@@ -21,6 +40,7 @@ static int daTagAssist_IsDelete(daTagAssist_c* i_this) {
}
static int daTagAssist_Delete(daTagAssist_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagAssist_c();
return 1;
}
+71 -16
View File
@@ -1,13 +1,24 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_attack_item.h"
#include "SSystem/SComponent/c_math.h"
#include "d/actor/d_a_player.h"
#include "d/d_debug_viewer.h"
void daTagAtkItem_c::setBaseMtx() {
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
}
class daTagAtkItem_HIO_c : public mDoHIO_entry_c {
public:
daTagAtkItem_HIO_c();
void genMessage(JORMContext*);
f32 field_0x8;
u8 show_range;
};
#if DEBUG
daTagAtkItem_HIO_c l_HIO;
#endif
static dCcD_SrcCyl l_cyl_src = {
{
@@ -17,14 +28,28 @@ static dCcD_SrcCyl l_cyl_src = {
{0x0}, // mGObjCo
}, // mObjInf
{
{
{0.0f, 0.0f, 0.0f}, // mCenter
50.0f, // mRadius
100.0f // mHeight
} // mCyl
{
{0.0f, 0.0f, 0.0f}, // mCenter
50.0f, // mRadius
100.0f // mHeight
} // mCyl
}
};
#if DEBUG
void daTagAtkItem_HIO_c::genMessage(JORMContext* ctx) {
// "Attack reaction item"
ctx->genLabel("攻撃反応アイテム", 0);
// "Show range"
ctx->genCheckBox("範囲表示", &show_range, 1);
}
#endif
void daTagAtkItem_c::setBaseMtx() {
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
}
int daTagAtkItem_c::Create() {
mCcStts.Init(0, 0xFF, this);
mCyl.Set(l_cyl_src);
@@ -36,6 +61,11 @@ int daTagAtkItem_c::Create() {
return 1;
}
daTagAtkItem_HIO_c::daTagAtkItem_HIO_c() {
field_0x8 = 0.0f;
show_range = 0;
}
int daTagAtkItem_c::create() {
fopAcM_ct(this, daTagAtkItem_c);
@@ -44,6 +74,11 @@ int daTagAtkItem_c::create() {
}
OS_REPORT("攻撃反応アイテム:<%x>\n", fopAcM_GetParam(this));
#if DEBUG
l_HIO.entryHIO("攻撃反応アイテム");
#endif
return cPhs_COMPLEATE_e;
}
@@ -108,12 +143,7 @@ BOOL daTagAtkItem_c::checkHit() {
void daTagAtkItem_c::createItem() {
csXyz angle(0, 0, 0);
int create_num;
if (getNum() == 0xFF) {
create_num = 1;
} else {
create_num = getNum();
}
int create_num = getNum() == 0xFF ? 1 : getNum();
int item_bit = getItemBit();
for (int i = 0; i < create_num; i++) {
@@ -128,19 +158,40 @@ void daTagAtkItem_c::createItem() {
}
}
int daTagAtkItem_c::_delete() {
int daTagAtkItem_c::draw() {
#if DEBUG
if (l_HIO.show_range) {
GXColor color = (GXColor){0, 0, 0xff, 0x80};
dDbVw_drawCylinderXlu(current.pos, scale.x * 50.0f, scale.y * 100.0f, color, 1);
}
#endif
return 1;
}
int daTagAtkItem_c::_delete() {
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
static int daTagAtkItem_Draw(daTagAtkItem_c* i_this) {
return i_this->draw();
}
static int daTagAtkItem_Execute(daTagAtkItem_c* i_this) {
return i_this->execute();
}
static int daTagAtkItem_Delete(daTagAtkItem_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static int daTagAtkItem_Create(daTagAtkItem_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->create();
}
@@ -149,7 +200,11 @@ static actor_method_class l_daTagAtkItem_Method = {
(process_method_func)daTagAtkItem_Delete,
(process_method_func)daTagAtkItem_Execute,
(process_method_func)NULL,
#if DEBUG
(process_method_func)daTagAtkItem_Draw,
#else
(process_method_func)NULL,
#endif
};
actor_process_profile_definition g_profile_Tag_AttackItem = {
+143 -4
View File
@@ -6,12 +6,98 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_attention.h"
#include "d/actor/d_a_player.h"
static const u8 l_dist_tbl[] = { 0x23, 0x24 };
#include "d/actor/d_a_player.h"
#include "d/d_debug_viewer.h"
#if DEBUG
daAttp_HIO_c l_HIO;
void daAttp_HIO_c::genMessage(JORMContext* ctx) {
static const char* l_type_name[37] = {
"注目なし - ダミー", // No focus - dummy
"注目だけ - 標準", // Focus only - standard
"会話 - 標準", // Conversation - standard
"戦闘 - 標準", // Combat - standard
"戦闘B - 標準", // Combat B - standard
"会話B - 標準", // Conversation B - standard
"持上げ - 標準", // Lifting - standard
"持上げ - タル", // Lifting - barrel
"持上げ - 壷大", // Lifting - large jar
"持上げ - 水壷", // Lifting - water jar
"持上げ - 椅子", // Lifting - chair
"持上げ - 小石", // Lifting - pebble
"持上げ - 岩", // Lifting - rock
"", // Horse
"ドア、宝箱", // Door, treasure chest
"持上げボコの棒", // Lifting stick
"敵氷", // Enemy ice
"引き連れられ石像", // Dragged stone statue
"引き連れられ石像", // Dragged stone statue
"ジャガ-", // Jaguar
"接近会話", // Close-range conversation
"長距離戦闘", // Long-range combat
"短距離戦闘", // Short-range combat
"予備戦闘", // Reserve combat
"予備戦闘", // Reserve combat
"予備戦闘", // Reserve combat
"床レバー用", // Floor lever
"狼鎖", // Wolf chain
"NPCナビィ - ハイラル城、呼びかけデモ用(会話)", // NPC Navii - Hyrule Castle, demo call (conversation)
"NPCナビィ - ハイラル城、呼びかけデモ用(注目)", // NPC Navii - Hyrule Castle, demo call (focus)
"狼掘る", // Wolf digging
"カヌー", // Canoe
"覗きタグ", // Peek tag
"馬戦闘", // Horse combat
"注目点 通常長さ", // Focus point - normal length
"注目点 長注目版", // Focus point - long focus
"調整用カスタム", // Adjustment custom
};
static const u8 l_type[37] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37,
};
static const int num = 37;
// "Focus point"
ctx->genLabel("注目点", 0, 0, NULL, -1, -1, 0x200, 0x18);
// "Type switching ON"
ctx->genCheckBox("タイプ切り替えON", &enable_type_switching, 1, 0, NULL, -1, -1, 0x200, 0x18);
// "Type specification"
ctx->startComboBox("タイプ指定", &type_spec, 0, NULL, -1, -1, 0x100, 0x1a);
for (int i = 0; i < num; i++) {
ctx->genComboBoxItem(l_type_name[i], l_type[i]);
}
ctx->endComboBox();
// "Distance display ON"
ctx->genCheckBox("距離表示ON", &enable_distance_display, 1, 0, NULL, -1, -1, 0x200, 0x18);
// "For adjustment"
ctx->genLabel("調整用", 0, 0, NULL, -1, -1, 0x200, 0x18);
ctx->genSlider("on", &dist_max, 0.0f, 10000.0f, 0, NULL, -1, -1, 0x200, 0x18);
ctx->genSlider("off", &dist_max_release, 0.0f, 10000.0f, 0, NULL, -1, -1, 0x200, 0x18);
ctx->genSlider("angle adjust", &dist_adjust, 0.0f, 10000.0f, 0, NULL, -1, -1, 0x200, 0x18);
ctx->genSlider("hi", &upper_y, -10000.0f, 10000.0f, 0, NULL, -1, -1, 0x200, 0x18);
ctx->genSlider("low", &lower_y, -10000.0f, 10000.0f, 0, NULL, -1, -1, 0x200, 0x18);
}
#endif
int daAttp_c::Create() {
attention_info.distances[fopAc_attn_LOCK_e] = l_dist_tbl[daAttp_prm::getArg4(this)];
static const u8 l_dist_tbl[] = { 35, 36 };
u8 arg4 = daAttp_prm::getArg4(this);
attention_info.distances[fopAc_attn_LOCK_e] = l_dist_tbl[arg4];
#if DEBUG
field_0x598 = l_dist_tbl[arg4];
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
cMtx_copy(mDoMtx_stack_c::get(), field_0x568);
fopAcM_SetMtx(this, field_0x568);
#endif
execute();
return 1;
@@ -20,10 +106,31 @@ int daAttp_c::Create() {
int daAttp_c::create() {
fopAcM_ct(this, daAttp_c);
Create();
#if DEBUG
// "Key points"
l_HIO.entryHIO("注目点");
#endif
return cPhs_COMPLEATE_e;
}
int daAttp_c::execute() {
#if DEBUG
if (l_HIO.enable_type_switching) {
attention_info.distances[fopAc_attn_LOCK_e] = l_HIO.type_spec;
} else {
attention_info.distances[fopAc_attn_LOCK_e] = field_0x598;
}
dist_entry& distTable = dAttention_c::getDistTable(37);
distTable.mDistMax = l_HIO.dist_max;
distTable.mDistMaxRelease = l_HIO.dist_max_release;
distTable.mDistanceAdjust = l_HIO.dist_adjust;
distTable.mUpperY = l_HIO.upper_y;
distTable.mLowerY = l_HIO.lower_y;
#endif
bool bVar1 = true;
fopAc_ac_c& link = *daPy_getPlayerActorClass();
@@ -58,6 +165,7 @@ int daAttp_c::execute() {
}
break;
default:
JUT_ASSERT(432, FALSE);
break;
case 7:
break;
@@ -80,6 +188,8 @@ int daAttp_c::execute() {
case 3:
bVar1 = false;
break;
default:
JUT_ASSERT(461, FALSE);
}
} else {
switch (daAttp_prm::getArg0(this)) {
@@ -97,6 +207,9 @@ int daAttp_c::execute() {
break;
case 3:
bVar1 = false;
break;
default:
JUT_ASSERT(485, FALSE);
}
if (daAttp_prm::getSw2(this) != 0xff) {
@@ -120,13 +233,36 @@ int daAttp_c::execute() {
}
int daAttp_c::draw() {
#if DEBUG
if (l_HIO.enable_distance_display) {
GXColor color1 = {0xff, 0, 0, 0x80};
GXColor color2 = {0, 0, 0xff, 0x80};
cXyz sp10(current.pos);
sp10.y += 5.0f;
dist_entry& distTable =
dAttention_c::getDistTable(attention_info.distances[fopAc_attn_LOCK_e]);
dDbVw_drawCircleXlu(current.pos, distTable.mDistMax, color2, 1, 12);
dDbVw_drawCircleXlu(current.pos, distTable.mDistMaxRelease, color1, 1, 12);
}
#endif
return 1;
}
int daAttp_c::_delete() {
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
daAttp_HIO_c::daAttp_HIO_c() {
type_spec = 0;
dist_max = dist_max_release = dist_adjust = upper_y = lower_y = 0.0f;
}
static int daAttp_Draw(daAttp_c* i_this) {
return i_this->draw();
}
@@ -137,11 +273,14 @@ static int daAttp_Execute(daAttp_c* i_this) {
}
static int daAttp_Delete(daAttp_c* i_this) {
fpc_ProcID id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static int daAttp_Create(fopAc_ac_c* i_this) {
return static_cast<daAttp_c*>(i_this)->create();
daAttp_c* attp = static_cast<daAttp_c*>(i_this);
fpc_ProcID id = fopAcM_GetID(i_this);
return attp->create();
}
static actor_method_class l_daAttp_Method = {
+27 -28
View File
@@ -5,34 +5,32 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_player.h"
#include "d/actor/d_a_tag_bottle_item.h"
#include "d/d_item.h"
#include "d/actor/d_a_player.h"
#include "d/d_procname.h"
#include "d/d_s_play.h"
s32 daTag_BottleItem_c::create() {
s32 ret;
int daTag_BottleItem_c::create() {
fopAcM_ct(this, daTag_BottleItem_c);
setTypeFromParam();
if (!isBottleItem(mBottleItemType)) {
ret = cPhs_ERROR_e;
} else {
initialize();
ret = cPhs_COMPLEATE_e;
return cPhs_ERROR_e;
}
return ret;
initialize();
return cPhs_COMPLEATE_e;
}
s32 daTag_BottleItem_c::Delete() {
int daTag_BottleItem_c::Delete() {
return 1;
}
s32 daTag_BottleItem_c::Execute() {
if (chkEvent()) {
int daTag_BottleItem_c::Execute() {
int eventResult = chkEvent();
if (eventResult) {
if (mProcessFunc) {
(this->*mProcessFunc)(0);
}
@@ -43,7 +41,7 @@ s32 daTag_BottleItem_c::Execute() {
return 1;
}
s32 daTag_BottleItem_c::Draw() {
int daTag_BottleItem_c::Draw() {
return 1;
}
@@ -72,26 +70,26 @@ int daTag_BottleItem_c::checkProcess(ProcessFunc i_processFunc) {
}
int daTag_BottleItem_c::setProcess(ProcessFunc i_processFunc) {
int uVar3 = 0;
int retval = 0;
if (checkProcess(i_processFunc)) {
return 0;
return retval;
} else {
mEventType = 2;
if (mProcessFunc) {
uVar3 = (this->*mProcessFunc)(0);
retval = (this->*mProcessFunc)(0);
}
mEventType = 0;
mProcessFunc = i_processFunc;
if (mProcessFunc) {
uVar3 = (this->*mProcessFunc)(0);
retval = (this->*mProcessFunc)(0);
}
mEventType = 1;
}
return uVar3;
return retval;
}
void daTag_BottleItem_c::setAttnPos() {
@@ -99,8 +97,8 @@ void daTag_BottleItem_c::setAttnPos() {
eyePos = current.pos;
}
s32 daTag_BottleItem_c::chkEvent() {
s32 uVar2 = 1;
int daTag_BottleItem_c::chkEvent() {
int uVar2 = 1;
if (!dComIfGp_getEvent()->isOrderOK()) {
uVar2 = 0;
@@ -112,7 +110,7 @@ s32 daTag_BottleItem_c::chkEvent() {
return uVar2;
}
s32 daTag_BottleItem_c::orderEvent() {
int daTag_BottleItem_c::orderEvent() {
makeSoup();
if (!daPy_py_c::checkNowWolf() && mBottleItemType != fpcNm_ITEM_EMPTY_BOTTLE) {
@@ -150,8 +148,9 @@ int daTag_BottleItem_c::wait(void* param_0) {
if (eventInfo.checkCommandCatch() == 0){
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz pos = attention_info.position - player->attention_info.position;
dComIfGp_att_CatchRequest(this,mBottleItemType,140.0f,pos.y+100.0f,pos.y-100.0f,0x2000,1);
dComIfGp_att_CatchRequest(this, mBottleItemType, 140.0f + YREG_F(4), pos.y + 100.0f,
pos.y - 100.0f, 0x2000 + YREG_S(5), 1);
eventInfo.onCondition(dEvtCnd_40_e);
}
case 2:
@@ -162,23 +161,23 @@ int daTag_BottleItem_c::wait(void* param_0) {
return 1;
}
static s32 daTag_BottleItem_Create(void* i_this) {
static int daTag_BottleItem_Create(void* i_this) {
return static_cast<daTag_BottleItem_c*>(i_this)->create();
}
static s32 daTag_BottleItem_Delete(void* i_this) {
static int daTag_BottleItem_Delete(void* i_this) {
return static_cast<daTag_BottleItem_c*>(i_this)->Delete();
}
static s32 daTag_BottleItem_Execute(void* i_this) {
static int daTag_BottleItem_Execute(void* i_this) {
return static_cast<daTag_BottleItem_c*>(i_this)->Execute();
}
static s32 daTag_BottleItem_Draw(void* i_this) {
static int daTag_BottleItem_Draw(void* i_this) {
return static_cast<daTag_BottleItem_c*>(i_this)->Draw();
}
static s32 daTag_BottleItem_IsDelete(void* i_this) {
static int daTag_BottleItem_IsDelete(void* i_this) {
return 1;
}
+42 -9
View File
@@ -1,10 +1,12 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_camera.h"
#include <cmath>
#include "d/actor/d_a_alink.h"
#include "d/d_com_inf_game.h"
#include "d/actor/d_a_horse.h"
#include "d/actor/d_a_tag_camera.h"
#include "d/d_com_inf_game.h"
#include "d/d_debug_viewer.h"
#include "d/d_s_play.h"
namespace {
bool always_true() {
@@ -107,19 +109,19 @@ u8 daTag_Cam_c::getSwType() {
}
u8 daTag_Cam_c::getPrio() {
return (fopAcM_GetParam(this) >> 4) & 0xF;
return (fopAcM_GetParam(this) & 0xF0) >> 4;
}
u8 daTag_Cam_c::getSwBit() {
return (fopAcM_GetParam(this) >> 8) & 0xFF;
return (fopAcM_GetParam(this) & 0xFF00) >> 8;
}
u8 daTag_Cam_c::getCondition() {
return (fopAcM_GetParam(this) >> 0x10) & 0xFF;
return (fopAcM_GetParam(this) & 0xFF0000) >> 16;
}
u8 daTag_Cam_c::getCameraId() {
return (fopAcM_GetParam(this) >> 0x18) & 0xFF;
return (fopAcM_GetParam(this) & 0xFF000000) >> 24;
}
u8 daTag_Cam_c::getRailID() {
@@ -184,8 +186,10 @@ int daTag_Cam_c::create() {
is_player_hugging_eal,
};
int var_r27 = 22;
u8 func_index = getCondition();
if ((int)func_index > 22) {
if ((int)func_index > var_r27) {
func_index = 3;
}
@@ -251,7 +255,11 @@ int daTag_Cam_c::execute() {
bool set_camera = mCheckFunc();
if (condition == 0xFF) {
#if PLATFORM_SHIELD
priority |= (u16)0x8000;
#else
priority |= 0x8000;
#endif
} else if (condition == 0xFA) {
if (dCam_getBody()->CheckFlag(0x8000000)) {
set_camera = true;
@@ -269,6 +277,28 @@ int daTag_Cam_c::execute() {
}
static int daTag_Cam_Draw(daTag_Cam_c* i_this) {
#if DEBUG
return i_this->draw();
#else
return 1;
#endif
}
int daTag_Cam_c::draw() {
#if DEBUG
if (g_envHIO.mOther.mDisplayTransparentCyl != 0) {
if (getAreaType() == 0) {
cXyz sp3C = (mBoundsHi - mBoundsLo) * 0.5f;
cXyz sp30 = mBoundsLo + sp3C;
csXyz sp10(0, 0, 0);
dDbVw_drawCubeXlu(sp30, sp3C, sp10, (GXColor){0xc0, 0xff, 0x78, 0xa0});
} else {
cXyz cStack_3c = current.pos;
dDbVw_drawCylinderXlu(cStack_3c, scale.x, scale.y, (GXColor){0xc0, 0xff, 0x78, 0xa0},
1);
}
}
#endif
return 1;
}
@@ -282,13 +312,16 @@ static int daTag_Cam_IsDelete(daTag_Cam_c* i_this) {
}
static int daTag_Cam_Delete(daTag_Cam_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTag_Cam_c();
return 1;
}
static int daTag_Cam_Create(fopAc_ac_c* i_this) {
daTag_Cam_c* a_this = (daTag_Cam_c*)i_this;
return a_this->create();
daTag_Cam_c* cam = (daTag_Cam_c*)i_this;
int id = fopAcM_GetID(i_this);
int result = cam->create();
return result;
}
static actor_method_class l_daTag_Cam_Method = {
+97 -14
View File
@@ -6,9 +6,35 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_chgrestart.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
s32 daTagChgRestart_c::Create() {
class daTagChgRestart_HIO_c : public mDoHIO_entry_c {
public:
daTagChgRestart_HIO_c();
void genMessage(JORMContext* ctx);
u8 show_range;
};
#if DEBUG
daTagChgRestart_HIO_c l_HIO;
daTagChgRestart_HIO_c::daTagChgRestart_HIO_c() {
show_range = FALSE;
}
void daTagChgRestart_HIO_c::genMessage(JORMContext* ctx) {
// "Room return position change tag"
ctx->genLabel("部屋戻し位置変更タグ", 0);
// "Display range"
ctx->genCheckBox("範囲表示", &show_range, 1);
}
#endif
int daTagChgRestart_c::Create() {
mVertices[0].x = -100.0f * scale.x;
mVertices[0].z = -100.0f * scale.z;
@@ -21,25 +47,27 @@ s32 daTagChgRestart_c::Create() {
mVertices[3].x = -100.0f * scale.x;
mVertices[3].z = 100.0f * scale.z;
mVertices[3].y = 0.0f;
mVertices[2].y = 0.0f;
mVertices[1].y = 0.0f;
mVertices[0].y = 0.0f;
mVertices[0].y = mVertices[1].y = mVertices[2].y = mVertices[3].y = 0.0f;
return 1;
}
s32 daTagChgRestart_c::create() {
int daTagChgRestart_c::create() {
fopAcM_ct(this, daTagChgRestart_c);
if (!Create()) {
return cPhs_ERROR_e;
}
#if DEBUG
// "Room return position change tag"
l_HIO.entryHIO("部屋戻し位置変更タグ");
#endif
return cPhs_COMPLEATE_e;
}
s32 daTagChgRestart_c::execute() {
int daTagChgRestart_c::execute() {
if (fopAcM_isSwitch(this, daTagChgRestart_prm::getSwNo(this))) {
return 1;
}
@@ -59,11 +87,13 @@ s32 daTagChgRestart_c::execute() {
u8 playerNo = daTagChgRestart_prm::getPlayerNo(this);
if (playerNo != 0xFF) {
dStage_roomDt_c* roomDt = dComIfGp_roomControl_getStatusRoomDt(fopAcM_GetRoomNo(this));
int roomNo = fopAcM_GetRoomNo(this);
dStage_roomDt_c* roomDt = dComIfGp_roomControl_getStatusRoomDt(roomNo);
stage_actor_class* player_data = roomDt->getPlayer();
stage_actor_data_class* entry_p = player_data->m_entries;
for (int i = 0; i < player_data->num; i++) {
int i = 0;
for (i = 0; i < player_data->num; i++) {
if ((entry_p->base.angle.z & 0xFF) == playerNo) {
break;
}
@@ -71,6 +101,11 @@ s32 daTagChgRestart_c::execute() {
entry_p++;
}
if (i == player_data->num) {
OS_REPORT_ERROR("部屋戻し位置変更の為のプレイヤー番号が不正です!<%d>\n", i);
JUT_ASSERT(317, FALSE);
}
restart_pos = entry_p->base.position;
restart_angle = entry_p->base.angle.y;
}
@@ -82,26 +117,74 @@ s32 daTagChgRestart_c::execute() {
return 1;
}
s32 daTagChgRestart_c::_delete() {
int daTagChgRestart_c::draw() {
#if DEBUG
if (l_HIO.show_range) {
GXColor color = {0, 0, 0x80, 0x80};
cXyz sp10[8];
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
sp10[0] = mVertices[0];
sp10[1] = mVertices[1];
sp10[2] = mVertices[3];
sp10[3] = mVertices[2];
sp10[4] = mVertices[0];
sp10[5] = mVertices[1];
sp10[6] = mVertices[3];
sp10[7] = mVertices[2];
for (int i = 0; i < 8; i++) {
mDoMtx_stack_c::multVec(&sp10[i], &sp10[i]);
}
for (int i = 0; i < 4; i++) {
sp10[i].y += 1000.0f;
}
dDbVw_drawCube8pXlu(sp10, color);
}
#endif
return 1;
}
static s32 daTagChgRestart_Execute(daTagChgRestart_c* i_this) {
int daTagChgRestart_c::_delete() {
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
static int daTagChgRestart_Execute(daTagChgRestart_c* i_this) {
return i_this->execute();
}
static s32 daTagChgRestart_Delete(daTagChgRestart_c* i_this) {
static int daTagChgRestart_Delete(daTagChgRestart_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static s32 daTagChgRestart_Create(fopAc_ac_c* i_this) {
return static_cast<daTagChgRestart_c*>(i_this)->create();
static int daTagChgRestart_Create(fopAc_ac_c* i_this) {
daTagChgRestart_c* chgRestart = static_cast<daTagChgRestart_c*>(i_this);
int id = fopAcM_GetID(i_this);
return chgRestart->create();
}
static int daTagChgRestart_Draw(daTagChgRestart_c* i_this) {
return i_this->draw();
}
static actor_method_class l_daTagChgRestart_Method = {
(process_method_func)daTagChgRestart_Create,
(process_method_func)daTagChgRestart_Delete,
(process_method_func)daTagChgRestart_Execute,
NULL,
#if DEBUG
(process_method_func)daTagChgRestart_Draw,
#else
NULL,
#endif
};
actor_process_profile_definition g_profile_Tag_ChgRestart = {
+44 -11
View File
@@ -7,7 +7,10 @@
#include "d/actor/d_a_tag_chkpoint.h"
#include <cmath>
#include "d/actor/d_a_player.h"
#include "d/d_debug_viewer.h"
#include "d/d_s_play.h"
int daTag_Chk_c::execute() {
if (fopAcM_GetRoomNo(this) != dComIfGp_roomControl_getStayNo()) {
@@ -32,10 +35,10 @@ int daTag_Chk_c::execute() {
var_r27 = 2;
}
u8 swbit2 = getSwBit2();
if (swbit2 == 0xFF) {
swbit = getSwBit2();
if (swbit == 0xFF) {
var_r26 = 0;
} else if (dComIfGs_isSwitch(swbit2, fopAcM_GetRoomNo(this))) {
} else if (dComIfGs_isSwitch(swbit, fopAcM_GetRoomNo(this))) {
var_r26 = 1;
} else {
var_r26 = 2;
@@ -44,20 +47,22 @@ int daTag_Chk_c::execute() {
bool set_attention = false;
if (sp64[var_r27][var_r26] != 0) {
cXyz& player_pos = dComIfGp_getLinkPlayer()->current.pos;
daPy_py_c* player = dComIfGp_getLinkPlayer();
if (getAreaType() == 0) {
if (mVtxA.x <= player_pos.x && player_pos.x <= mVtxB.x && mVtxA.y <= player_pos.y &&
player_pos.y <= mVtxB.y && mVtxA.z <= player_pos.z && player_pos.z <= mVtxB.z)
if (mVtxA.x <= player->current.pos.x && player->current.pos.x <= mVtxB.x &&
mVtxA.y <= player->current.pos.y && player->current.pos.y <= mVtxB.y &&
mVtxA.z <= player->current.pos.z && player->current.pos.z <= mVtxB.z)
{
set_attention = true;
}
} else {
f32 x_dist = current.pos.x - player_pos.x;
f32 z_dist = current.pos.z - player_pos.z;
f32 x_dist = current.pos.x - player->current.pos.x;
f32 z_dist = current.pos.z - player->current.pos.z;
if (std::sqrt(x_dist * x_dist + z_dist * z_dist) < scale.x && mVtxA.y <= player_pos.y &&
player_pos.y <= mVtxB.y)
f32 var_f29 = std::sqrt(x_dist * x_dist + z_dist * z_dist);
if (var_f29 < scale.x && mVtxA.y <= player->current.pos.y &&
player->current.pos.y <= mVtxB.y)
{
set_attention = true;
}
@@ -75,6 +80,30 @@ int daTag_Chk_c::execute() {
}
static int daTag_Chk_Draw(daTag_Chk_c* i_this) {
#if DEBUG
return i_this->draw();
#else
return 1;
#endif
}
int daTag_Chk_c::draw() {
#if DEBUG
if (g_envHIO.mOther.mDisplayTransparentCyl) {
if (getAreaType() == 0) {
cXyz sp40 = (mVtxB - mVtxA) * 0.5f;
cXyz sp34 = mVtxA + sp40;
csXyz sp14(0,0,0);
dDbVw_drawCubeXlu(sp34, sp40, sp14,(GXColor){0xc0, 0x78, 0xff, 0xa0});
} else {
cXyz sp28 = current.pos;
dDbVw_drawCylinderXlu(sp28, scale.x, scale.y, (GXColor){0xc0, 0x78, 0xff, 0xa0}, 1);
}
}
if (g_envHIO.mOther.mDisplayTransparentCyl) {
dDbVw_drawSphereXlu(attention_info.position, 20.0f, (GXColor){0xc0, 0x78, 0xff, 0xc0}, 1);
}
#endif
return 1;
}
@@ -88,12 +117,16 @@ static int daTag_Chk_IsDelete(daTag_Chk_c* i_this) {
}
static int daTag_Chk_Delete(daTag_Chk_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTag_Chk_c();
return 1;
}
static int daTag_Chk_Create(fopAc_ac_c* i_this) {
return static_cast<daTag_Chk_c*>(i_this)->create();
daTag_Chk_c* chk = static_cast<daTag_Chk_c*>(i_this);
int id = fopAcM_GetID(i_this);
int result = chk->create();
return result;
}
static actor_method_class l_daTag_Chk_Method = {
+100 -60
View File
@@ -10,10 +10,36 @@
#include "d/d_com_inf_game.h"
#include "d/d_bg_w.h"
class daTagCsw_HIO_c : public mDoHIO_entry_c {
public:
daTagCsw_HIO_c();
void genMessage(JORMContext*);
f32 field_0x8;
};
static const char* l_arcName = "Lv6Warp";
#pragma push
#pragma force_active on
static int const l_bmd_idx[2] = {5, 6};
static int const l_brk_idx[2] = {9, 10};
static int const l_dbz_idx[2] = {13, 14};
#if DEBUG
static daTagCsw_HIO_c l_HIO;
daTagCsw_HIO_c::daTagCsw_HIO_c() {
field_0x8 = 5.0f;
}
void daTagCsw_HIO_c::genMessage(JORMContext* ctx) {
ctx->genLabel("石像ワープ", 0);
ctx->genSlider("上昇速度", &field_0x8, 0.0f, 30.0f);
}
#endif
static dCcD_SrcCyl l_cyl_src = {
{
{0x0, {{0x0, 0x0, 0x0}, {0xffffffff, 0x0}, 0x19}}, // mObj
@@ -22,17 +48,14 @@ static dCcD_SrcCyl l_cyl_src = {
{0x0}, // mGObjCo
}, // mObjInf
{
{
{0.0f, 0.0f, 0.0f}, // mCenter
300.0f, // mRadius
600.0f // mHeight
} // mCyl
{
{0.0f, 0.0f, 0.0f}, // mCenter
300.0f, // mRadius
600.0f // mHeight
} // mCyl
} // mCylAttr
};
#pragma pop
#pragma push
#pragma force_active on
static dCcD_SrcCyl l_tg_src = {
{
{0x0, {{0x0, 0x0, 0x0}, {0x400000, 0x11}, 0x0}}, // mObj
@@ -41,29 +64,16 @@ static dCcD_SrcCyl l_tg_src = {
{0x0}, // mGObjCo
}, // mObjInf
{
{
{0.0f, 0.0f, 0.0f}, // mCenter
300.0f, // mRadius
600.0f // mHeight
} // mCyl
{
{0.0f, 0.0f, 0.0f}, // mCenter
300.0f, // mRadius
600.0f // mHeight
} // mCyl
} // mCylAttr
};
#pragma pop
daTagCsw_c::~daTagCsw_c() {}
static u8 const l_bmd_idx[8] = {
0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06,
};
static u8 const l_brk_idx[8] = {
0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A,
};
static u8 const l_dbz_idx[8] = {
0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E,
};
void daTagCsw_c::setMtx() {
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::YrotM(current.angle.y);
@@ -164,14 +174,13 @@ static int daTagCsw_c_createHeap(fopAc_ac_c* i_this) {
int daTagCsw_c::chkInsideStatueStart() {
bool rv = false;
bool var_r29;
if (fopAcM_isSwitch(this, getSw())) {
bool bVar1 = true;
if (getSw() != 10) {
if (fopAcM_isSwitch(this, getSw() + 1)) {
bVar1 = false;
}
var_r29 = true;
if (getSw() != 10 && fopAcM_isSwitch(this, getSw() + 1)) {
var_r29 = false;
}
if (bVar1) {
if (var_r29) {
rv = true;
}
}
@@ -180,6 +189,14 @@ int daTagCsw_c::chkInsideStatueStart() {
int daTagCsw_c::create() {
fopAcM_ct(this, daTagCsw_c);
if (getSw() < 0 || getSw() > 10) {
// "Stone statue warp tag: Switch bit is out of range:
// Please use a save bit within the range (%d~%d)"
OS_REPORT_ERROR("石像ワープタグ:スイッチビットが範囲外:%dセーブビット(%d~%d)でお願いします。\n",
getSw(), 0, 10);
}
field_0x570 = getType();
int rv = dComIfG_resLoad(this, l_arcName);
if (rv == cPhs_COMPLEATE_e) {
@@ -191,7 +208,11 @@ int daTagCsw_c::create() {
field_0x624 = 500.0f;
} else if (chkInsideStatueStart()) {
field_0x624 = 0.0f;
#if DEBUG
field_0x628 = l_HIO.field_0x8;
#else
field_0x628 = 5.0f;
#endif
if (getSw2() != 0xff) {
fopAcM_onSwitch(this, getSw2());
}
@@ -225,24 +246,27 @@ int daTagCsw_c::create() {
return rv;
}
static void* searchTagCswOut(void* param_1, void* param_2) {
if (param_1 != NULL && fopAcM_IsActor(param_1) && fopAcM_GetProfName(param_1) == PROC_TAG_CSW &&
static_cast<daTagCsw_c*>(param_1)->getType() == 1)
{
if (static_cast<daTagCsw_c*>(param_1)->getSw() ==
static_cast<daTagCsw_c*>(param_2)->getSw())
{
return param_1;
static void* searchTagCswOut(void* param_0, void* param_1) {
UNUSED(param_1);
if (param_0 != NULL && fopAcM_IsActor(param_0) && fopAcM_GetProfName(param_0) == PROC_TAG_CSW) {
daTagCsw_c* csw1 = static_cast<daTagCsw_c*>(param_0);
daTagCsw_c* csw2 = static_cast<daTagCsw_c*>(param_1);
if (csw1->getType() == 1) {
if (csw1->getSw() == csw2->getSw()) {
return param_0;
}
}
}
return NULL;
}
static void* searchCStatue(void* param_1, void* param_2) {
if (param_1 != NULL && fopAcM_IsActor(param_1) && fopAcM_GetProfName(param_1) == PROC_CSTATUE &&
static_cast<daCstatue_c*>(param_1)->checkNormalType())
{
return param_1;
static void* searchCStatue(void* param_0, void* param_1) {
UNUSED(param_1);
if (param_0 != NULL && fopAcM_IsActor(param_0) && fopAcM_GetProfName(param_0) == PROC_CSTATUE) {
daCstatue_c* cstatue = static_cast<daCstatue_c*>(param_0);
if (cstatue->checkNormalType()) {
return param_0;
}
}
return NULL;
}
@@ -283,11 +307,14 @@ void daTagCsw_c::offLight() {
int daTagCsw_c::execute() {
bool bVar3 = false;
daCstatue_c* statue = (daCstatue_c*)fopAcM_Search(searchCStatue, this);
if (statue != NULL && statue->current.pos.absXZ(current.pos) < 75.0f &&
statue->current.pos.y > current.pos.y - 30.0f &&
statue->current.pos.y < current.pos.y + 200.0f)
{
bVar3 = true;
if (statue != NULL) {
f32 dist = statue->current.pos.absXZ(current.pos);
if (dist < 75.0f &&
statue->current.pos.y > current.pos.y - 30.0f &&
statue->current.pos.y < current.pos.y + 200.0f)
{
bVar3 = true;
}
}
if (field_0x570 == 0) {
if (bVar3) {
@@ -302,7 +329,11 @@ int daTagCsw_c::execute() {
if (cM3d_IsZero(field_0x628) && getSw2() != 0xff) {
fopAcM_onSwitch(this, getSw2());
}
#if DEBUG
field_0x628 = -l_HIO.field_0x8;
#else
field_0x628 = -5.0f;
#endif
if (!field_0x588->ChkUsed()) {
dComIfG_Bgsp().Regist(field_0x588, this);
field_0x5ec = 0;
@@ -342,14 +373,14 @@ int daTagCsw_c::execute() {
}
}
if (field_0x570 == 0 && getSw() == 6 && field_0x8e2 != 0) {
s16 angleDiff = (current.angle.y - statue->current.angle.y);
s16 sVar4 = angleDiff / field_0x8e2;
if (sVar4 > 0x800) {
statue->current.angle.y += 0x800;
} else if (sVar4 < -0x800) {
statue->current.angle.y -= 0x800;
s16 sp0A = current.angle.y - statue->current.angle.y;
sp0A /= field_0x8e2;
if (sp0A > 0x800) {
statue->current.angle.y += (s16)0x800;
} else if (sp0A < -0x800) {
statue->current.angle.y -= (s16)0x800;
} else {
statue->current.angle.y += sVar4;
statue->current.angle.y += sp0A;
}
statue->shape_angle.y = statue->current.angle.y;
onLight();
@@ -357,7 +388,11 @@ int daTagCsw_c::execute() {
}
if (!bVar3 && field_0x624 == 0.0f) {
if (fopAcM_isSwitch(this, getSw())) {
#if DEBUG
field_0x628 = l_HIO.field_0x8;
#else
field_0x628 = 5.0f;
#endif
}
}
} else {
@@ -365,7 +400,11 @@ int daTagCsw_c::execute() {
if (getSw2() != 0xff) {
fopAcM_onSwitch(this, getSw2());
}
#if DEBUG
field_0x628 = l_HIO.field_0x8;
#else
field_0x628 = 5.0f;
#endif
onLight();
}
else if (field_0x624 == 500.0f) {
@@ -498,7 +537,8 @@ static int daTagCsw_Delete(daTagCsw_c* i_this) {
}
static int daTagCsw_Create(fopAc_ac_c* i_this) {
return static_cast<daTagCsw_c*>(i_this)->create();
daTagCsw_c* csw = static_cast<daTagCsw_c*>(i_this);
return csw->create();
}
static actor_method_class l_daTagCsw_Method = {
+9 -2
View File
@@ -8,12 +8,19 @@
#include "d/actor/d_a_tag_escape.h"
#include "d/d_procname.h"
static int daTagEscape_Create(fopAc_ac_c* i_this) {
fopAcM_ct(i_this, daTagEscape_c);
int daTagEscape_c::create() {
fopAcM_ct(this, daTagEscape_c);
return cPhs_COMPLEATE_e;
}
static int daTagEscape_Create(fopAc_ac_c* i_this) {
daTagEscape_c* escape = static_cast<daTagEscape_c*>(i_this);
int id = fopAcM_GetID(i_this);
return escape->create();
}
static int daTagEscape_Delete(daTagEscape_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagEscape_c();
return 1;
}
+49 -10
View File
@@ -1,23 +1,25 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_horse.h"
#include "d/actor/d_a_tag_event.h"
#include "d/d_com_inf_game.h"
#include "d/actor/d_a_horse.h"
#include "d/d_debug_viewer.h"
#include "d/d_s_play.h"
static fopAc_ac_c* daTag_getBk(u32 param_0) {
return fopAcM_searchFromName("Bk", 0xF, param_0);
}
u8 daTag_Event_c::getEventNo() {
return fopAcM_GetParam(this) >> 0x18;
return (fopAcM_GetParam(this) & 0xff000000) >> 24;
}
u8 daTag_Event_c::getSwbit() {
return fopAcM_GetParam(this) >> 0x8;
return (fopAcM_GetParam(this) & 0xff00) >> 8;
}
u8 daTag_Event_c::getSwbit2() {
return fopAcM_GetParam(this) >> 0x10;
return (fopAcM_GetParam(this) & 0xff0000) >> 16;
}
u8 daTag_Event_c::getType() {
@@ -103,10 +105,8 @@ int daTag_Event_c::create() {
setActio(ACTION_WAIT);
}
shape_angle.z = 0;
shape_angle.x = 0;
current.angle.z = 0;
current.angle.x = 0;
shape_angle.x = shape_angle.z = 0;
current.angle.x = current.angle.z = 0;
scale.x *= 100.0f;
scale.y *= 100.0f;
@@ -131,8 +131,9 @@ int daTag_Event_c::actionNext() {
mEventIdx = mMapEventIdx;
mMapEventIdx = -1;
int roomNo = fopAcM_GetRoomNo(this);
dStage_MapEvent_dt_c* event_data =
dEvt_control_c::searchMapEventData(mMapToolId, fopAcM_GetRoomNo(this));
dEvt_control_c::searchMapEventData(mMapToolId, roomNo);
if (event_data != NULL) {
mMapToolId = event_data->field_0x5;
mMapEventIdx = dComIfGp_getEventManager().getEventIdx(this, mMapToolId);
@@ -231,6 +232,10 @@ int daTag_Event_c::actionHunt() {
if (swbit != 0xFF && dComIfGs_isSwitch(swbit, fopAcM_GetRoomNo(this))) {
setActio(ACTION_WAIT);
} else if (arrivalTerms() && checkArea()) {
#if DEBUG
mEventIdx = dComIfGp_getEventManager().getEventIdx(this, getEventNo());
#endif
setActio(ACTION_READY);
fopAcM_orderOtherEventId(this, mEventIdx, getEventNo(), 0xFFFF, 0, 1);
}
@@ -299,6 +304,36 @@ int daTag_Event_c::execute() {
}
int daTag_Event_c::draw() {
#if DEBUG
static GXColor color = {0x00, 0x00, 0xFF, 0xFF};
if (g_envHIO.mOther.mDisplayTransparentCyl != 0) {
if (getAreaType() == 0x8000) {
cXyz sp30[8];
cXyz sp20(current.pos.x - scale.x * 0.5f,
current.pos.y,
current.pos.z - scale.z * 0.5f);
cXyz sp14(current.pos.x + scale.x * 0.5f,
current.pos.y + scale.y,
current.pos.z + scale.z * 0.5f);
sp30[0].set(sp20.x, sp20.y, sp20.z);
sp30[1].set(sp20.x, sp20.y, sp14.z);
sp30[2].set(sp14.x, sp20.y, sp14.z);
sp30[3].set(sp14.x, sp20.y, sp20.z);
sp30[4].set(sp20.x, sp14.y, sp20.z);
sp30[5].set(sp20.x, sp14.y, sp14.z);
sp30[6].set(sp14.x, sp14.y, sp14.z);
sp30[7].set(sp14.x, sp14.y, sp20.z);
dDbVw_drawCube8pXlu(sp30, color);
} else {
cXyz sp08(current.pos);
sp08.y -= scale.y;
dDbVw_drawCylinderXlu(
sp08, scale.x, scale.y * 2.0f,
color, 1);
}
}
#endif
return 1;
}
@@ -316,12 +351,16 @@ static int daTag_Event_IsDelete(daTag_Event_c* i_this) {
}
static int daTag_Event_Delete(daTag_Event_c* i_this) {
u32 actorId = fopAcM_GetID(i_this);
i_this->~daTag_Event_c();
return 1;
}
static int daTag_Event_Create(fopAc_ac_c* i_this) {
return static_cast<daTag_Event_c*>(i_this)->create();
daTag_Event_c* event = static_cast<daTag_Event_c*>(i_this);
u32 actorId = fopAcM_GetID(i_this);
int result = event->create();
return result;
}
static actor_method_class l_daTag_Event_Method = {
+27 -17
View File
@@ -38,14 +38,20 @@ int daTag_Evt_c::destroy() {
}
int daTag_Evt_c::execute() {
cXyz sp14;
int var_r29 = 0;
BOOL bVar = true;
u16 eventId;
int iVar1;
int actIdx;
eyePos.set(current.pos.x, current.pos.y + 100.0f, current.pos.z);
attention_info.position = eyePos;
fopAcM_SetRoomNo(this, dComIfGp_roomControl_getStayNo());
if (field_0x5E4 == 0 || field_0x5E4 == 1) {
if (dComIfGp_event_runCheck()) {
bVar = false;
int iVar1 = dComIfGp_evmng_getMyStaffId(field_0x568, 0, 0);
iVar1 = dComIfGp_evmng_getMyStaffId(field_0x568, 0, 0);
if (!eventInfo.checkCommandTalk()) {
if (eventInfo.checkCommandDemoAccrpt()) {
if (dComIfGp_getEventManager().endCheck(field_0x572)) {
@@ -55,20 +61,20 @@ int daTag_Evt_c::execute() {
bVar = true;
} else {
if (iVar1 != -1) {
int actIdx = dComIfGp_getEventManager().getMyActIdx(
actIdx = dComIfGp_getEventManager().getMyActIdx(
iVar1, mEvtCutList, 3, 0, 0);
int iVar2 = 0;
var_r29 = 0;
switch (actIdx) {
case 0:
iVar2 = doEvtCutWait(iVar1);
var_r29 = doEvtCutWait(iVar1);
break;
case 1:
iVar2 = doEvtCutTalk(iVar1);
var_r29 = doEvtCutTalk(iVar1);
break;
case 2:
iVar2 = doEvtCutNext(iVar1);
var_r29 = doEvtCutNext(iVar1);
}
if (iVar2 != 0) {
if (var_r29 != 0) {
dComIfGp_getEventManager().cutEnd(iVar1);
}
}
@@ -77,7 +83,7 @@ int daTag_Evt_c::execute() {
} else if (field_0x5DC != 0) {
if (mMsgFlow.doFlow(this, NULL, 0) != 0) {
dComIfGp_event_reset();
u16 eventId = mMsgFlow.getEventId(NULL);
eventId = mMsgFlow.getEventId(NULL);
if (eventId != 0) {
daNpcMsg_setEvtNum(eventId);
field_0x570 = 1;
@@ -92,8 +98,8 @@ int daTag_Evt_c::execute() {
}
}
if (!isDelete() && cLib_calcTimer(&field_0x5D0) == 0) {
cXyz var1 = daPy_getPlayerActorClass()->current.pos - current.pos;
if (var1.absXZ() < scale.x && -scale.y < var1.y && var1.y < scale.y) {
sp14 = daPy_getPlayerActorClass()->current.pos - current.pos;
if (sp14.absXZ() < scale.x && -scale.y < sp14.y && sp14.y < scale.y) {
field_0x570 = 1;
}
}
@@ -113,16 +119,16 @@ int daTag_Evt_c::draw() {
int daTag_Evt_c::getParam() {
field_0x5E0 = fopAcM_GetParam(this) & 0xFFF;
field_0x5E2 = (fopAcM_GetParam(this) >> 0xC) & 0xFFF;
field_0x5E2 = (fopAcM_GetParam(this) & 0xFFF000) >> 12;
if ((fopAcM_GetParam(this) & 0xF000000) != 0xF000000) {
field_0x5D8 = (fopAcM_GetParam(this) & 0xF000000) >> 0x18;
field_0x5D8 = (fopAcM_GetParam(this) & 0xF000000) >> 24;
} else {
field_0x5D8 = -1;
}
field_0x5E4 = fopAcM_GetParam(this) >> 0x1E;
field_0x5E4 = (fopAcM_GetParam(this) & 0xC0000000) >> 30;
field_0x5DD = home.angle.x;
field_0x5DE = (u16)home.angle.x >> 8;
field_0x5DE = (home.angle.x & 0xFF00) >> 8;
field_0x5D4 = home.angle.z & 0xFF;
if ((home.angle.z & 0xFF00) != 0xFF00) {
field_0x5D0 = ((home.angle.z & 0xFF00) >> 8) * 0x1E;
@@ -175,16 +181,19 @@ int daTag_Evt_c::isDelete() {
}
int daTag_Evt_c::doEvtCutWait(int param_0) {
int* pTimer = NULL;
if (dComIfGp_getEventManager().getIsAddvance(param_0)) {
int* pTimer = dComIfGp_evmng_getMyIntegerP(param_0, "timer");
mTimer = (pTimer == NULL ? 0 : *pTimer);
pTimer = dComIfGp_evmng_getMyIntegerP(param_0, "timer");
mTimer = pTimer == NULL ? 0 : *pTimer;
}
return cLib_calcTimer(&mTimer) == 0;
}
int daTag_Evt_c::doEvtCutTalk(int param_0) {
int* pTimer = NULL;
if (dComIfGp_getEventManager().getIsAddvance(param_0)) {
mMsgFlow.init(this, *dComIfGp_evmng_getMyIntegerP(param_0, "flowNodeNo"), 0, NULL);
pTimer = dComIfGp_evmng_getMyIntegerP(param_0, "flowNodeNo");
mMsgFlow.init(this, *pTimer, 0, NULL);
return 0;
} else {
return mMsgFlow.doFlow(this, NULL, 0);
@@ -192,6 +201,7 @@ int daTag_Evt_c::doEvtCutTalk(int param_0) {
}
int daTag_Evt_c::doEvtCutNext(int param_0) {
int* pTimer = NULL;
if (dComIfGp_getEventManager().getIsAddvance(param_0)) {
if ((field_0x5E4 == 0 || field_0x5E4 == 1) && field_0x5DE != 0xFF) {
dComIfGs_onSwitch(field_0x5DE, fopAcM_GetRoomNo(this));
+8 -7
View File
@@ -9,6 +9,8 @@
#include "d/d_procname.h"
cPhs__Step daTag_EvtArea_c::create() {
int var_r28 = 0;
fopAcM_ct(this, daTag_EvtArea_c);
switch (getType()) {
@@ -149,20 +151,19 @@ BOOL daTag_EvtArea_c::isDelete() {
}
BOOL daTag_EvtArea_c::chkPointInArea(cXyz i_point, cXyz i_addSize) {
cXyz area_vtx[4];
cXyz size, center, player_to_home, point_to_current;
if (field_0x56c == 0) {
if ((getOnEvtBit() != -1 && daNpcT_chkEvtBit(getOnEvtBit())) ||
(getBitSW() != 0xff && dComIfGs_isSwitch(getBitSW(), fopAcM_GetRoomNo(this))) ||
(getOnEvtBit() == -1 && getBitSW() == 0xFF))
{
size = scale + i_addSize;
cXyz size = scale + i_addSize;
cXyz center;
if (getType() == 15 || getType() == 16) {
player_to_home = daPy_getPlayerActorClass()->current.pos;
cXyz area_vtx[4];
cXyz player_to_home = daPy_getPlayerActorClass()->current.pos;
player_to_home -= home.pos;
mDoMtx_YrotS(mDoMtx_stack_c::now, -current.angle.y);
mDoMtx_stack_c::YrotS(-current.angle.y);
mDoMtx_stack_c::multVec(&player_to_home, &player_to_home);
// bottom left
@@ -184,7 +185,7 @@ BOOL daTag_EvtArea_c::chkPointInArea(cXyz i_point, cXyz i_addSize) {
if (area_vtx[0].x < player_to_home.x && area_vtx[0].z < player_to_home.z &&
area_vtx[2].x > player_to_home.x && area_vtx[2].z > player_to_home.z)
{
point_to_current = i_point - current.pos;
cXyz point_to_current = i_point - current.pos;
if (0 <= (int)point_to_current.y && (int)point_to_current.y < (int)size.y) {
return true;
}
+29 -22
View File
@@ -10,6 +10,13 @@
#include "d/d_com_inf_game.h"
#include "d/d_procname.h"
enum evt_cut_e {
EVT_CUT_NONE_e,
EVT_CUT_TALK_e,
EVT_CUT_WAIT_e,
NUM_EVT_CUTS_e,
};
char* daTag_EvtMsg_c::mEvtCutNameList[] = {"", "TALK", "WAIT"};
EvtCutFunc daTag_EvtMsg_c::mEvtCutList[] = {
@@ -21,6 +28,8 @@ EvtCutFunc daTag_EvtMsg_c::mEvtCutList[] = {
static char* l_myName = "EvtMsg";
int daTag_EvtMsg_c::create() {
int var_r28 = 0;
fopAcM_ct(this, daTag_EvtMsg_c);
scale.x *= 100.0f;
@@ -67,6 +76,10 @@ int daTag_EvtMsg_c::Execute() {
staff_id = evt_mng.getMyStaffId(l_myName, this, -1);
if (staff_id != -1) {
int evtCutNo = evt_mng.getMyActIdx(staff_id, mEvtCutNameList, 3, 0, 0);
JUT_ASSERT(165, (0 <= evtCutNo) && (evtCutNo < NUM_EVT_CUTS_e));
JUT_ASSERT(166, NULL != mEvtCutList[evtCutNo]);
if ((this->*mEvtCutList[evtCutNo])(staff_id) != 0) {
evt_mng.cutEnd(staff_id);
}
@@ -82,18 +95,18 @@ int daTag_EvtMsg_c::Execute() {
}
} else if (isDelete()) {
fopAcM_delete(this);
} else if (mFlowID != -1) {
if (chkPointInArea(daPy_getPlayerActorClass()->current.pos)) {
} else {
if (mFlowID != -1 && chkPointInArea(daPy_getPlayerActorClass()->current.pos)) {
if (getProcType() == 0) {
s16 var_r0 = (s16)(fopAcM_searchPlayerAngleY(this) + 0x7FFF);
var_r0 = var_r0 - daPy_getPlayerActorClass()->current.angle.y;
s16 var_r28 = (s16)(fopAcM_searchPlayerAngleY(this) + 0x7FFF);
var_r28 = var_r28 - daPy_getPlayerActorClass()->current.angle.y;
if (var_r0 < 0) {
var_r0 = -var_r0;
if (var_r28 < 0) {
var_r28 = -var_r28;
}
if (var_r0 <= 0x1000) {
mEventID = evt_mng.getEventIdx(this, "DEFAULT_EVT_TALK", 0xFF);
if (var_r28 <= 0x1000) {
mEventID = dComIfGp_getEventManager().getEventIdx(this, "DEFAULT_EVT_TALK", 0xFF);
fopAcM_orderOtherEventId(this, mEventID, 0xFF, 0xFFFF, 0, 1);
}
} else {
@@ -117,20 +130,12 @@ int daTag_EvtMsg_c::Draw() {
u32 daTag_EvtMsg_c::getOnEvtBit() {
u32 bit = fopAcM_GetParam(this) & 0xFFF;
if (bit != 0xFFF) {
return bit;
}
return -1;
return bit == 0xFFF ? -1 : bit;
}
u32 daTag_EvtMsg_c::getOffEvtBit() {
u32 bit = (fopAcM_GetParam(this) >> 0xC) & 0xFFF;
if (bit != 0xFFF) {
return bit;
}
return -1;
u32 bit = (fopAcM_GetParam(this) & 0xFFF000) >> 12;
return bit == 0xFFF ? -1 : bit;
}
u8 daTag_EvtMsg_c::getOnSwBit() {
@@ -138,7 +143,7 @@ u8 daTag_EvtMsg_c::getOnSwBit() {
}
u8 daTag_EvtMsg_c::getOffSwBit() {
return (home.angle.x >> 8) & 0xFF;
return (home.angle.x & 0xFF00) >> 8;
}
u8 daTag_EvtMsg_c::getProcType() {
@@ -175,7 +180,8 @@ BOOL daTag_EvtMsg_c::chkPointInArea(cXyz param_0) {
}
BOOL daTag_EvtMsg_c::ECut_talk(int i_staffID) {
if (dComIfGp_getEventManager().getIsAddvance(i_staffID)) {
dEvent_manager_c& eventMgr = dComIfGp_getEventManager();
if (eventMgr.getIsAddvance(i_staffID)) {
mMsgFlow.init(this, mFlowID, 0, NULL);
}
@@ -188,9 +194,10 @@ BOOL daTag_EvtMsg_c::ECut_talk(int i_staffID) {
BOOL daTag_EvtMsg_c::ECut_wait(int i_staffID) {
dEvent_manager_c& evt_mng = dComIfGp_getEventManager();
int* data_p = NULL;
int timer = 0;
int* data_p = dComIfGp_evmng_getMyIntegerP(i_staffID, "timer");
data_p = dComIfGp_evmng_getMyIntegerP(i_staffID, "timer");
if (data_p != NULL) {
timer = *data_p;
}
+15 -10
View File
@@ -5,12 +5,13 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_firewall.h"
#include <cmath>
#include "d/actor/d_a_player.h"
#include "d/d_com_inf_game.h"
#include "d/actor/d_a_tag_firewall.h"
#include "d/d_bomb.h"
#include "d/d_camera.h"
#include "d/d_com_inf_game.h"
#include "d/d_s_play.h"
struct Tag_FWall_n {
static dCcD_SrcSph cc_sph_src;
@@ -42,6 +43,7 @@ static u8 fire_num;
int daTag_FWall_c::execute() {
cXyz cam_eye = dCam_getBody()->Eye();
cXyz pos;
u8 target_alpha = 0xff;
if (mSetGameoverEff) {
pos.set(0.0f, 0.0f, 0.0f);
@@ -108,8 +110,9 @@ int daTag_FWall_c::execute() {
mCcSphs[i].OnAtSetBit();
pos = mWallPos[i];
pos.y += nREG_F(17);
mCcSphs[i].SetC(pos);
mCcSphs[i].SetR(90.0f);
mCcSphs[i].SetR(90.0f + nREG_F(16));
dComIfG_Ccsp()->Set(&mCcSphs[i]);
}
@@ -120,8 +123,7 @@ int daTag_FWall_c::execute() {
if (emitter != NULL) {
pos = cam_eye - mWallPos[i];
u8 target_alpha;
if (pos.absXZ() < 250.0f && std::abs(pos.y) < 250.0f) {
if (pos.absXZ() < 250.0f + nREG_F(18) && std::abs(pos.y) < 250.0f + nREG_F(19)) {
target_alpha = 0;
} else {
target_alpha = 0xFF;
@@ -163,23 +165,26 @@ static int daTag_FWall_IsDelete(daTag_FWall_c* i_this) {
}
static int daTag_FWall_Delete(daTag_FWall_c* i_this) {
int id = fopAcM_GetID(i_this);
return 1;
}
int daTag_FWall_c::create() {
fopAcM_ct(this, daTag_FWall_c);
OS_REPORT("Tag_FWall PARAM %x %d \n", fopAcM_GetParam(this), fire_num);
if (fire_num == 0) {
field_0x568 = 0xFF;
fire_leader = this;
mCcStts.Init(0xFF, 0, this);
}
fire_leader->mWallTimer[fire_num] = (fopAcM_GetParam(this) >> 8) & 0xFFFF;
fire_leader->mWallTimer[fire_num] = (fopAcM_GetParam(this) & 0xFFFF00) >> 8;
fire_leader->mExplodeTime[fire_num] = current.angle.x & 0xFFFF;
fire_leader->field_0x65c[fire_num] = fopAcM_GetParam(this);
u8 temp_r0 = fopAcM_GetParam(this) >> 0x18;
u8 temp_r0 = (fopAcM_GetParam(this) & 0xFF000000) >> 24;
if (temp_r0 == 0xFF) {
temp_r0 = 0;
}
@@ -194,12 +199,12 @@ int daTag_FWall_c::create() {
fire_leader->mWallMode[fire_num] = 1;
}
if (++fire_num > 1) {
fire_num++;
if (fire_num > 1) {
return cPhs_ERROR_e;
}
shape_angle.x = 0;
current.angle.x = 0;
current.angle.x = shape_angle.x = 0;
return cPhs_COMPLEATE_e;
}
+2
View File
@@ -9,10 +9,12 @@
static int daTagGra_Create(fopAc_ac_c* i_this) {
daTagGra_c* gra_tag = (daTagGra_c*)i_this;
int id = fopAcM_GetID(i_this);
return gra_tag->create();
}
static int daTagGra_Delete(daTagGra_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagGra_c();
return 1;
}
+10 -7
View File
@@ -14,30 +14,33 @@ int daTagGstart_c::create() {
fopAcM_ct(this, daTagGstart_c);
mSwNo = fopAcM_GetParam(this);
mSwNo2 = fopAcM_GetParam(this) >> 8;
field_0x56a = fopAcM_GetParam(this) >> 0x10;
mSwNo2 = (fopAcM_GetParam(this) >> 8) & 0xFF;
field_0x56a = (fopAcM_GetParam(this) >> 0x10) & 0xFF;
mType = (fopAcM_GetParam(this) >> 0x18) & 0xF;
return cPhs_COMPLEATE_e;
}
static int daTagGstart_Create(fopAc_ac_c* i_this) {
return static_cast<daTagGstart_c*>(i_this)->create();
daTagGstart_c* gStart = static_cast<daTagGstart_c*>(i_this);
int id = fopAcM_GetID(i_this);
return gStart->create();
}
daTagGstart_c::~daTagGstart_c() {}
static int daTagGstart_Delete(daTagGstart_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagGstart_c();
return 1;
}
int daTagGstart_c::execute() {
if ((mSwNo == 0xFF || dComIfGs_isSwitch(mSwNo, fopAcM_GetHomeRoomNo(this))) &&
(mSwNo2 == 0xFF || !dComIfGs_isSwitch(mSwNo2, fopAcM_GetHomeRoomNo(this))))
if ((mSwNo == 0xFF || fopAcM_isSwitch(this, mSwNo)) &&
(mSwNo2 == 0xFF || !fopAcM_isSwitch(this, mSwNo2)))
{
if (mType != 0 || dComIfGp_getLinkPlayer()->checkWolf()) {
dComIfGp_getLinkPlayer()->onSceneChangeDead(field_0x56a, fopAcM_GetRoomNo(this));
if (mType != 0 || daPy_py_c::checkNowWolf()) {
daPy_getLinkPlayerActorClass()->onSceneChangeDead(field_0x56a, fopAcM_GetRoomNo(this));
}
}
+17 -4
View File
@@ -13,7 +13,8 @@ int daTagGuard_c::getAppearPoint(Vec* i_appearPnt) {
return 0;
}
*i_appearPnt = dPath_GetPnt(mPath, mPath->m_num - 1)->m_position;
dPnt* pnt = dPath_GetPnt(mPath, mPath->m_num - 1);
*i_appearPnt = pnt->m_position;
return 1;
}
@@ -21,8 +22,9 @@ void daTagGuard_c::createGuard(u32 i_parameters) {
cXyz pos = current.pos;
if (getPathID() != 0xFF) {
pos = dPath_GetPnt(mPath, 0)->m_position;
i_parameters |= (getPathID() << 0x10);
dPnt* pnt = dPath_GetPnt(mPath, 0);
pos.set(pnt->m_position);
i_parameters |= getPathID() << 0x10;
}
fopAcM_createChild(PROC_NPC_GUARD, fopAcM_GetID(this), i_parameters, &pos,
@@ -38,20 +40,31 @@ int daTagGuard_c::create() {
void daTagGuard_c::create_init() {
mPath = dPath_GetRoomPath(getPathID(), fopAcM_GetHomeRoomNo(this));
JUT_ASSERT(135, mPath != NULL);
dPnt* pnt1 = dPath_GetPnt(mPath, 0);
dPnt* pnt2 = dPath_GetPnt(mPath, 1);
#if DEBUG
current.pos.set(pnt1->m_position);
#else
//TODO: fakematch, using ::set causes a misplaced mr on GCN versions
current.pos.x = pnt1->m_position.x;
current.pos.y = pnt1->m_position.y;
current.pos.z = pnt1->m_position.z;
#endif
current.angle.y = cLib_targetAngleY(&pnt1->m_position, &pnt2->m_position);
}
static int daTagGuard_Create(fopAc_ac_c* i_this) {
return static_cast<daTagGuard_c*>(i_this)->create();
daTagGuard_c* guard = static_cast<daTagGuard_c*>(i_this);
int id = fopAcM_GetID(i_this);
return guard->create();
}
static int daTagGuard_Delete(daTagGuard_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagGuard_c();
return 1;
}
+4 -1
View File
@@ -25,12 +25,15 @@ int daTagHinit_c::create() {
}
static int daTagHinit_Create(fopAc_ac_c* i_this) {
return static_cast<daTagHinit_c*>(i_this)->create();
daTagHinit_c* hInit = static_cast<daTagHinit_c*>(i_this);
int id = fopAcM_GetID(i_this);
return hInit->create();
}
daTagHinit_c::~daTagHinit_c() {}
static int daTagHinit_Delete(daTagHinit_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagHinit_c();
return 1;
}
+44 -2
View File
@@ -11,8 +11,27 @@
#include "d/d_com_inf_game.h"
#include "d/actor/d_a_horse.h"
class daTagHjump_HIO_c : public mDoHIO_entry_c {
public:
daTagHjump_HIO_c();
void genMessage(JORMContext*);
f32 depth;
f32 height;
};
static char const l_arcName[] = "Hfence";
#if DEBUG
daTagHjump_HIO_c l_HIO;
void daTagHjump_HIO_c::genMessage(JORMContext* ctx) {
ctx->genSlider("高さ", &height, 0.0f, 500.0f);
ctx->genSlider("奥行き", &depth, 0.0f, 1000.0f);
}
#endif
int daTagHjump_c::CreateHeap() {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 4);
mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
@@ -43,7 +62,7 @@ int daTagHjump_c::create() {
if (phase == cPhs_COMPLEATE_e) {
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
tevStr.room_no = fopAcM_GetRoomNo(this);
tevStr.room_no = (int)fopAcM_GetRoomNo(this);
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::YrotM(shape_angle.y);
@@ -61,6 +80,11 @@ int daTagHjump_c::create() {
fopAcM_SetMin(this, -scale.x, 0.0f, -50.0f);
fopAcM_SetMax(this, scale.x, 200.0f, 50.0f);
#if DEBUG
// "Horse jumping fence"
l_HIO.entryHIO("馬ジャンプ柵");
#endif
field_0x5ae = 0x2000;
fopAcM_setCullSizeFar(this, 5.0f);
field_0x5ad = 4;
@@ -85,23 +109,41 @@ int daTagHjump_c::create() {
return phase;
}
daTagHjump_HIO_c::daTagHjump_HIO_c() {
height = 350.0f;
depth = 400.0f;
}
static int daTagHjump_Create(fopAc_ac_c* i_this) {
return static_cast<daTagHjump_c*>(i_this)->create();
daTagHjump_c* hJump = static_cast<daTagHjump_c*>(i_this);
int id = fopAcM_GetID(i_this);
return hJump->create();
}
daTagHjump_c::~daTagHjump_c() {
if (mType != TYPE_TRIGGER_e) {
dComIfG_resDelete(&mPhase, l_arcName);
#if DEBUG
l_HIO.removeHIO();
#endif
}
}
static int daTagHjump_Delete(daTagHjump_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->MoveBGDelete();
i_this->~daTagHjump_c();
return 1;
}
int daTagHjump_c::execute() {
#if DEBUG
if (mType != 0) {
scale.y = l_HIO.height;
scale.z = l_HIO.depth;
}
#endif
daHorse_c* horse_p = dComIfGp_getHorseActor();
if (horse_p != NULL &&
+7 -4
View File
@@ -36,14 +36,16 @@ int daTag_Howl_c::draw() {
return 1;
}
u8 daTag_Howl_c::isAreaCheck() {
bool daTag_Howl_c::isAreaCheck() {
cXyz vec_to_player;
if (getSwitchBit() != 0xFF) {
if (dComIfGs_isSaveSwitch(getSwitchBit())) {
return false;
}
}
cXyz vec_to_player = daPy_getPlayerActorClass()->current.pos - current.pos;
vec_to_player = daPy_getPlayerActorClass()->current.pos - current.pos;
if (daPy_py_c::checkNowWolf()) {
if (vec_to_player.absXZ() < scale.x && -scale.y < vec_to_player.y &&
vec_to_player.y < scale.y)
@@ -57,7 +59,7 @@ u8 daTag_Howl_c::isAreaCheck() {
int daTag_Howl_c::getParam() {
mCurveID = fopAcM_GetParam(this) & 0xF;
field_0x569 = fopAcM_GetParam(this) >> 0x1E;
field_0x569 = (fopAcM_GetParam(this) & 0xC0000000) >> 30;
scale.x *= 100.0f;
scale.y *= 100.0f;
scale.z *= 100.0f;
@@ -65,7 +67,8 @@ int daTag_Howl_c::getParam() {
}
u8 daTag_Howl_c::getSwitchBit() {
return (fopAcM_GetParam(this) >> 4) & 0xFF;
u8 param = (fopAcM_GetParam(this) & 0xFF0) >> 4;
return param;
}
static int daTag_Howl_Create(void* i_this) {
+60 -32
View File
@@ -5,11 +5,13 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_horse.h"
#include "d/actor/d_a_tag_hstop.h"
#include "d/d_com_inf_game.h"
#include "d/d_debug_viewer.h"
#include "d/d_meter2_info.h"
#include "d/d_s_play.h"
#include "f_op/f_op_actor_mng.h"
#include "d/actor/d_a_horse.h"
int daTagHstop_c::create() {
fopAcM_ct(this, daTagHstop_c);
@@ -42,16 +44,16 @@ int daTagHstop_c::create() {
if (mPrm1 == 2) {
if (daPy_py_c::checkRoomRestartStart()) {
if (!dComIfGs_isSwitch(0x8A, fopAcM_GetHomeRoomNo(this))) {
dComIfGs_onSwitch(0x8A, fopAcM_GetHomeRoomNo(this));
} else if (!dComIfGs_isSwitch(0x8B, fopAcM_GetHomeRoomNo(this))) {
dComIfGs_onSwitch(0x8B, fopAcM_GetHomeRoomNo(this));
} else if (!dComIfGs_isSwitch(0x8C, fopAcM_GetHomeRoomNo(this))) {
dComIfGs_onSwitch(0x8C, fopAcM_GetHomeRoomNo(this));
if (!fopAcM_isSwitch(this, 0x8A)) {
fopAcM_onSwitch(this, 0x8A);
} else if (!fopAcM_isSwitch(this, 0x8B)) {
fopAcM_onSwitch(this, 0x8B);
} else if (!fopAcM_isSwitch(this, 0x8C)) {
fopAcM_onSwitch(this, 0x8C);
}
}
if (dComIfGs_isSwitch(0x8C, fopAcM_GetHomeRoomNo(this))) {
if (fopAcM_isSwitch(this, 0x8C)) {
field_0x574 = 0;
} else {
field_0x574 = 1200;
@@ -64,7 +66,9 @@ int daTagHstop_c::create() {
}
static int daTagHstop_Create(fopAc_ac_c* i_this) {
return static_cast<daTagHstop_c*>(i_this)->create();
daTagHstop_c* hStop = static_cast<daTagHstop_c*>(i_this);
int id = fopAcM_GetID(i_this);
return hStop->create();
}
daTagHstop_c::~daTagHstop_c() {
@@ -82,14 +86,15 @@ daTagHstop_c::~daTagHstop_c() {
}
static int daTagHstop_Delete(daTagHstop_c* i_this) {
int id = fopAcM_GetID(i_this);
static_cast<daTagHstop_c*>(i_this)->~daTagHstop_c();
return 1;
}
void daTagHstop_c::setActive() {
if (mPrm0 == 0xFF || mPrm1 == 2 ||
(mPrm1 == 0 && dComIfGs_isSwitch(mPrm0, fopAcM_GetHomeRoomNo(this))) ||
(mPrm1 == 1 && !dComIfGs_isSwitch(mPrm0, fopAcM_GetHomeRoomNo(this))))
(mPrm1 == 0 && fopAcM_isSwitch(this, mPrm0)) ||
(mPrm1 == 1 && !fopAcM_isSwitch(this, mPrm0)))
{
mActive = true;
} else {
@@ -105,19 +110,18 @@ int daTagHstop_c::execute() {
m_msgFlow.init(this, (u16)shape_angle.z, 0, NULL);
field_0x573 = 3;
} else if (m_msgFlow.doFlow(this, NULL, 0)) {
dComIfGp_getEvent()->reset();
dComIfGp_event_reset();
field_0x573 = 0;
s16 arrow_num = dComIfGp_getItemMaxArrowNumCount();
dComIfGp_setItemArrowNumCount(arrow_num);
dComIfGs_onSwitch(0x8D, fopAcM_GetHomeRoomNo(this));
dComIfGp_setItemArrowNumCount(dComIfGp_getItemMaxArrowNumCount());
fopAcM_onSwitch(this, 0x8D);
}
} else {
if (field_0x574 != 0) {
if (dComIfGs_isSwitch(0x8F, fopAcM_GetHomeRoomNo(this))) {
if (fopAcM_isSwitch(this, 0x8F)) {
field_0x574 = 0;
} else if (dComIfGp_getLinkPlayer()->checkSingleBoarBattleSecondBowReady()) {
dComIfGs_onSwitch(0x8F, fopAcM_GetHomeRoomNo(this));
} else if (daPy_getLinkPlayerActorClass()->checkSingleBoarBattleSecondBowReady()) {
fopAcM_onSwitch(this, 0x8F);
field_0x574 = 0;
} else {
field_0x574--;
@@ -127,35 +131,35 @@ int daTagHstop_c::execute() {
setActive();
if (field_0x573) {
daHorse_c* horse_p = dComIfGp_getHorseActor();
daHorse_c* horse_p = (daHorse_c*)dComIfGp_getHorseActor();
if (mPrm1 != 2 || dComIfGs_getArrowNum() != 0 || horse_p == NULL) {
field_0x573 = 0;
} else if (field_0x573 == 1) {
if (dComIfGp_getHorseActor()->checkTurnStand() &&
!dComIfGp_getHorseActor()->checkTurnStandCamera())
if (horse_p->checkTurnStand() &&
!horse_p->checkTurnStandCamera())
{
field_0x573 = 2;
}
} else if (field_0x573 == 2 && !dComIfGp_getHorseActor()->checkTurnStand()) {
} else if (field_0x573 == 2 && !horse_p->checkTurnStand()) {
fopAcM_orderSpeakEvent(this, 0, 0);
eventInfo.onCondition(dEvtCnd_CANTALK_e);
}
} else if (mPrm1 == 2 && !dComIfGp_event_runCheck()) {
if (dComIfGs_getArrowNum() == 0 && !dComIfGs_isSwitch(0x8D, fopAcM_GetHomeRoomNo(this)))
if (dComIfGs_getArrowNum() == 0 && !fopAcM_isSwitch(this, 0x8D))
{
dComIfGs_onSwitch(0x8D, fopAcM_GetHomeRoomNo(this));
fopAcM_onSwitch(this, 0x8D);
dMeter2Info_setFloatingFlow(43, 90, true);
if (!dComIfGs_isSwitch(0x8F, fopAcM_GetHomeRoomNo(this))) {
if (!fopAcM_isSwitch(this, 0x8F)) {
field_0x574 = 1200;
dComIfGs_offSwitch(0x8A, fopAcM_GetHomeRoomNo(this));
dComIfGs_offSwitch(0x8B, fopAcM_GetHomeRoomNo(this));
dComIfGs_offSwitch(0x8C, fopAcM_GetHomeRoomNo(this));
fopAcM_offSwitch(this, 0x8A);
fopAcM_offSwitch(this, 0x8B);
fopAcM_offSwitch(this, 0x8C);
}
} else if (field_0x574 == 0 && !dComIfGs_isSwitch(0x8F, fopAcM_GetHomeRoomNo(this))) {
dComIfGs_onSwitch(0x8F, fopAcM_GetHomeRoomNo(this));
dComIfGs_onSwitch(0x8E, fopAcM_GetHomeRoomNo(this));
} else if (field_0x574 == 0 && !fopAcM_isSwitch(this, 0x8F)) {
fopAcM_onSwitch(this, 0x8F);
fopAcM_onSwitch(this, 0x8E);
}
}
}
@@ -167,7 +171,31 @@ static int daTagHstop_Execute(daTagHstop_c* i_this) {
return i_this->execute();
}
static int daTagHstop_Draw(daTagHstop_c*) {
static int daTagHstop_Draw(daTagHstop_c* i_this) {
#if DEBUG
if (UREG_S(9) != 0) {
cXyz sp08[8];
sp08[0].set(-i_this->scale.x, i_this->scale.y, -i_this->scale.z);
sp08[1].set(i_this->scale.x, sp08[0].y, sp08[0].z);
sp08[2].set(sp08[0].x, sp08[0].y, i_this->scale.z);
sp08[3].set(sp08[1].x, sp08[0].y, sp08[2].z);
sp08[4].set(sp08[0].x, 0.0f, sp08[0].z);
sp08[5].set(sp08[1].x, 0.0f, sp08[1].z);
sp08[6].set(sp08[2].x, 0.0f, sp08[2].z);
sp08[7].set(sp08[3].x, 0.0f, sp08[3].z);
mDoMtx_stack_c::transS(i_this->current.pos);
mDoMtx_stack_c::YrotM(i_this->shape_angle.y);
for (int i = 0; i < 8; i++) {
mDoMtx_stack_c::multVec(&sp08[i], &sp08[i]);
}
static GXColor color = {0xff, 0, 0xff, 0x80};
dDbVw_drawCube8pXlu(sp08, color);
}
#endif
return 1;
}
+2
View File
@@ -9,11 +9,13 @@
#include "d/d_procname.h"
static int daTagInst_Create(fopAc_ac_c* i_this) {
int id = fopAcM_GetID(i_this);
fopAcM_ct(i_this, daTagInst_c);
return cPhs_COMPLEATE_e;
}
static int daTagInst_Delete(daTagInst_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagInst_c();
return 1;
}
+21 -25
View File
@@ -5,8 +5,9 @@
#include "d/actor/d_a_player.h"
#include "d/d_camera.h"
#include "d/d_com_inf_game.h"
#include "d/d_procname.h"
#include "d/d_msg_object.h"
#include "d/d_procname.h"
#include "d/d_s_play.h"
#include "f_op/f_op_actor_mng.h"
#include "m_Do/m_Do_graphic.h"
@@ -28,7 +29,7 @@ int daTagKagoFall_c::create() {
mExitID = 2;
mStartPoint = 0;
mDoMtx_trans(mDoMtx_stack_c::get(), current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::YrotM(shape_angle.y);
mDoMtx_inverse(mDoMtx_stack_c::get(), mMtx);
@@ -84,7 +85,7 @@ void daTagKagoFall_c::actionWaitRiver() {
return;
}
} else {
mNoCarryTimer = 150;
mNoCarryTimer = 150 + nREG_S(5);
}
}
@@ -99,7 +100,7 @@ void daTagKagoFall_c::actionWaitRiver() {
mRestartPos = dCam_getBody()->Eye();
mActionState = 1;
mTimer = 30;
player->onNoResetFlg0(daPy_py_c::FLG0_UNK_10000);
player->onDemoStreamAccept();
mRiverTimer = 60;
}
}
@@ -111,7 +112,7 @@ void daTagKagoFall_c::actionWaitRiver() {
}
if (mRiverTimer == 0) {
Z2GetAudioMgr()->seStart(Z2SE_FORCE_BACK, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
mDoAud_seStart(Z2SE_FORCE_BACK, NULL, 0, 0);
mDoGph_gInf_c::fadeOut(0.05f, static_cast<JUtility::TColor&>(g_blackColor));
mRiverTimer = 20;
mActionState = 2;
@@ -122,7 +123,7 @@ void daTagKagoFall_c::actionWaitRiver() {
case 2:
if (mRiverTimer == 0) {
daPy_getPlayerActorClass()->offNoResetFlg0(daPy_py_c::FLG0_UNK_10000);
daPy_getPlayerActorClass()->offDemoStreamAccept();
mActionState = 3;
mTimer = 40;
}
@@ -136,25 +137,21 @@ void daTagKagoFall_c::actionWaitRiver() {
}
break;
case 4: {
daPy_getPlayerActorClass()->offNoResetFlg0(daPy_py_c::FLG0_UNK_10000);
case 4:
daPy_getPlayerActorClass()->offDemoStreamAccept();
int msg = mMsgFlow.doFlow(this, NULL, 0);
if (msg != 0) {
if (mMsgFlow.doFlow(this, NULL, 0) != 0) {
if (dMsgObject_getSelectCursorPos() != 0) {
dStage_changeScene(mExitID, 0.0f, 0, fopAcM_GetRoomNo(this), 0, -1);
} else {
int room = dStage_roomControl_c::mStayNo;
dComIfGp_setNextStage("F_SP112", mStartPoint, room, dComIfG_play_c::getLayerNo(0),
0.0f, 10, 1, 0, 0, 1, 0);
dComIfGp_setNextStage("F_SP112", mStartPoint, dComIfGp_roomControl_getStayNo(),
dComIfG_play_c::getLayerNo(0), 0.0f, 10, 1, 0, 0, 1, 0);
}
mActionState = 5;
}
break;
}
case 5:
// Maybe contained some stripped out debug code?
break;
}
}
@@ -179,7 +176,7 @@ void daTagKagoFall_c::actionWaitFall() {
mActionState = 1;
}
} else {
mNoCarryTimer = 150;
mNoCarryTimer = 150 + nREG_S(5);
}
}
break;
@@ -188,9 +185,8 @@ void daTagKagoFall_c::actionWaitFall() {
if (dComIfGs_getLife() == 0) {
player->onSceneChangeAreaJump(mExitID, -1, NULL);
if (player->checkNoResetFlg2(daPy_py_c::FLG2_SCENE_CHANGE_START) && !mPlayedSceneChangeSfx)
{
Z2GetAudioMgr()->seStart(Z2SE_FORCE_BACK, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
if (player->checkSceneChangeAreaStart() && !mPlayedSceneChangeSfx) {
mDoAud_seStart(Z2SE_FORCE_BACK, NULL, 0, 0);
player->voiceStart(Z2SE_WL_V_FALL_TO_RESTART);
mPlayedSceneChangeSfx = true;
}
@@ -202,7 +198,7 @@ void daTagKagoFall_c::actionWaitFall() {
mDoGph_gInf_c::fadeOut(0.05f, static_cast<JUtility::TColor&>(g_blackColor));
mTimer = 60;
mActionState = 2;
Z2GetAudioMgr()->seStart(Z2SE_FORCE_BACK, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
mDoAud_seStart(Z2SE_FORCE_BACK, NULL, 0, 0);
player->voiceStart(Z2SE_WL_V_FALL_TO_RESTART);
}
break;
@@ -236,14 +232,12 @@ void daTagKagoFall_c::actionWaitFall() {
case 3: {
player->setPlayerPosAndAngle(&mRestartPos, 0, 0);
int msg = mMsgFlow.doFlow(this, NULL, 0);
if (msg != 0) {
if (mMsgFlow.doFlow(this, NULL, 0) != 0) {
if (dMsgObject_getSelectCursorPos() != 0) {
dStage_changeScene(mExitID, 0.0f, 0, fopAcM_GetRoomNo(this), 0, -1);
} else {
int room = dStage_roomControl_c::mStayNo;
dComIfGp_setNextStage("F_SP112", mStartPoint, room, dComIfG_play_c::getLayerNo(0),
0.0f, 10, 1, 0, 0, 1, 0);
dComIfGp_setNextStage("F_SP112", mStartPoint, dComIfGp_roomControl_getStayNo(),
dComIfG_play_c::getLayerNo(0), 0.0f, 10, 1, 0, 0, 1, 0);
}
mActionState = 10;
}
@@ -265,10 +259,12 @@ static int daTagKagoFall_Execute(daTagKagoFall_c* i_this) {
}
static int daTagKagoFall_Delete(daTagKagoFall_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static int daTagKagoFall_Create(daTagKagoFall_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->create();
}
+41 -2
View File
@@ -6,21 +6,46 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_lantern.h"
#include "JSystem/JHostIO/JORFile.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
static TAG_LANTERN_HIO_CLASS l_HIO;
daTag_Lantern_HIOParam const daTag_Lantern_Param_c::m = {0};
#if DEBUG
daTag_Lantern_HIO_c::daTag_Lantern_HIO_c() {
m = daTag_Lantern_Param_c::m;
}
void daTag_Lantern_HIO_c::listenPropertyEvent(const JORPropertyEvent* event) {
// NONMATCHING
JORReflexible::listenPropertyEvent(event);
JORFile file;
switch ((int)event->id) {
case 0x40000002:
if (file.open(JORFile::EFlags_WRITE | JORFile::EFlags_UNK_0x4, "すべてのファイル(*.*)\0*.*\0", NULL, NULL, NULL)) {
char sp138[0x7d0];
memset(sp138, 0, sizeof(sp138));
int msgLen = 0;
sprintf(sp138 + msgLen, "%d, \t// デバグ情報ON\n", m.enable_debug_info);
msgLen = strlen(sp138);
file.writeData(sp138, msgLen);
file.close();
OS_REPORT("write append success!::%6d\n", msgLen);
} else {
OS_REPORT("write append failure!\n");
}
break;
}
}
void daTag_Lantern_HIO_c::genMessage(JORMContext* ctx) {
// NONMATCHING
// "Debug information ON"
ctx->genCheckBox("デバグ情報ON ", &m.enable_debug_info, 1);
// "Export file"
ctx->genButton("ファイル書き出し", 0x40000002, 0);
}
#endif
@@ -39,6 +64,7 @@ int daTag_Lantern_c::create() {
}
int daTag_Lantern_c::Delete() {
fopAcM_RegisterDeleteID(this, "TAG_LANTERN");
this->~daTag_Lantern_c();
return 1;
}
@@ -80,12 +106,25 @@ int daTag_Lantern_c::Execute() {
}
int daTag_Lantern_c::Draw() {
#if DEBUG
if (mpHIO->m.enable_debug_info) {
dDbVw_drawCylinderXlu(current.pos, scale.x, scale.y,
(GXColor){0x80, 0x80, 0x80, 0x80}, 1);
}
#endif
return 1;
}
void daTag_Lantern_c::initialize() {
fopAcM_setCullSizeBox(this, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
#if DEBUG
mpHIO = &l_HIO;
// "Lantern check tag"
mpHIO->entryHIO("カンテラチェックタグ");
#endif
if (home.angle.z != 0xFFFF) {
mFlowIndex = home.angle.z;
} else {
+6 -3
View File
@@ -17,7 +17,7 @@ void daTagLightBall_c::setBaseMtx() {
int daTagLightBall_c::Create() {
initBaseMtx();
u8 swbit = getSwBit();
u8 swbit = getSwbit();
if (fopAcM_GetRoomNo(this) == 7) {
if (!fopAcM_isSwitch(this, 70)) {
fopAcM_offSwitch(this, swbit);
@@ -56,7 +56,7 @@ int daTagLightBall_c::create() {
}
int daTagLightBall_c::execute() {
u8 swbit = getSwBit();
u8 swbit = getSwbit();
if (swbit != 0xFF) {
if (getType() == 15) {
if (field_0x57c && !fopAcM_isSwitch(this, swbit)) {
@@ -102,11 +102,14 @@ static int daTagLightBall_Execute(daTagLightBall_c* i_this) {
}
static int daTagLightBall_Delete(daTagLightBall_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static int daTagLightBall_Create(fopAc_ac_c* i_this) {
return static_cast<daTagLightBall_c*>(i_this)->create();
daTagLightBall_c* lightBall = static_cast<daTagLightBall_c*>(i_this);
int id = fopAcM_GetID(i_this);
return lightBall->create();
}
static actor_method_class l_daTagLightBall_Method = {
+11
View File
@@ -12,6 +12,8 @@
int daTagLv2PrChk_c::Create() {
mSwbit2 = getSwbit2();
if (mSwbit2 == 0xFF) {
// "Boomerang puzzle monitoring tag: switch 2 is not specified"
OS_REPORT("\x1b[43;30mブーメランネタ監視タグ:スイッチ2の指定がありません\n\x1b[m");
return 0;
}
@@ -21,6 +23,9 @@ int daTagLv2PrChk_c::Create() {
mAction = ACTION_CHECK_e;
}
// "Boomerang puzzle monitoring tag: switch 1 <%d> switch 2 <%d>"
OS_REPORT("ブーメランネタ監視タグ:スイッチ1<%d>スイッチ2<%d>\n", getSwbit(), getSwbit2());
return 1;
}
@@ -120,6 +125,8 @@ void daTagLv2PrChk_c::actionCheck() {
case MODE_PUZZLE_CLEAR:
fopAcM_onSwitch(this, getSwbit());
mAction = ACTION_END_e;
// "Boomerang puzzle monitoring tag: SW<%d> was turned on"
OS_REPORT("ブーメランネタ監視タグ:SW<%d>オンしました\n", getSwbit());
break;
case MODE_CHECK_RESET:
if (!switch_1 && !switch_2 && !switch_3 && !switch_4) {
@@ -151,6 +158,8 @@ void daTagLv2PrChk_c::actionEnd() {}
void daTagLv2PrChk_c::seStartWrong() {
Z2GetAudioMgr()->seStart(Z2SE_SYS_RESULT_WRONG, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
// "♪ Wrong answer!!!!"
OS_REPORT("♪ハズレ!!!!\n");
}
int daTagLv2PrChk_c::_delete() {
@@ -162,10 +171,12 @@ static int daTagLv2PrChk_Execute(daTagLv2PrChk_c* i_this) {
}
static int daTagLv2PrChk_Delete(daTagLv2PrChk_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static int daTagLv2PrChk_Create(daTagLv2PrChk_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->create();
}
+2 -1
View File
@@ -42,7 +42,8 @@ int daTag_Lv5Soup_c::Draw() {
}
bool daTag_Lv5Soup_c::isAreaCheck() {
cXyz dist = daPy_getPlayerActorClass()->current.pos - current.pos;
cXyz dist;
dist = daPy_getPlayerActorClass()->current.pos - current.pos;
f32 boundX = scale.x * 100.0f;
f32 boundY = scale.y * 100.0f;
+42 -11
View File
@@ -6,12 +6,23 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_lv6CstaSw.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
static daLv6CstaSw_HIO_c l_HIO;
daLv6CstaSw_HIO_c::daLv6CstaSw_HIO_c() {
unk_0x4 = 0;
show_range = 0;
}
#if DEBUG
void daLv6CstaSw_HIO_c::genMessage(JORMContext* ctx) {
// "Display range"
ctx->genCheckBox("範囲表示", &show_range, 1);
}
#endif
void daLv6CstaSw_c::setBaseMtx() {
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
@@ -21,12 +32,19 @@ int daLv6CstaSw_c::create() {
fopAcM_ct(this, daLv6CstaSw_c);
mSwitch = getSw();
setBaseMtx();
#if DEBUG
l_HIO.entryHIO("石像SWタグ");
#endif
return cPhs_COMPLEATE_e;
}
fopAc_ac_c* daLv6CstaSw_c::searchSekizoAct(void* i_actor, void*) {
if (i_actor != NULL && fopAcM_IsActor(i_actor) && fopAcM_GetProfName(i_actor) == PROC_CSTATUE) {
return (fopAc_ac_c*)i_actor;
fopAc_ac_c* daLv6CstaSw_c::searchSekizoAct(void* i_actor, void* param_1) {
fopAc_ac_c* actor2 = (fopAc_ac_c*)param_1;
fopAc_ac_c* actor = (fopAc_ac_c*)i_actor;
if (actor != NULL && fopAcM_IsActor(actor) && fopAcM_GetProfName(actor) == PROC_CSTATUE) {
return actor;
}
return NULL;
@@ -41,7 +59,8 @@ bool daLv6CstaSw_c::areaCheck() {
}
cXyz vec_to_actor = current.pos - sekizo_p->current.pos;
if (vec_to_actor.absXZ() <= scale.x * 100.0f) {
f32 dist_to_actor = vec_to_actor.absXZ();
if (dist_to_actor <= scale.x * 100.0f) {
in_area = true;
}
@@ -49,7 +68,8 @@ bool daLv6CstaSw_c::areaCheck() {
}
int daLv6CstaSw_c::Execute() {
if (areaCheck() == true) {
bool result = areaCheck();
if (result == true) {
if (!fopAcM_isSwitch(this, mSwitch)) {
fopAcM_onSwitch(this, mSwitch);
}
@@ -63,10 +83,22 @@ int daLv6CstaSw_c::Execute() {
}
int daLv6CstaSw_c::Draw() {
#if DEBUG
if (l_HIO.show_range) {
g_env_light.settingTevStruct(16, &current.pos, &tevStr);
GXColor color = (GXColor){0, 0, 0xff, 0x80};
dDbVw_drawCylinderXlu(current.pos, scale.x * 100.0f, scale.y * 100.0f, color, 1);
}
#endif
return 1;
}
int daLv6CstaSw_c::Delete() {
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
@@ -79,17 +111,16 @@ static int daLv6CstaSw_Execute(daLv6CstaSw_c* i_this) {
}
static int daLv6CstaSw_Delete(daLv6CstaSw_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->Delete();
}
static int daLv6CstaSw_Create(fopAc_ac_c* i_this) {
return static_cast<daLv6CstaSw_c*>(i_this)->create();
daLv6CstaSw_c* cStaSw = static_cast<daLv6CstaSw_c*>(i_this);
int id = fopAcM_GetID(i_this);
return cStaSw->create();
}
daLv6CstaSw_HIO_c::~daLv6CstaSw_HIO_c() {}
static daLv6CstaSw_HIO_c l_HIO;
static actor_method_class l_daLv6CstaSw_Method = {
(process_method_func)daLv6CstaSw_Create, (process_method_func)daLv6CstaSw_Delete,
(process_method_func)daLv6CstaSw_Execute, (process_method_func)NULL,
+9 -2
View File
@@ -10,6 +10,8 @@
int daTagMagne_c::Create() {
if (mTagMagne != NULL) {
// "Multiple magnet cord(?) management tags are placed!"
OS_REPORT_ERROR("マグネコード管理タグが複数置かれています!\n");
return 0;
}
@@ -24,7 +26,7 @@ int daTagMagne_c::Create() {
int daTagMagne_c::create() {
fopAcM_ct(this, daTagMagne_c);
if (mTagMagne != NULL && mTagMagne->current.roomNo != current.roomNo) {
if (mTagMagne != NULL && fopAcM_GetRoomNo(mTagMagne) != fopAcM_GetRoomNo(this)) {
return cPhs_INIT_e;
}
@@ -32,6 +34,8 @@ int daTagMagne_c::create() {
return cPhs_ERROR_e;
}
OS_REPORT("TAG MAGNE PARAM=%x\n", fopAcM_GetParam(this));
return cPhs_COMPLEATE_e;
}
@@ -41,11 +45,14 @@ int daTagMagne_c::_delete() {
}
static void daTagMagne_Delete(daTagMagne_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->_delete();
}
static void daTagMagne_Create(fopAc_ac_c* i_this) {
((daTagMagne_c*)i_this)->create();
daTagMagne_c* magne = static_cast<daTagMagne_c*>(i_this);
int id = fopAcM_GetID(i_this);
magne->create();
}
static actor_method_class l_daTagMagne_Method = {
+7 -3
View File
@@ -64,12 +64,15 @@ int daTagMhint_c::create() {
}
static int daTagMhint_Create(fopAc_ac_c* i_this) {
return static_cast<daTagMhint_c*>(i_this)->create();
daTagMhint_c* mhint = static_cast<daTagMhint_c*>(i_this);
int id = fopAcM_GetID(i_this);
return mhint->create();
}
daTagMhint_c::~daTagMhint_c() {}
static int daTagMhint_Delete(daTagMhint_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagMhint_c();
return 1;
}
@@ -132,13 +135,14 @@ int daTagMhint_c::execute() {
} else if (eventInfo.checkCommandTalk()) {
if (!midna_p->checkShadowModeTalkWait()) {
if (field_0x56e == 0) {
mMsgFlow.init(this, shape_angle.z & 0xFFFF, 0, NULL);
mMsgFlow.init(this, (u16)shape_angle.z, 0, NULL);
field_0x56e = 1;
mDoAud_seStart(Z2SE_NAVI_TALK_START, NULL, 0, 0);
field_0x571 = 0;
} else if (mMsgFlow.doFlow(this, NULL, 0)) {
int sp28;
if (mMsgFlow.getEventId(&sp28) == 7) {
u16 eventId = mMsgFlow.getEventId(&sp28);
if (eventId == 7) {
dMeter2Info_setPauseStatus(1);
}
+95 -31
View File
@@ -7,14 +7,37 @@
#include "d/actor/d_a_tag_mist.h"
#include "d/d_com_inf_game.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
void daTagMist_c::offSw() {
u8 sw_no_num;
u8 top_sw_no;
class daTagMist_HIO_c : public mDoHIO_entry_c {
public:
daTagMist_HIO_c();
top_sw_no = daTagMist_prm::getTopSwNo(this);
sw_no_num = daTagMist_prm::getSwNoNum(this);
void genMessage(JORMContext*);
u8 show_range;
};
#if DEBUG
daTagMist_HIO_c l_HIO;
daTagMist_HIO_c::daTagMist_HIO_c() {
show_range = 0;
}
void daTagMist_HIO_c::genMessage(JORMContext* ctx) {
// "Fog range tag"
ctx->genLabel("霧の範囲タグ", 0);
// "Show range"
ctx->genCheckBox("範囲表示", &show_range, 1);
}
#endif
void daTagMist_c::offSw() {
u8 top_sw_no = daTagMist_prm::getTopSwNo(this);
u8 my_sw_no = daTagMist_prm::getMySwNo(this);
u8 sw_no_num = daTagMist_prm::getSwNoNum(this);
for (int i = 0; i < sw_no_num; i++) {
fopAcM_offSwitch(this, top_sw_no + i);
@@ -22,11 +45,8 @@ void daTagMist_c::offSw() {
}
void daTagMist_c::onMySw() {
u32 my_sw_no;
u32 top_sw_no;
top_sw_no = daTagMist_prm::getTopSwNo(this);
my_sw_no = daTagMist_prm::getMySwNo(this);
u8 top_sw_no = daTagMist_prm::getTopSwNo(this);
u8 my_sw_no = daTagMist_prm::getMySwNo(this);
if (my_sw_no != 0xFF) {
fopAcM_onSwitch(this, top_sw_no + my_sw_no);
@@ -34,11 +54,8 @@ void daTagMist_c::onMySw() {
}
BOOL daTagMist_c::isMySw() {
u32 my_sw_no;
u32 top_sw_no;
top_sw_no = daTagMist_prm::getTopSwNo(this);
my_sw_no = daTagMist_prm::getMySwNo(this);
u8 top_sw_no = daTagMist_prm::getTopSwNo(this);
u8 my_sw_no = daTagMist_prm::getMySwNo(this);
if (my_sw_no != 0xFF && fopAcM_isSwitch(this, top_sw_no + my_sw_no)) {
return TRUE;
@@ -60,10 +77,7 @@ int daTagMist_c::Create() {
mVertices[3].x = scale.x * -50.0f;
mVertices[3].z = scale.z * 50.0f;
mVertices[3].y = 0.0f;
mVertices[2].y = 0.0f;
mVertices[1].y = 0.0f;
mVertices[0].y = 0.0f;
mVertices[0].y = mVertices[1].y = mVertices[2].y = mVertices[3].y = 0.0f;
if (isMySw()) {
setPlayerNo(daTagMist_prm::getExitNo(this));
@@ -82,23 +96,26 @@ int daTagMist_c::create() {
field_0x5a2 = home.angle.x;
field_0x5a4 = home.angle.z;
home.angle.z = 0;
home.angle.x = 0;
current.angle.z = 0;
current.angle.x = 0;
shape_angle.z = 0;
shape_angle.x = 0;
home.angle.x = home.angle.z = 0;
current.angle.x = current.angle.z = 0;
shape_angle.x = shape_angle.z = 0;
}
if (!Create()) {
return cPhs_ERROR_e;
}
#if DEBUG
// "Fog range tag"
l_HIO.entryHIO("霧の範囲タグ");
#endif
return cPhs_COMPLEATE_e;
}
int daTagMist_c::execute() {
if (fopAcM_isSwitch(this, daTagMist_prm::getSwNo2(this))) {
u8 sw_no_2 = daTagMist_prm::getSwNo2(this);
if (fopAcM_isSwitch(this, sw_no_2)) {
return 1;
}
@@ -109,33 +126,76 @@ int daTagMist_c::execute() {
mDoMtx_stack_c::YrotS(-current.angle.y);
mDoMtx_stack_c::multVec(&player_dist, &player_dist);
u8 player_inside = (mVertices[0].x < player_dist.x && mVertices[0].z < player_dist.z) &&
(mVertices[2].x > player_dist.x && mVertices[2].z > player_dist.z);
u8 player_inside = mVertices[0].x < player_dist.x && mVertices[0].z < player_dist.z &&
mVertices[2].x > player_dist.x && mVertices[2].z > player_dist.z;
if (player_inside && !mPlayerTouched) {
offSw();
onMySw();
mPlayerNo = daTagMist_prm::getExitNo(this);
setPlayerNo(daTagMist_prm::getExitNo(this));
}
mPlayerTouched = player_inside;
return 1;
}
int daTagMist_c::_delete() {
int daTagMist_c::draw() {
#if DEBUG
if (l_HIO.show_range) {
GXColor color = {0, 0, 0x80, 0x80};
cXyz sp10[8];
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
sp10[0] = mVertices[0];
sp10[1] = mVertices[1];
sp10[2] = mVertices[3];
sp10[3] = mVertices[2];
sp10[4] = mVertices[0];
sp10[5] = mVertices[1];
sp10[6] = mVertices[3];
sp10[7] = mVertices[2];
for (int i = 0; i < 8; i++) {
mDoMtx_stack_c::multVec(&sp10[i], &sp10[i]);
}
for (int i = 0; i < 4; i++) {
sp10[i].y += 1000.0f;
}
dDbVw_drawCube8pXlu(sp10, color);
}
#endif
return 1;
}
int daTagMist_c::_delete() {
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
static int daTagMist_Draw(daTagMist_c* i_this) {
return i_this->draw();
}
static int daTagMist_Execute(daTagMist_c* i_this) {
return i_this->execute();
}
static int daTagMist_Delete(daTagMist_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static int daTagMist_Create(fopAc_ac_c* i_this) {
return static_cast<daTagMist_c*>(i_this)->create();
daTagMist_c* mist = static_cast<daTagMist_c*>(i_this);
int id = fopAcM_GetID(i_this);
return mist->create();
}
static actor_method_class l_daTagMist_Method = {
@@ -143,7 +203,11 @@ static actor_method_class l_daTagMist_Method = {
(process_method_func)daTagMist_Delete,
(process_method_func)daTagMist_Execute,
(process_method_func)NULL,
#if DEBUG
(process_method_func)daTagMist_Draw,
#else
(process_method_func)NULL,
#endif
};
actor_process_profile_definition g_profile_Tag_Mist = {
+15 -12
View File
@@ -8,13 +8,13 @@
int daTagMmsg_c::create() {
fopAcM_ct(this, daTagMmsg_c);
field_0x570 = fpcM_GetParam(this) & 0x3FF;
field_0x572 = (fpcM_GetParam(this) >> 10) & 0x3FF;
field_0x56b = (fpcM_GetParam(this) >> 29) & 1;
field_0x570 = fopAcM_GetParam(this) & 0x3FF;
field_0x572 = (fopAcM_GetParam(this) >> 10) & 0x3FF;
field_0x56b = (fopAcM_GetParam(this) >> 29) & 0x1;
field_0x568 = shape_angle.x;
field_0x569 = (shape_angle.x >> 8) & 0xFF;
if ((fpcM_GetParam(this) >> 30) & 1) {
if ((fopAcM_GetParam(this) >> 30) & 0x1) {
scale.x *= 10.0f;
scale.y *= 10.0f;
}
@@ -24,10 +24,9 @@ int daTagMmsg_c::create() {
mAttention = shape_angle.y;
if (!checkNoAttention()) {
s32 roomNo = fopAcM_GetRoomNo(this);
stage_arrow_data_class* arrowData =
&dComIfGp_getRoomArrow(roomNo)
->m_entries[dComIfGp_getRoomCamera(roomNo)->m_entries[mAttention].m_arrow_idx];
&dComIfGp_getRoomArrow(fopAcM_GetRoomNo(this))
->m_entries[dComIfGp_getRoomCamera(fopAcM_GetRoomNo(this))->m_entries[mAttention].m_arrow_idx];
eyePos.set(arrowData->posX, arrowData->posY, arrowData->posZ);
attention_info.position = eyePos;
}
@@ -37,18 +36,22 @@ int daTagMmsg_c::create() {
}
static int daTagMmsg_Create(fopAc_ac_c* i_this) {
return static_cast<daTagMmsg_c*>(i_this)->create();
daTagMmsg_c* mmsg = static_cast<daTagMmsg_c*>(i_this);
int id = fopAcM_GetID(i_this);
return mmsg->create();
}
daTagMmsg_c::~daTagMmsg_c() {}
static int daTagMmsg_Delete(daTagMmsg_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagMmsg_c();
return 1;
}
int daTagMmsg_c::execute() {
if (daPy_py_c::getMidnaActor() == NULL) {
daMidna_c* midna = daPy_py_c::getMidnaActor();
if (midna == NULL) {
return 1;
}
@@ -57,13 +60,13 @@ int daTagMmsg_c::execute() {
return 1;
}
if (field_0x569 != 0xFF && dComIfGs_isSwitch(field_0x569, fopAcM_GetHomeRoomNo(this))) {
if (field_0x569 != 0xFF && fopAcM_isSwitch(this, field_0x569)) {
fopAcM_delete(this);
return 1;
}
if (mUseFlg && !dComIfGp_event_runCheck() && field_0x56b && field_0x569 != 0xFF) {
dComIfGs_onSwitch(field_0x569, fopAcM_GetHomeRoomNo(this));
fopAcM_onSwitch(this, field_0x569);
fopAcM_delete(this);
return 1;
}
@@ -73,7 +76,7 @@ int daTagMmsg_c::execute() {
(fopAcM_searchPlayerDistanceXZ2(this) < field_0x574) &&
(field_0x570 == 0x3FF ||
dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[field_0x570])) &&
(field_0x568 == 0xFF || dComIfGs_isSwitch(field_0x568, fopAcM_GetHomeRoomNo(this))))
(field_0x568 == 0xFF || fopAcM_isSwitch(this, field_0x568)))
{
player->setMidnaMsgNum(this, shape_angle.z);
}
+52 -15
View File
@@ -5,12 +5,14 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_msg.h"
#include "d/actor/d_a_player.h"
#include "d/actor/d_a_tag_msg.h"
#include "d/d_com_inf_game.h"
#include "d/d_debug_viewer.h"
static int createHeapCallBack(fopAc_ac_c* i_this) {
return ((daTag_Msg_c*)i_this)->createHeap();
daTag_Msg_c* msg = (daTag_Msg_c*)i_this;
return msg->createHeap();
}
static char* l_resName = "TagMsg";
@@ -20,8 +22,20 @@ static char* l_evtNameTBL[2] = {
"SPEAK",
};
#if DEBUG
daTag_Msg_HIO_c::daTag_Msg_HIO_c() {
m = daTag_Msg_Param_c::m;
}
#endif
daTag_Msg_c::~daTag_Msg_c() {
dComIfG_resDelete(&mPhase, getResName());
#if DEBUG
if (mpHIO != NULL) {
mDoHIO_deleteChild(mpHIO->mChild);
}
#endif
}
int daTag_Msg_c::create() {
@@ -38,14 +52,18 @@ int daTag_Msg_c::create() {
if (!fopAcM_entrySolidHeap(this, createHeapCallBack, 0x10)) {
return cPhs_ERROR_e;
}
#if DEBUG
mpHIO->mChild = mDoHIO_createChild("メッセ-ジタグ", mpHIO);
#endif
}
return phase_state;
}
int daTag_Msg_c::createHeap() {
mParam = new daTag_Msg_Param_c();
if (mParam == NULL) {
mpHIO = new TAG_MSG_HIO_CLASS();
if (mpHIO == NULL) {
return 0;
}
@@ -53,6 +71,7 @@ int daTag_Msg_c::createHeap() {
}
int daTag_Msg_c::destroy() {
int id = fopAcM_GetID(this);
this->~daTag_Msg_c();
return 1;
}
@@ -128,6 +147,14 @@ int daTag_Msg_c::execute() {
}
int daTag_Msg_c::draw() {
#if DEBUG
if (mpHIO->m.mDebugAdjustON) {
cXyz sp0C(current.pos);
sp0C.y -= scale.y;
dDbVw_drawCylinderXlu(sp0C, scale.x, 2.0f * scale.y, (GXColor){0x80, 0x80, 0x80, 0x80}, 1);
}
#endif
return 1;
}
@@ -159,15 +186,15 @@ BOOL daTag_Msg_c::otherCheck() {
if (field_0x5dd) {
return 1;
}
} else {
s16 var_r28 = fopAcM_searchActorAngleY(this, daPy_getPlayerActorClass()) + 0x7FFF;
s16 angle_to_player = var_r28 - daPy_getPlayerActorClass()->current.angle.y;
if (angle_to_player < 0) {
angle_to_player = -angle_to_player;
}
s16 var_r28 = fopAcM_searchActorAngleY(this, daPy_getPlayerActorClass()) + 0x7FFF;
s16 angle_to_player = var_r28 - daPy_getPlayerActorClass()->current.angle.y;
if (angle_to_player < 0) {
angle_to_player = -angle_to_player;
return angle_to_player <= 0x1000;
}
return angle_to_player <= 0x1000;
}
char* daTag_Msg_c::getResName() {
@@ -176,14 +203,15 @@ char* daTag_Msg_c::getResName() {
void daTag_Msg_c::getParam() {
mOnSwitch = home.angle.x & 0xFF;
mOffSwitch = (home.angle.x >> 8) & 0xFF;
mOffSwitch = (home.angle.x & 0xFF00) >> 8;
mOnSaveLabel = fopAcM_GetParam(this) & 0xFFF;
mOffSaveLabel = (fopAcM_GetParam(this) >> 0xC) & 0xFFF;
mOffSaveLabel = (fopAcM_GetParam(this) & 0xFFF000) >> 12;
field_0x5dc = (fopAcM_GetParam(this) & 0x1000000) != 0;
field_0x5dd = (fopAcM_GetParam(this) & 0x2000000) != 0;
if ((home.angle.z & 0xFFFF) != 0) {
mFlowID = home.angle.z & 0xFFFF;
u16 var_r30 = (u16)home.angle.z;
if (var_r30 != 0) {
mFlowID = var_r30;
} else {
mFlowID = -1;
}
@@ -227,6 +255,15 @@ static int daTag_Msg_IsDelete(void* i_this) {
return 1;
}
#if DEBUG
daTag_Msg_HIO_c::~daTag_Msg_HIO_c() {
}
void daTag_Msg_HIO_c::genMessage(JORMContext* ctx) {
ctx->genCheckBox("デバグ描画ON ", &m.mDebugAdjustON, 1, 0, NULL, -1, -1, 0x200, 0x18);
}
#endif
void dummyString() {
DEAD_STRING("Timer");
}
+11 -14
View File
@@ -14,7 +14,7 @@
int daTagMstop_c::create() {
fopAcM_ct(this, daTagMstop_c);
field_0x56b = fopAcM_GetParam(this) >> 16;
field_0x56b = (fopAcM_GetParam(this) >> 16) & 0xFF;
field_0x56a = (fopAcM_GetParam(this) >> 24) & 0xF;
if (field_0x56a == 1 || field_0x56a == 2) {
@@ -40,23 +40,17 @@ int daTagMstop_c::create() {
field_0x572 = 0xFFFF;
}
f32 tmp = scale.x;
tmp *= 10000.0f * scale.x;
field_0x5c0 = tmp;
field_0x5c0 = scale.x * (scale.x * 10000.0f);
field_0x5c4 = current.pos.y + scale.y * 100.0f;
u16 param = fopAcM_GetParam(this);
csXyz pos_angle;
daNpcF_getPlayerInfoFromPlayerList(fopAcM_GetParam(this) & 0xFFFF, fopAcM_GetRoomNo(this),
field_0x5c8, pos_angle);
u8 idx = field_0x56b;
daNpcF_getPlayerInfoFromPlayerList(param, fopAcM_GetRoomNo(this), field_0x5c8, pos_angle);
if (!checkNoAttention()) {
s32 room = fopAcM_GetRoomNo(this);
stage_arrow_data_class* arrowData = &dComIfGp_getRoomArrow(room)
->m_entries[dComIfGp_getRoomCamera(room)->m_entries[idx].m_arrow_idx];
stage_arrow_data_class* arrowData = &dComIfGp_getRoomArrow(fopAcM_GetRoomNo(this))->
m_entries[dComIfGp_getRoomCamera(fopAcM_GetRoomNo(this))->
m_entries[field_0x56b].m_arrow_idx];
eyePos.set(arrowData->posX, arrowData->posY, arrowData->posZ);
attention_info.position = eyePos;
@@ -67,12 +61,15 @@ int daTagMstop_c::create() {
}
static int daTagMstop_Create(fopAc_ac_c* i_this) {
return static_cast<daTagMstop_c*>(i_this)->create();
daTagMstop_c* mstop = static_cast<daTagMstop_c*>(i_this);
int id = fopAcM_GetID(i_this);
return mstop->create();
}
daTagMstop_c::~daTagMstop_c() {}
static int daTagMstop_Delete(daTagMstop_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagMstop_c();
return 1;
}
+9 -6
View File
@@ -12,7 +12,7 @@
int daTagMwait_c::create() {
fopAcM_ct(this, daTagMwait_c);
mEnterSw = fopAcM_GetParam(this) >> 8;
mEnterSw = (fopAcM_GetParam(this) >> 8) & 0xFF;
if (fopAcM_isSwitch(this, mEnterSw)) {
return cPhs_ERROR_e;
@@ -39,12 +39,12 @@ int daTagMwait_c::create() {
scale *= 100.0f;
u32 wait_y_offset = (fopAcM_GetParam(this) >> 0x18) & 0xFF;
if (wait_y_offset == 0 || wait_y_offset == 0xFF) {
wait_y_offset = 0;
prm = (fopAcM_GetParam(this) >> 0x18) & 0xFF; // wait Y offset
if (prm == 0 || prm == 0xFF) {
prm = 0;
}
mWaitPosition.set(current.pos.x, current.pos.y + (wait_y_offset * 10.0f), current.pos.z);
mWaitPosition.set(current.pos.x, current.pos.y + (prm * 10.0f), current.pos.z);
attention_info.position.set(mWaitPosition.x, mWaitPosition.y + 220.0f, mWaitPosition.z);
eyePos.set(mWaitPosition.x, mWaitPosition.y + 150.0f, mWaitPosition.z);
@@ -54,12 +54,15 @@ int daTagMwait_c::create() {
}
static int daTagMwait_Create(fopAc_ac_c* i_this) {
return static_cast<daTagMwait_c*>(i_this)->create();
daTagMwait_c* mWait = static_cast<daTagMwait_c*>(i_this);
int id = fopAcM_GetID(i_this);
return mWait->create();
}
daTagMwait_c::~daTagMwait_c() {}
static int daTagMwait_Delete(daTagMwait_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagMwait_c();
return 1;
}
+22 -20
View File
@@ -5,6 +5,7 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_player.h"
#include "d/actor/d_a_tag_myna2.h"
#include "d/d_procname.h"
@@ -17,27 +18,25 @@ s32 daTagMyna2_c::create() {
}
s32 daTagMyna2_c::execute() {
if (!dComIfGp_event_runCheck()) {
if (!dComIfGs_isSwitch(mSwitchNo,fopAcM_GetRoomNo(this))) {
if ((dComIfGp_getPlayer(0)->current.pos - current.pos).absXZ() < getExtent()) {
s16 angle_y = (s16)fopAcM_searchPlayerAngleY(this);
csXyz actor_angle(0x1e,angle_y,0);
cXyz actor_pos = current.pos;
actor_pos.y += 1000.0f;
if (!dComIfGp_event_runCheck() &&
!dComIfGs_isSwitch(mSwitchNo,fopAcM_GetRoomNo(this)) &&
(daPy_getPlayerActorClass()->current.pos - current.pos).absXZ() < getExtent()) {
csXyz actor_angle(30, (s16)fopAcM_searchPlayerAngleY(this), 0);
cXyz actor_pos = current.pos;
actor_pos.y += 1000.0f;
if (fopAcM_gc_c::gndCheck(&actor_pos) != 0) {
actor_pos.y = fopAcM_gc_c::getGroundY();
} else {
actor_pos = current.pos;
}
if (fopAcM_gc_c::gndCheck(&actor_pos) != 0) {
actor_pos.y = fopAcM_gc_c::getGroundY();
} else {
actor_pos = current.pos;
}
if (mTimer == 0) {
s32 actor_create = fopAcM_create(PROC_MYNA2, (mSwitchNo << 8 | 0xffff0001), &actor_pos, fopAcM_GetRoomNo(this), &actor_angle, 0, 0xffffffff);
if (actor_create != 0xFFFFFFFF) {
dComIfGs_onSwitch(mSwitchNo,fopAcM_GetRoomNo(this));
}
}
u32 var_r29 = 0xffff0001;
if (mTimer == 0) {
if (fopAcM_create(PROC_MYNA2, var_r29 | mSwitchNo << 8, &actor_pos,
fopAcM_GetRoomNo(this), &actor_angle, 0, -1)
!= fpcM_ERROR_PROCESS_ID_e) {
dComIfGs_onSwitch(mSwitchNo,fopAcM_GetRoomNo(this));
}
}
}
@@ -52,7 +51,9 @@ s32 daTagMyna2_c::execute() {
}
static s32 daTagMyna2_Create(fopAc_ac_c* i_this) {
return static_cast<daTagMyna2_c*>(i_this)->create();
daTagMyna2_c* myna2 = static_cast<daTagMyna2_c*>(i_this);
int id = fopAcM_GetID(i_this);
return myna2->create();
}
static s32 daTagMyna2_Execute(daTagMyna2_c* i_this) {
@@ -60,6 +61,7 @@ static s32 daTagMyna2_Execute(daTagMyna2_c* i_this) {
}
static s32 daTagMyna2_Delete(daTagMyna2_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagMyna2_c();
return 1;
}
+13 -14
View File
@@ -25,18 +25,15 @@ int daTag_MynaLight_c::Delete() {
}
int daTag_MynaLight_c::Execute() {
u8 uVar1 = (int)(dComIfGs_getTime() * 0.06666667f) & 0xFF;
u8 turn_on_time = getTurnOnTime() & 0xFF;
u8 turn_off_time = getTurnOffTime() & 0xFF;
if (turn_off_time > turn_on_time) {
if (uVar1 >= (getTurnOnTime() & 0xFF) && uVar1 < (getTurnOffTime() & 0xFF)) {
u8 var_r30 = (int)(dComIfGs_getTime() * 0.06666667f);
if (getTurnOffTime() > getTurnOnTime()) {
if (var_r30 >= getTurnOnTime() && var_r30 < getTurnOffTime()) {
field_0x578 = true;
} else {
field_0x578 = false;
}
} else {
if (uVar1 >= (getTurnOffTime() & 0xFF) && uVar1 < (getTurnOnTime() & 0xFF)) {
if (var_r30 >= getTurnOffTime() && var_r30 < getTurnOnTime()) {
field_0x578 = false;
} else {
field_0x578 = true;
@@ -45,10 +42,10 @@ int daTag_MynaLight_c::Execute() {
if (mTurnOnFlag) {
if (dComIfGp_roomControl_getStayNo() != 0) {
mDoAud_seStartLevel(Z2SE_OBJ_MYNA_LIGHT_BURNING, (Vec*)&current.pos, 0,
dComIfGp_getReverb(dComIfGp_roomControl_getStayNo()));
mDoAud_seStartLevel(Z2SE_OBJ_MYNA_LIGHT_BURNING, &current.pos, 0,
dComIfGp_getReverb(dComIfGp_roomControl_getStayNo()));
} else {
mDoAud_seStartLevel(Z2SE_OBJ_MYNA_LIGHT_BURNING, (Vec*)&current.pos, 0, 0);
mDoAud_seStartLevel(Z2SE_OBJ_MYNA_LIGHT_BURNING, &current.pos, 0, 0);
}
}
return 1;
@@ -110,12 +107,14 @@ bool daTag_MynaLight_c::setTurnOnOffChange() {
return mTurnOnFlag;
}
u32 daTag_MynaLight_c::getTurnOnTime() {
return fopAcM_GetParamBit(this, 0, 5);
u8 daTag_MynaLight_c::getTurnOnTime() {
u8 param = fopAcM_GetParam(this) & 0x1F;
return param;
}
u32 daTag_MynaLight_c::getTurnOffTime() {
return fopAcM_GetParamBit(this, 5, 5);
u8 daTag_MynaLight_c::getTurnOffTime() {
u8 param = (fopAcM_GetParam(this) & 0x3E0) >> 5;
return param;
}
void daTag_MynaLight_c::initialize() {
+22 -4
View File
@@ -3,6 +3,7 @@
#include "d/actor/d_a_tag_pachi.h"
#include "d/d_com_inf_game.h"
#include "d/d_procname.h"
#include "d/d_s_play.h"
daTagPati_c::~daTagPati_c() {}
@@ -24,6 +25,7 @@ static dCcD_SrcCyl const l_sph_src = {
int daTagPati_c::create() {
fopAcM_ct(this, daTagPati_c);
OS_REPORT("-------------- TAG YAMI CREATE!!\n");
field_0x6E0 = get_prm();
mStts.Init(0xFF, 0xFF, this);
mCyl.Set(l_sph_src);
@@ -39,25 +41,41 @@ int daTagPati_c::Execute() {
}
void daTagPati_c::col_set() {
mCyl.SetR(1350.f);
f32 var_f31 = 1350.f;
if (field_0x6E0 == 0 || field_0x6E0 == 1) {
var_f31 += tREG_F(18);
} else if (field_0x6E0 == 2 || field_0x6E0 == 3) {
var_f31 += tREG_F(19);
}
mCyl.SetR(var_f31);
mCyl.SetH(300000.0f);
mCyl.SetC(home.pos);
dComIfG_Ccsp()->Set(&mCyl);
}
u32 daTagPati_c::chk_CoHit() {
return mCyl.ChkCoHit() ? 1 : 0;
if (mCyl.ChkCoHit()) {
OS_REPORT("----mtype = %d\n", field_0x6E0);
return 1;
} else {
return 0;
}
}
static int daTagPati_Create(fopAc_ac_c* i_this) {
return static_cast<daTagPati_c*>(i_this)->create();
daTagPati_c* pati = static_cast<daTagPati_c*>(i_this);
int id = fopAcM_GetID(i_this);
return pati->create();
}
static int daTagPati_Execute(fopAc_ac_c* i_this) {
return static_cast<daTagPati_c*>(i_this)->Execute();
daTagPati_c* pati = static_cast<daTagPati_c*>(i_this);
int id = fopAcM_GetID(i_this);
return pati->Execute();
}
static int daTagPati_Delete(daTagPati_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagPati_c();
return 1;
}
+10 -1
View File
@@ -12,6 +12,12 @@ daTagPoFire_HIO_c::daTagPoFire_HIO_c() {
unk_0x4 = 0x14;
}
#if DEBUG
void daTagPoFire_HIO_c::genMessage(JORMContext* ctx) {
// empty function
}
#endif
void daTagPoFire_c::setBaseMtx() {
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
@@ -48,11 +54,14 @@ static int daTagPoFire_Execute(daTagPoFire_c* i_this) {
}
static int daTagPoFire_Delete(daTagPoFire_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->Delete();
}
static int daTagPoFire_Create(fopAc_ac_c* i_this) {
return static_cast<daTagPoFire_c*>(i_this)->create();
daTagPoFire_c* poFire = static_cast<daTagPoFire_c*>(i_this);
int id = fopAcM_GetID(i_this);
return poFire->create();
}
daTagPoFire_HIO_c::~daTagPoFire_HIO_c() {}
+21 -13
View File
@@ -5,52 +5,60 @@
#include "d/d_procname.h"
void* daTag_Push_c::srchActor(void* param_0, void* param_1) {
daTag_Push_c* push = (daTag_Push_c*)param_0;
BOOL bVar1 = false;
if (param_0 != NULL && fopAcM_IsActor(param_0)) {
if (push != NULL && fopAcM_IsActor(push)) {
if (fopAcM_IsExecuting(fopAcM_GetID(param_0))) {
switch (((daTag_Push_c*)param_1)->getId()) {
int id = ((daTag_Push_c*)param_1)->getId();
switch (id) {
case 1:
bVar1 = fopAcM_GetName(param_0) == PROC_NPC_TARO;
bVar1 = fopAcM_GetName(push) == PROC_NPC_TARO;
break;
case 2:
bVar1 = fopAcM_GetName(param_0) == PROC_NPC_JAGAR;
bVar1 = fopAcM_GetName(push) == PROC_NPC_JAGAR;
break;
case 3:
bVar1 = fopAcM_GetName(param_0) == PROC_NPC_LEN;
bVar1 = fopAcM_GetName(push) == PROC_NPC_LEN;
break;
case 4:
bVar1 = fopAcM_GetName(param_0) == PROC_NPC_TARO;
bVar1 = fopAcM_GetName(push) == PROC_NPC_TARO;
break;
case 5:
bVar1 = fopAcM_GetName(param_0) == PROC_NPC_MARO;
bVar1 = fopAcM_GetName(push) == PROC_NPC_MARO;
break;
case 6:
bVar1 = fopAcM_GetName(param_0) == PROC_NPC_BESU;
bVar1 = fopAcM_GetName(push) == PROC_NPC_BESU;
break;
case 7:
bVar1 = fopAcM_GetName(param_0) == PROC_NPC_BOU;
bVar1 = fopAcM_GetName(push) == PROC_NPC_BOU;
break;
case 8:
bVar1 = fopAcM_GetName(param_0) == PROC_NPC_GRS;
bVar1 = fopAcM_GetName(push) == PROC_NPC_GRS;
break;
case 9:
bVar1 = fopAcM_GetName(param_0) == PROC_NPC_GRO;
bVar1 = fopAcM_GetName(push) == PROC_NPC_GRO;
break;
}
}
}
if (!bVar1) {
param_0 = NULL;
push = NULL;
}
return param_0;
return push;
}
int daTag_Push_c::create() {
int var_r29 = 0;
fopAcM_ct(this, daTag_Push_c);
scale.x *= 100.0f;
scale.y *= 100.0f;
scale.z = scale.x;
OS_REPORT("\t(%s:%d) PlayerNo:%d, BitSW:%02x, BitSW2:%02x, flowNo:%d<%08x>\n",
fopAcM_getProcNameString(this), getId(), getPlayerListNo(), getBitSW(), getBitSW2(),
getFlowNodeNo(), fopAcM_GetParam(this));
if (isDelete()) {
return cPhs_ERROR_e;
} else {
+232 -59
View File
@@ -4,14 +4,134 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_qs.h"
#include "SSystem/SComponent/c_math.h"
#include "d/actor/d_a_obj_carry.h"
#include "d/actor/d_a_player.h"
#include "d/d_cc_d.h"
#include "d/actor/d_a_tag_qs.h"
#include "d/d_a_item_static.h"
#include "d/d_save.h"
#include "d/d_cc_d.h"
#include "d/d_com_inf_game.h"
#include "SSystem/SComponent/c_math.h"
#include "d/d_debug_viewer.h"
#include "d/d_save.h"
class daObjTagQs_HIO_c : public mDoHIO_entry_c {
public:
daObjTagQs_HIO_c();
void genMessage(JORMContext*);
/* 0x08 */ f32 powerOutsideRadius;
/* 0x0C */ f32 safeArea;
/* 0x10 */ f32 powerInsideRadius;
/* 0x14 */ f32 powerCenter;
/* 0x18 */ f32 sinkholePowerOutsideRadius;
/* 0x1C */ f32 sinkholeSafeArea;
/* 0x20 */ f32 sinkholePowerInsideRadius;
/* 0x24 */ f32 sinkholePowerCenter;
/* 0x28 */ s16 startMorfFrame;
/* 0x2A */ s16 stopMorfFrame;
/* 0x2C */ f32 centralSinkSpeed;
/* 0x30 */ u16 flags;
};
#if DEBUG
daObjTagQs_HIO_c l_HIO;
#endif
#define TAG_QS_DEF_POWER_OUTSIDE_RADIUS 4.0f
#define TAG_QS_DEF_SAFE_AREA 0.8f
#define TAG_QS_DEF_POWER_INSIDE_RADIUS 6.0f
#define TAG_QS_DEF_POWER_CENTER 12.0f
#define TAG_QS_DEF_SINKHOLE_POWER_OUTSIDE_RADIUS 5.0f
#define TAG_QS_DEF_SINKHOLE_SAFE_AREA 0.5f
#define TAG_QS_DEF_SINKHOLE_POWER_INSIDE_RADIUS 10.0f
#define TAG_QS_DEF_SINKHOLE_POWER_CENTER 20.0f
#define TAG_QS_DEF_START_MORF_FRAME 30
#define TAG_QS_DEF_STOP_MORF_FRAME 30
#define TAG_QS_DEF_CENTRAL_SINK_SPEED 0.5f
#define TAG_QS_DEF_FLAGS 0
#if DEBUG
#define TAG_QS_POWER_OUTSIDE_RADIUS l_HIO.powerOutsideRadius
#define TAG_QS_SAFE_AREA l_HIO.safeArea
#define TAG_QS_POWER_INSIDE_RADIUS l_HIO.powerInsideRadius
#define TAG_QS_POWER_CENTER l_HIO.powerCenter
#define TAG_QS_SINKHOLE_POWER_OUTSIDE_RADIUS l_HIO.sinkholePowerOutsideRadius
#define TAG_QS_SINKHOLE_SAFE_AREA l_HIO.sinkholeSafeArea
#define TAG_QS_SINKHOLE_POWER_INSIDE_RADIUS l_HIO.sinkholePowerInsideRadius
#define TAG_QS_SINKHOLE_POWER_CENTER l_HIO.sinkholePowerCenter
#define TAG_QS_START_MORF_FRAME l_HIO.startMorfFrame
#define TAG_QS_STOP_MORF_FRAME l_HIO.stopMorfFrame
#define TAG_QS_CENTRAL_SINK_SPEED l_HIO.centralSinkSpeed
#define TAG_QS_FLAGS l_HIO.flags
#else
#define TAG_QS_POWER_OUTSIDE_RADIUS TAG_QS_DEF_POWER_OUTSIDE_RADIUS
#define TAG_QS_SAFE_AREA TAG_QS_DEF_SAFE_AREA
#define TAG_QS_POWER_INSIDE_RADIUS TAG_QS_DEF_POWER_INSIDE_RADIUS
#define TAG_QS_POWER_CENTER TAG_QS_DEF_POWER_CENTER
#define TAG_QS_SINKHOLE_POWER_OUTSIDE_RADIUS TAG_QS_DEF_SINKHOLE_POWER_OUTSIDE_RADIUS
#define TAG_QS_SINKHOLE_SAFE_AREA TAG_QS_DEF_SINKHOLE_SAFE_AREA
#define TAG_QS_SINKHOLE_POWER_INSIDE_RADIUS TAG_QS_DEF_SINKHOLE_POWER_INSIDE_RADIUS
#define TAG_QS_SINKHOLE_POWER_CENTER TAG_QS_DEF_SINKHOLE_POWER_CENTER
#define TAG_QS_START_MORF_FRAME TAG_QS_DEF_START_MORF_FRAME
#define TAG_QS_STOP_MORF_FRAME TAG_QS_DEF_STOP_MORF_FRAME
#define TAG_QS_CENTRAL_SINK_SPEED TAG_QS_DEF_CENTRAL_SINK_SPEED
#define TAG_QS_FLAGS TAG_QS_DEF_FLAGS
#endif
#if DEBUG
daObjTagQs_HIO_c::daObjTagQs_HIO_c() {
powerOutsideRadius = TAG_QS_DEF_POWER_OUTSIDE_RADIUS;
safeArea = TAG_QS_DEF_SAFE_AREA;
powerInsideRadius = TAG_QS_DEF_POWER_INSIDE_RADIUS;
powerCenter = TAG_QS_DEF_POWER_CENTER;
sinkholePowerOutsideRadius = TAG_QS_DEF_SINKHOLE_POWER_OUTSIDE_RADIUS;
sinkholeSafeArea = TAG_QS_DEF_SINKHOLE_SAFE_AREA;
sinkholePowerInsideRadius = TAG_QS_DEF_SINKHOLE_POWER_INSIDE_RADIUS;
sinkholePowerCenter = TAG_QS_DEF_SINKHOLE_POWER_CENTER;
startMorfFrame = TAG_QS_DEF_START_MORF_FRAME;
stopMorfFrame = TAG_QS_DEF_STOP_MORF_FRAME;
flags = TAG_QS_DEF_FLAGS;
centralSinkSpeed = TAG_QS_DEF_CENTRAL_SINK_SPEED;
}
void daObjTagQs_HIO_c::genMessage(JORMContext* ctx) {
// "Quicksand"
ctx->genLabel("流砂", 0);
// "Power (outside safety radius)"
ctx->genSlider("パワー(安全半径外)", &powerOutsideRadius, 0.0f, 100.0f);
// "Safety radius adjust"
ctx->genSlider("安全半径変更", &safeArea, 0.0f, 1.0f);
// "Power (inside safety radius)"
ctx->genSlider("パワー(安全半径)", &powerInsideRadius, 0.0f, 100.0f);
// "Power (center)"
ctx->genSlider("パワー(中心)", &powerCenter, 0.0f, 100.0f);
// "Quicksand (10x)" (sinkhole?)
ctx->genLabel("流砂(10倍)", 0);
// "Power (outside safety radius)"
ctx->genSlider("パワー(安全半径外)", &sinkholePowerOutsideRadius, 0.0f, 100.0f);
// "Safety radius adjust"
ctx->genSlider("安全半径変更", &sinkholeSafeArea, 0.0f, 1.0f);
// "Power (inside safety radius)"
ctx->genSlider("パワー(安全半径)", &sinkholePowerInsideRadius, 0.0f, 100.0f);
// "Power (center)"
ctx->genSlider("パワー(中心)", &sinkholePowerCenter, 0.0f, 100.0f);
// "Others"
ctx->genLabel("その他", 0);
// "Start interpolation frame"
ctx->genSlider("スタート補間フレーム", &startMorfFrame, 0, 120);
// "Stop interpolation frame"
ctx->genSlider("ストップ補間フレーム", &stopMorfFrame, 0, 120);
// "Draw"
ctx->genCheckBox("描画", &flags, 0x1);
// "Stop"
ctx->genCheckBox("停止", &flags, 0x2);
// "Central sink speed"
ctx->genSlider("中心沈み速度", &centralSinkSpeed, 0.0f, 10.0f);
}
#endif
static dCcD_SrcCyl l_cc_cyl_src = {
{
@@ -33,6 +153,12 @@ daTagQs_c::~daTagQs_c() {}
int daTagQs_c::create() {
fopAcM_ct(this, daTagQs_c);
#if DEBUG
// "Quicksand"
l_HIO.entryHIO("流砂");
#endif
f32 typeScale;
if (getType() == 0) {
typeScale = 1.0f;
@@ -50,137 +176,170 @@ int daTagQs_c::create() {
}
f32 daTagQs_c::getPower() {
return getType() == 0 ? 4.0f : 5.0f;
if (getType() == 0) {
return TAG_QS_POWER_OUTSIDE_RADIUS;
} else {
return TAG_QS_SINKHOLE_POWER_OUTSIDE_RADIUS;
}
}
f32 daTagQs_c::getSafeArea() {
return getType() == 0 ? 0.8f : 0.5f;
if (getType() == 0) {
return TAG_QS_SAFE_AREA;
} else {
return TAG_QS_SINKHOLE_SAFE_AREA;
}
}
f32 daTagQs_c::getPower80() {
return getType() == 0 ? 6.0f : 10.0f;
if (getType() == 0) {
return TAG_QS_POWER_INSIDE_RADIUS;
} else {
return TAG_QS_SINKHOLE_POWER_INSIDE_RADIUS;
}
}
f32 daTagQs_c::getCenterPower() {
return getType() == 0 ? 12.0f : 20.0f;
if (getType() == 0) {
return TAG_QS_POWER_CENTER;
} else {
return TAG_QS_SINKHOLE_POWER_CENTER;
}
}
f32 daTagQs_c::calcPower(f32 param_1, f32 param_2) {
f32 dVar12 = 1.0f;
if (getSwNo() != 0xff) {
if (fopAcM_isSwitch(this, getSwNo())) {
dVar12 = field_0x570 / 30.0f;
dVar12 = field_0x570 / (f32)TAG_QS_START_MORF_FRAME;
} else {
dVar12 = (30 - field_0x574) / 30.0f;
dVar12 = (TAG_QS_STOP_MORF_FRAME - field_0x574) / (f32)TAG_QS_STOP_MORF_FRAME;
}
}
if (param_2 > (param_1 * 0.8f)) {
if (param_2 > param_1 * TAG_QS_SAFE_AREA) {
return dVar12 * getPower();
}
return dVar12 *
((1.0f - (param_2 / (param_1 * getSafeArea()))) * (getCenterPower() - getPower80()) +
((1.0f - param_2 / (param_1 * getSafeArea())) * (getCenterPower() - getPower80()) +
getPower80());
}
static int hikiyose(cXyz* param_1, cXyz* param_2, cXyz* param_3, f32 param_4) {
cXyz cStack_44 = *param_1 - *param_2;
cXyz cStack_50(cStack_44);
cStack_50.y = 0.0f;
f32 dVar6 = fabsf(cStack_50.getSquareMag());
if (dVar6 < 4.0f) {
cXyz posDiff;
posDiff = *param_1 - *param_2;
cXyz posDiffLat(posDiff);
posDiffLat.y = 0.0f;
f32 dist;
if (fabsf(posDiffLat.getSquareMag()) < 4.0f) {
param_2->x = param_1->x + cM_rndFX(1.0f);
param_2->y -= 0.5f;
param_2->y -= TAG_QS_CENTRAL_SINK_SPEED;
param_2->z = param_1->z + cM_rndFX(1.0f);
param_3->y = param_2->y;
if (param_2->y < param_1->y - 100.0f) {
return 2;
}
return 1;
} else if (cStack_44.abs() < param_4) {
param_2->x = param_1->x;
param_2->y = param_1->y;
param_2->z = param_1->z;
} else {
cStack_44.normalize();
cStack_44 *= param_4;
*param_2 += cStack_44;
dist = posDiff.abs();
if (dist < param_4) {
param_2->x = param_1->x;
param_2->y = param_1->y;
param_2->z = param_1->z;
} else {
posDiff.normalize();
posDiff *= param_4;
*param_2 += posDiff;
}
}
return 0;
}
static void* search(void* param_1, void* param_2) {
UNUSED(param_2);
if (param_1 == NULL || !fopAcM_IsActor(param_1)) {
return NULL;
}
fopAc_ac_c* actor1 = (fopAc_ac_c*) param_1;
daTagQs_c* actor2 = (daTagQs_c*) param_2;
f32 dVar9 = actor2->current.pos.absXZ(actor1->current.pos);
if (dVar9 > actor2->field_0x568) {
daTagQs_c* qs = (daTagQs_c*)param_2;
fopAc_ac_c* target = (fopAc_ac_c*)param_1;
f32 latDist = qs->current.pos.absXZ(target->current.pos);
if (latDist > qs->field_0x568) {
return NULL;
}
if (actor2->current.pos.y - 110.0f > actor1->current.pos.y ||
actor2->current.pos.y + actor2->field_0x56c < actor1->current.pos.y)
if (qs->current.pos.y - 110.0f > target->current.pos.y ||
qs->current.pos.y + qs->field_0x56c < target->current.pos.y)
{
return NULL;
}
if (actor1->current.pos.y >
actor2->current.pos.y + (actor2->field_0x56c * dVar9) / (actor2->field_0x568 * 0.9f) + 20.0f)
if (target->current.pos.y >
qs->current.pos.y + qs->field_0x56c * latDist / (qs->field_0x568 * 0.9f) + 20.0f)
{
return NULL;
}
if (fopAcM_GetProfName(param_1) == PROC_ITEM) {
daItem_c* item = (daItem_c*)param_1;
item->getItemNo();
if (item->getItemNo() <= 3) {
int iVar3 = hikiyose(&actor2->current.pos, &actor1->current.pos, &actor1->old.pos,
actor2->calcPower(actor2->field_0x568, dVar9));
if (iVar3 == 1) {
daItem_c* item = (daItem_c*)target;
// somehow this condition is supposed to produce a double `li r0, 0x1` instruction,
// this only produces one and is likely a fakematch anyway
if (((u8)item->getItemNo(), true) && item->getItemNo() <= 3) {
int sp14 = hikiyose(&qs->current.pos, &item->current.pos, &item->old.pos,
qs->calcPower(qs->field_0x568, latDist));
if (sp14 == 1) {
item->startCtrl();
} else if (iVar3 == 2) {
fopAcM_delete(actor1);
} else if (sp14 == 2) {
fopAcM_delete(item);
}
}
return NULL;
}
if (fopAcM_GetProfName(param_1) == PROC_Obj_Carry) {
daObjCarry_c* carry = (daObjCarry_c*)param_1;
daObjCarry_c* carry = (daObjCarry_c*)target;
if (carry->getType() == 7 || carry->getType() == 1 || carry->getType() == 5) {
int iVar3 = hikiyose(&actor2->current.pos, &carry->current.pos, &carry->old.pos, actor2->calcPower(actor2->field_0x568, dVar9));
if (iVar3 == 1) {
int sp10 = hikiyose(&qs->current.pos, &carry->current.pos, &carry->old.pos,
qs->calcPower(qs->field_0x568, latDist));
if (sp10 == 1) {
carry->startCtrl();
} else if (iVar3 == 2) {
} else if (sp10 == 2) {
fopAcM_delete(carry);
}
}
return NULL;
}
if (param_1 == daPy_getPlayerActorClass()) {
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz local_58 = actor2->current.pos - player->current.pos;
if (local_58.getSquareMag() >= actor2->getPower()) {
s16 sVar6 = cM_atan2s(local_58.x, local_58.z);
cXyz posDiff = qs->current.pos - player->current.pos;
if (posDiff.getSquareMag() >= qs->getPower()) {
s16 yaw = cM_atan2s(posDiff.x, posDiff.z);
if (!player->checkPlayerFly()) {
player->setOutPower(actor2->calcPower(actor2->field_0x568, dVar9), sVar6, 0);
player->setOutPower(qs->calcPower(qs->field_0x568, latDist), yaw, 0);
}
}
return NULL;
}
return NULL;
}
int daTagQs_c::execute() {
fopAcM_Search(search, this);
if ((TAG_QS_FLAGS & 0x2) == 0) {
fopAcM_Search(search, this);
}
if (getSwNo() != 0xff) {
int bossLife;
int bossLife = 0;
if (fopAcM_isSwitch(this, getSwNo())) {
field_0x570++;
if (field_0x570 > 30) {
field_0x570 = 30;
if (field_0x570 > TAG_QS_START_MORF_FRAME) {
field_0x570 = TAG_QS_START_MORF_FRAME;
}
field_0x574 = 0;
bossLife = (field_0x570 * 100.0f) / 30.0f;
bossLife = (field_0x570 * 100.0f) / (f32)TAG_QS_START_MORF_FRAME;
if (getType() == 0) {
Z2GetAudioMgr()->seStartLevel(Z2SE_ENV_QUICKSAND_LOOP, &current.pos, 0,
dComIfGp_getReverb(fopAcM_GetRoomNo(this)), 1.0f,
@@ -188,11 +347,11 @@ int daTagQs_c::execute() {
}
} else {
field_0x574++;
if (field_0x574 > 30) {
field_0x574 = 30;
if (field_0x574 > TAG_QS_STOP_MORF_FRAME) {
field_0x574 = TAG_QS_STOP_MORF_FRAME;
}
field_0x570 = 0;
bossLife = 100.0f - field_0x574 * 100.0f / 30.0f;
bossLife = 100.0f - field_0x574 * 100.0f / (f32)TAG_QS_STOP_MORF_FRAME;
}
dComIfGs_BossLife_public_Set(bossLife);
} else {
@@ -206,6 +365,15 @@ int daTagQs_c::execute() {
}
int daTagQs_c::draw() {
if (TAG_QS_FLAGS & 0x1) {
GXColor color;
color.r = 0xff;
color.g = 0;
color.b = 0xff;
color.a = 0x80;
dDbVw_drawCylinderXlu(current.pos, field_0x568, field_0x56c, color, 1);
}
return 1;
}
@@ -218,6 +386,10 @@ static int daTagQs_Execute(daTagQs_c* i_this) {
}
static int daTagQs_IsDelete(daTagQs_c* i_this) {
UNUSED(i_this);
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
@@ -227,7 +399,8 @@ static int daTagQs_Delete(daTagQs_c* i_this) {
}
static int daTagQs_Create(fopAc_ac_c* i_this) {
return static_cast<daTagQs_c*>(i_this)->create();
daTagQs_c* qs = static_cast<daTagQs_c*>(i_this);
return qs->create();
}
static actor_method_class l_daTagQs_Method = {
+88 -14
View File
@@ -6,7 +6,44 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_ret_room.h"
#include "d/actor/d_a_player.h"
#include "d/d_debug_viewer.h"
class daTagRetRm_HIO_c : public mDoHIO_entry_c {
public:
daTagRetRm_HIO_c();
void genMessage(JORMContext*);
void setScale(const cXyz& i_scale) { scale = i_scale; };
cXyz scale;
u8 showTag;
};
#if DEBUG
daTagRetRm_HIO_c l_TAG_RET_ROOM_HIO;
#endif
daTagRetRm_HIO_c::daTagRetRm_HIO_c() {
// empty function
}
#if DEBUG
void daTagRetRm_HIO_c::genMessage(JORMContext* ctx) {
// "Return to room tag"
ctx->genLabel("____________部屋戻しタグ____________", 0);
// "Scale value X"
ctx->genSlider("スケール値X", &scale.x, 0.0f, 25.0f);
// "Scale value Y"
ctx->genSlider("スケール値Y", &scale.y, 0.0f, 25.0f);
// "Scale value Z"
ctx->genSlider("スケール値Z", &scale.z, 0.0f, 25.0f);
// "Display tag ON/OFF"
ctx->genCheckBox("Tag表示ON/OFF", &showTag, TRUE);
}
#endif
daTagRetRm_c::daTagRetRm_c() {}
@@ -15,14 +52,51 @@ daTagRetRm_c::~daTagRetRm_c() {}
int daTagRetRm_c::create() {
fopAcM_ct(this, daTagRetRm_c);
init();
#if DEBUG
// "Room return tag Lv7D"
l_TAG_RET_ROOM_HIO.entryHIO("部屋戻しタグLv7D");
l_TAG_RET_ROOM_HIO.setScale(scale);
l_TAG_RET_ROOM_HIO.showTag = FALSE;
#endif
return cPhs_COMPLEATE_e;
}
int daTagRetRm_c::Delete() {
#if DEBUG
l_TAG_RET_ROOM_HIO.removeHIO();
#endif
return 1;
}
int daTagRetRm_c::draw() {
#if DEBUG
if (l_TAG_RET_ROOM_HIO.showTag == TRUE) {
GXColor color = {0xff, 0, 0, 0x80};
cXyz sp10[8];
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
sp10[0].set(-field_0x56c, 0.0f, -field_0x574);
sp10[1].set(-field_0x56c, 0.0f, field_0x574);
sp10[2].set(field_0x56c, 0.0f, -field_0x574);
sp10[3].set(field_0x56c, 0.0f, field_0x574);
sp10[4].set(-field_0x56c, field_0x570, -field_0x574);
sp10[5].set(-field_0x56c, field_0x570, field_0x574);
sp10[6].set(field_0x56c, field_0x570, -field_0x574);
sp10[7].set(field_0x56c, field_0x570, field_0x574);
for (int i = 0; i < ARRAY_SIZE(sp10); i++) {
mDoMtx_stack_c::multVec(&sp10[i], &sp10[i]);
}
dDbVw_drawCube8pXlu(sp10, color);
}
#endif
return 1;
}
@@ -48,21 +122,21 @@ void daTagRetRm_c::init() {
field_0x578 = 0;
}
u8 daTagRetRm_c::chkPlyrInTag() {
cXyz pos;
if (dComIfGp_getPlayer(0) == NULL) {
return 0;
bool daTagRetRm_c::chkPlyrInTag() {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
if (player == NULL) {
return false;
}
cXyz pos = player->current.pos - current.pos;
mDoMtx_stack_c::YrotS(-current.angle.y);
mDoMtx_stack_c::multVec(&pos, &pos);
if (0 < pos.y && field_0x570 > pos.y && field_0x56c > pos.x && field_0x574 > pos.z &&
-field_0x56c < pos.x && -field_0x574 < pos.z)
{
return true;
} else {
pos = daPy_getPlayerActorClass()->current.pos - current.pos;
mDoMtx_stack_c::YrotS(-current.angle.y);
mDoMtx_stack_c::multVec(&pos, &pos);
if ((0 < pos.y) && (field_0x570 > pos.y) && (field_0x56c > pos.x) &&
(field_0x574 > pos.z) && (-field_0x56c < pos.x) && (-field_0x574 < pos.z))
{
return 1;
} else {
return 0;
}
return false;
}
}
+22 -19
View File
@@ -12,10 +12,14 @@ static char* l_arcName = "RvBack";
static char* l_evName = "RIVER_BACK";
static char* l_staffName = "rvback";
int daTagRiverBack_c::Create() {
mMapToolID = -1;
eventInfo.setArchiveName(l_arcName);
mEventID = dComIfGp_getEventManager().getEventIdx(this, l_evName, -1);
mEventID = (s16)dComIfGp_getEventManager().getEventIdx(this, l_evName, -1);
// "River flow reversal tag: evid<%d>tool<%d>"
OS_REPORT("川流れ戻しタグ:evid<%d>tool<%d>\n", mEventID, mMapToolID);
return 1;
}
@@ -23,8 +27,7 @@ int daTagRiverBack_c::create() {
fopAcM_ct(this, daTagRiverBack_c);
int phase = dComIfG_resLoad(&mPhase, l_arcName);
if (phase == cPhs_COMPLEATE_e) {
int result = Create();
if (!result) {
if (!Create()) {
return cPhs_ERROR_e;
}
}
@@ -32,13 +35,11 @@ int daTagRiverBack_c::create() {
}
int daTagRiverBack_c::execute() {
u8 swBit = getSwBit();
if (swBit != 0xFF && fopAcM_isSwitch(this, swBit) != 0) {
if (getSwbit() != 0xFF && fopAcM_isSwitch(this, getSwbit()) != 0) {
return 1;
}
u8 swBit2 = getSwBit2();
if (swBit2 != 0xFF && fopAcM_isSwitch(this, swBit2) == 0) {
if (getSwbit2() != 0xFF && fopAcM_isSwitch(this, getSwbit2()) == 0) {
return 1;
}
@@ -47,8 +48,6 @@ int daTagRiverBack_c::execute() {
return 1;
}
static char* l_staffName = "rvback";
void daTagRiverBack_c::event_proc_call() {
typedef void (daTagRiverBack_c::*actionFunc)();
static actionFunc l_func[] = {&daTagRiverBack_c::actionWait,
@@ -59,7 +58,8 @@ void daTagRiverBack_c::event_proc_call() {
}
void daTagRiverBack_c::actionWait() {
if (dComIfGp_checkPlayerStatus0(0, 0x100000) != 0) {
u32 result = dComIfGp_checkPlayerStatus0(0, 0x100000);
if (result != 0) {
mCount = 0;
setAction(ACTION_ORDER_EVENT_e);
fopAcM_orderOtherEventId(this, mEventID, mMapToolID, 0xFFFF, 0, 1);
@@ -72,7 +72,7 @@ void daTagRiverBack_c::actionOrderEvent() {
if (eventInfo.checkCommandDemoAccrpt()) {
setAction(ACTION_EVENT_e);
mStaffID = dComIfGp_evmng_getMyStaffId(l_staffName, NULL, 0);
player->mNoResetFlg0 |= 0x10000;
player->onDemoStreamAccept();
demoProc();
} else {
fopAcM_orderOtherEventId(this, mEventID, mMapToolID, 0xFFFF, 0, 1);
@@ -82,7 +82,7 @@ void daTagRiverBack_c::actionOrderEvent() {
void daTagRiverBack_c::actionEvent() {
daPy_py_c* player = daPy_getPlayerActorClass();
mCount += 1;
mCount += (s16)1;
if (dComIfGp_evmng_endCheck(mEventID)) {
setAction(ACTION_DEAD_e);
dComIfGp_event_reset();
@@ -96,34 +96,35 @@ void daTagRiverBack_c::actionEvent() {
void daTagRiverBack_c::actionDead() {}
static char* action_table[] = {"WAIT", "SCENE_CHG"};
int daTagRiverBack_c::demoProc() {
static char* action_table[] = {"WAIT", "SCENE_CHG"};
daPy_py_c* player = daPy_getPlayerActorClass();
int act_id = dComIfGp_evmng_getMyActIdx(mStaffID, action_table, ARRAY_SIZEU(action_table), 0, 0);
int* timer_p;
if (dComIfGp_evmng_getIsAddvance(mStaffID)) {
switch (act_id) {
case WAIT_e: {
int* timer_p = dComIfGp_evmng_getMyIntegerP(mStaffID, "Timer");
case WAIT_e:
timer_p = dComIfGp_evmng_getMyIntegerP(mStaffID, "Timer");
if (timer_p == NULL) {
mTimer = 1;
} else {
mTimer = *timer_p;
}
break;
}
case SCENE_CHG_e:
mDoAud_seStart(Z2SE_FORCE_BACK, 0, 0, 0);
}
}
switch (act_id) {
case WAIT_e:
if ((cLib_calcTimer(&mTimer) & 0xFF) == 0) {
if (cLib_calcTimer(&mTimer) == 0) {
dComIfGp_evmng_cutEnd(mStaffID);
}
break;
case SCENE_CHG_e:
dStage_changeScene(fopAcM_GetParamBit(this, 0, 8) & 0xFF, 0.0f, 0, fopAcM_GetRoomNo(this),
dStage_changeScene(getNextSceneNo(), 0.0f, 0, fopAcM_GetRoomNo(this),
0, -1);
break;
default:
@@ -143,10 +144,12 @@ static int daTagRiverBack_Execute(daTagRiverBack_c* i_this) {
}
static int daTagRiverBack_Delete(daTagRiverBack_c* i_this) {
fopAcM_RegisterDeleteID(i_this, "RiverBack");
return i_this->_delete();
}
static int daTagRiverBack_Create(daTagRiverBack_c* i_this) {
fopAcM_RegisterCreateID(i_this, "RiverBack");
return i_this->create();
}
+95 -13
View File
@@ -6,30 +6,112 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_rmbit_sw.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
class daTagRmbitSw_HIO_c : public mDoHIO_entry_c {
public:
daTagRmbitSw_HIO_c();
void setScale(const cXyz& i_scale);
void genMessage(JORMContext*);
cXyz scale;
u8 show_tag;
};
#if DEBUG
daTagRmbitSw_HIO_c l_RMBIT_HIO;
daTagRmbitSw_HIO_c::daTagRmbitSw_HIO_c() {
// empty function
}
void daTagRmbitSw_HIO_c::setScale(const cXyz& i_scale) {
scale = i_scale;
}
void daTagRmbitSw_HIO_c::genMessage(JORMContext* ctx) {
ctx->genLabel("____________部屋戻しタグ____________", 0);
ctx->genSlider("スケール値X", &scale.x, 0.0f, 25.0f);
ctx->genSlider("スケール値Y", &scale.y, 0.0f, 25.0f);
ctx->genSlider("スケール値Z", &scale.z, 0.0f, 25.0f);
ctx->genCheckBox("Tag表示ON/OFF", &show_tag, 0x1);
}
#endif
daTagRmbitSw_c::daTagRmbitSw_c() {}
daTagRmbitSw_c::~daTagRmbitSw_c() {}
int daTagRmbitSw_c::create() {
fopAcM_ct(this, daTagRmbitSw_c);
init();
#if DEBUG
// "Destination room bit change switch"
l_RMBIT_HIO.entryHIO("到達部屋ビット変更スイッチ");
l_RMBIT_HIO.setScale(scale);
l_RMBIT_HIO.show_tag = FALSE;
#endif
if (getArg1_RoomNo() == -1) {
JUT_WARN(165, "%s", " VisitedRoomNo == -1 !!!!!\n");
}
return cPhs_COMPLEATE_e;
}
int daTagRmbitSw_c::Delete() {
#if DEBUG
l_RMBIT_HIO.removeHIO();
#endif
return 1;
}
int daTagRmbitSw_c::draw() {
#if DEBUG
if (l_RMBIT_HIO.show_tag == TRUE) {
GXColor color = {0xff, 0, 0, 0x80};
cXyz sp10[8];
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
sp10[0].set(-field_0x56c, 0.0f, -field_0x574);
sp10[1].set(-field_0x56c, 0.0f, field_0x574);
sp10[2].set(field_0x56c, 0.0f, -field_0x574);
sp10[3].set(field_0x56c, 0.0f, field_0x574);
sp10[4].set(-field_0x56c, field_0x570, -field_0x574);
sp10[5].set(-field_0x56c, field_0x570, field_0x574);
sp10[6].set(field_0x56c, field_0x570, -field_0x574);
sp10[7].set(field_0x56c, field_0x570, field_0x574);
for (int i = 0; i < ARRAY_SIZE(sp10); i++) {
mDoMtx_stack_c::multVec(&sp10[i], &sp10[i]);
}
dDbVw_drawCube8pXlu(sp10, color);
}
#endif
return 1;
}
int daTagRmbitSw_c::execute() {
#if DEBUG
field_0x56c = l_RMBIT_HIO.scale.x * 50.0f;
field_0x570 = l_RMBIT_HIO.scale.y * 100.0f;
field_0x574 = l_RMBIT_HIO.scale.z * 50.0f;
#endif
if (chkPlyrInTag()) {
if (getArg3_CngBitFlg() == 1) {
if ((s32)getSwBit() == 0xff || fopAcM_isSwitch(this, getSwBit())) {
if (getSwBit() == 0xff || fopAcM_isSwitch(this, getSwBit())) {
if (getArg2_CngBitVal() == 1) {
if (getArg0_RoomSaveTableNo() == -1) {
dComIfGs_onVisitedRoom(getArg1_RoomNo());
@@ -79,22 +161,22 @@ void daTagRmbitSw_c::init() {
field_0x574 = scale.z * 50.0f;
}
u8 daTagRmbitSw_c::chkPlyrInTag() {
bool daTagRmbitSw_c::chkPlyrInTag() {
fopAc_ac_c* fopPos = dComIfGp_getPlayer(0);
if (!fopPos) {
return 0;
} else {
cXyz cPos = fopPos->current.pos - current.pos;
mDoMtx_stack_c::YrotS(-current.angle.y);
mDoMtx_stack_c::multVec(&cPos, &cPos);
if ((0.0f < cPos.y) && (field_0x570 > cPos.y) && (field_0x56c > cPos.x) &&
(field_0x574 > cPos.z) && (-field_0x56c < cPos.x) && (-field_0x574 < cPos.z))
{
return 1;
}
return false;
}
return 0;
cXyz cPos = fopPos->current.pos - current.pos;
mDoMtx_stack_c::YrotS(-current.angle.y);
mDoMtx_stack_c::multVec(&cPos, &cPos);
if (0.0f < cPos.y && field_0x570 > cPos.y && field_0x56c > cPos.x &&
field_0x574 > cPos.z && -field_0x56c < cPos.x && -field_0x574 < cPos.z)
{
return true;
}
return false;
}
int daTagRmbitSw_create(daTagRmbitSw_c* i_this) {
+2
View File
@@ -9,10 +9,12 @@
static int daTagSchedule_Create(fopAc_ac_c* i_this) {
daTagSchedule_c* schedule_tag = (daTagSchedule_c*)i_this;
int id = fopAcM_GetID(i_this);
return schedule_tag->create();
}
static int daTagSchedule_Delete(daTagSchedule_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagSchedule_c();
return 1;
}
+2
View File
@@ -43,10 +43,12 @@ static int daTagSetBall_Execute(daTagSetBall_c* i_this) {
}
static int daTagSetBall_Delete(daTagSetBall_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static int daTagSetBall_Create(daTagSetBall_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->create();
}
+86 -7
View File
@@ -8,8 +8,33 @@
#include "d/actor/d_a_tag_setrestart.h"
#include "d/d_com_inf_game.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
class daTagRestart_HIO_c : public mDoHIO_entry_c {
public:
daTagRestart_HIO_c();
void genMessage(JORMContext*);
u8 show_range;
};
#if DEBUG
daTagRestart_HIO_c l_HIO;
daTagRestart_HIO_c::daTagRestart_HIO_c() {
show_range = FALSE;
}
void daTagRestart_HIO_c::genMessage(JORMContext* ctx) {
// "Room return switch tag"
ctx->genLabel("部屋戻し切替タグ", 0);
// "Range display"
ctx->genCheckBox("範囲表示", &show_range, 0x1);
}
#endif
int daTagRestart_c::Create() {
field_0x56c[0].x = scale.x * -100.0f;
field_0x56c[0].z = scale.z * -100.0f;
@@ -23,10 +48,7 @@ int daTagRestart_c::Create() {
field_0x56c[3].x = scale.x * -100.0f;
field_0x56c[3].z = scale.z * 100.0f;
field_0x56c[3].y = 0.0f;
field_0x56c[2].y = 0.0f;
field_0x56c[1].y = 0.0f;
field_0x56c[0].y = 0.0f;
field_0x56c[0].y = field_0x56c[1].y = field_0x56c[2].y = field_0x56c[3].y = 0.0f;
mPlayerRoomNo = -1;
return 1;
@@ -39,6 +61,11 @@ int daTagRestart_c::create() {
return cPhs_ERROR_e;
}
#if DEBUG
// "Room return switch tag"
l_HIO.entryHIO("部屋戻し切替タグ");
#endif
return cPhs_COMPLEATE_e;
}
@@ -56,6 +83,7 @@ int daTagRestart_c::execute() {
int roomNo = dComIfGp_roomControl_getStayNo();
if (roomNo != mPlayerRoomNo) {
cXyz pos_offset;
cXyz restart_pos;
s16 restart_angle;
if (roomNo == daTagRestart_prm::getFRoomNo(this)) {
restart_angle = home.angle.y;
@@ -68,10 +96,14 @@ int daTagRestart_c::execute() {
pos_offset.y += 100.0f;
mDoMtx_stack_c::YrotS(home.angle.y);
mDoMtx_stack_c::multVec(&pos_offset, &pos_offset);
cXyz restart_pos = current.pos + pos_offset;
restart_pos = current.pos + pos_offset;
if (fopAcM_gc_c::gndCheck(&restart_pos)) {
restart_pos.y = fopAcM_gc_c::getGroundY();
} else {
// "There was no floor at the player's restart position!"
OS_REPORT_ERROR("プレイヤー部屋戻し位置に床がありませんでした!\n");
JUT_ASSERT(304, FALSE);
}
dComIfGs_setRestartRoom(restart_pos, restart_angle, fopAcM_GetRoomNo(player));
@@ -82,20 +114,63 @@ int daTagRestart_c::execute() {
return 1;
}
int daTagRestart_c::_delete() {
int daTagRestart_c::draw() {
#if DEBUG
if (l_HIO.show_range) {
GXColor color = {0x80, 0, 0, 0x80};
cXyz sp10[8];
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
sp10[0] = field_0x56c[0];
sp10[1] = field_0x56c[1];
sp10[2] = field_0x56c[3];
sp10[3] = field_0x56c[2];
sp10[4] = field_0x56c[0];
sp10[5] = field_0x56c[1];
sp10[6] = field_0x56c[3];
sp10[7] = field_0x56c[2];
for (int i = 0; i < ARRAY_SIZE(sp10); i++) {
mDoMtx_stack_c::multVec(&sp10[i], &sp10[i]);
}
for (int i = 0; i < 4; i++) {
sp10[i].y += 1000.0f;
}
dDbVw_drawCube8pXlu(sp10, color);
}
#endif
return 1;
}
int daTagRestart_c::_delete() {
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
static int daTagRestart_Draw(daTagRestart_c* i_this) {
return i_this->draw();
}
static int daTagRestart_Execute(daTagRestart_c* i_this) {
return i_this->execute();
}
static int daTagRestart_Delete(daTagRestart_c* i_this) {
("Delete -> TagRestart( =%d)\n", fopAcM_GetID(i_this));
return i_this->_delete();
}
static int daTagRestart_Create(fopAc_ac_c* i_this) {
return static_cast<daTagRestart_c*>(i_this)->create();
daTagRestart_c* restart = static_cast<daTagRestart_c*>(i_this);
fopAcM_RegisterCreateID(i_this, "Hasu");
return restart->create();
}
static actor_method_class l_daTagRestart_Method = {
@@ -103,7 +178,11 @@ static actor_method_class l_daTagRestart_Method = {
(process_method_func)daTagRestart_Delete,
(process_method_func)daTagRestart_Execute,
(process_method_func)NULL,
#if DEBUG
(process_method_func)daTagRestart_Draw,
#else
(process_method_func)NULL,
#endif
};
actor_process_profile_definition g_profile_Tag_Restart = {
+13 -7
View File
@@ -47,17 +47,17 @@ int daTag_ShopItem_c::create() {
if (getSwitchBit1() != 0xFF) {
if (dComIfGs_isSaveSwitch(getSwitchBit1())) {
mCreateTimer = 150;
// "Already Sold\n"
OS_REPORT("もう売れたよ\n");
mCreateTimer = 150;
}
}
if (getSwitchBit2() != 0xFF) {
if (!dComIfGs_isSaveSwitch(getSwitchBit2())) {
mCreateTimer = 150;
// "Not sold yet\n"
OS_REPORT("まだ売れない\n");
mCreateTimer = 150;
}
}
}
@@ -79,7 +79,7 @@ int daTag_ShopItem_c::Execute() {
if (mProcessID == fpcM_ERROR_PROCESS_ID_e) {
if (mCreateTimer == 0) {
mProcessID =
fopAcM_create(PROC_ShopItem, (getType() & 0xFF) | (getGroupID() << 0x1C),
fopAcM_create(PROC_ShopItem, getType() | (getGroupID() << 28),
&current.pos, fopAcM_GetRoomNo(this), &current.angle, NULL, -1);
} else {
@@ -126,19 +126,25 @@ int daTag_ShopItem_c::Draw() {
}
u8 daTag_ShopItem_c::getType() {
return fopAcM_GetParam(this) & 0xFF;
u8 result = fopAcM_GetParam(this);
return result;
}
u8 daTag_ShopItem_c::getGroupID() {
return fopAcM_GetParam(this) >> 0x1C;
u8 result = (fopAcM_GetParam(this) & 0xF0000000) >> 28;
return result;
}
u8 daTag_ShopItem_c::getSwitchBit1() {
return home.angle.z & 0xFF;
u16 angleZ = home.angle.z;
u8 result = angleZ;
return result;
}
u8 daTag_ShopItem_c::getSwitchBit2() {
return home.angle.z >> 8 & 0xFF;
u16 angleZ = home.angle.z;
u8 result = (angleZ & 0xFF00) >> 8;
return result;
}
void daTag_ShopItem_c::initialize() {
+8 -8
View File
@@ -33,19 +33,19 @@ int daTagSmkEmt_c::execute() {
return 1;
}
static u16 const PARTICLE_NAME[3] = {
0x87E7,
0x87E8,
0x87E9
};
void daTagSmkEmt_c::createSmkEmt() {
static u16 const PARTICLE_NAME[3] = {
dPa_RM(ID_ZF_S_L5CHIMSMK00),
dPa_RM(ID_ZF_S_L5CHIMSMK01),
dPa_RM(ID_ZF_S_L5CHIMSMK02),
};
cXyz pos(current.pos);
csXyz angle(0,0,0);
cXyz pos2(1.0f,1.0f,1.0f);
cXyz pos2(1.0f, 1.0f, 1.0f);
for (int i = 0; i < 3; i++) {
mParticles[i] = dComIfGp_particle_set(PARTICLE_NAME[i],&pos,&angle,&pos2);
mParticles[i] = dComIfGp_particle_set(PARTICLE_NAME[i], &pos, &angle, &pos2);
}
}
+85 -21
View File
@@ -6,8 +6,34 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_spinner.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
class daTagSpinner_HIO_c : public mDoHIO_entry_c {
public:
daTagSpinner_HIO_c();
void genMessage(JORMContext*);
u8 enable_debug_display;
};
#if DEBUG
daTagSpinner_HIO_c l_HIO;
daTagSpinner_HIO_c::daTagSpinner_HIO_c() {
enable_debug_display = FALSE;
}
void daTagSpinner_HIO_c::genMessage(JORMContext* ctx) {
// "Spinner suction tag"
ctx->genLabel("スピンナー吸い込みタグ", 0);
// "Debug display"
ctx->genCheckBox("デバッグ表示", &enable_debug_display, 0x1);
}
#endif
static int CheckCreateHeap(fopAc_ac_c* param_0) {
daTagSpinner_c* tag = (daTagSpinner_c*)param_0;
return tag->CreateHeap();
@@ -17,12 +43,15 @@ static void* search_spinner_sub(void* tag_0, void* tag_1) {
fopAc_ac_c* actor = (fopAc_ac_c*)tag_0;
daTagSpinner_c* actor2 = (daTagSpinner_c*)tag_1;
if ((actor != NULL) && (fopAcM_IsActor(actor) != NULL) && (fopAcM_GetProfName(actor) == 0xF2)) {
if ((actor->current.pos.absXZ(actor2->current.pos)) < (actor2->GetR())) {
if (actor != NULL &&
fopAcM_IsActor(actor) != NULL &&
fopAcM_GetProfName(actor) == PROC_SPINNER) {
f32 latDist = actor->current.pos.absXZ(actor2->current.pos);
if (latDist < actor2->GetR()) {
return actor;
}
}
return 0;
return NULL;
}
void daTagSpinner_c::initBaseMtx() {
@@ -30,8 +59,8 @@ void daTagSpinner_c::initBaseMtx() {
}
void daTagSpinner_c::setBaseMtx() {
MTXTrans(mDoMtx_stack_c::now, current.pos.x, current.pos.y, current.pos.z);
mDoMtx_ZXYrotM(mDoMtx_stack_c::now, shape_angle.x, shape_angle.y, shape_angle.z);
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
}
int daTagSpinner_c::Create() {
@@ -46,21 +75,27 @@ int daTagSpinner_c::CreateHeap() {
}
int daTagSpinner_c::create() {
int iVar1;
int iVar2;
fopAcM_ct(this, daTagSpinner_c);
if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0)) {
iVar2 = 5;
} else {
iVar1 = Create();
if (iVar1 == NULL) {
iVar2 = 5;
} else {
iVar2 = 4;
int var_r29 = cPhs_COMPLEATE_e;
if (var_r29 == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0)) {
return cPhs_ERROR_e;
}
if (!Create()) {
return cPhs_ERROR_e;
}
OS_REPORT("TAG_SPINNER PARAM:%x\n", fopAcM_GetParam(this));
#if DEBUG
// "Spinner suction tag"
l_HIO.entryHIO("スピンナー吸い込みタグ");
#endif
}
return iVar2;
return var_r29;
}
int daTagSpinner_c::execute() {
@@ -76,26 +111,55 @@ int daTagSpinner_c::execute() {
return 1;
}
int daTagSpinner_c::_delete() {
int daTagSpinner_c::draw() {
#if DEBUG
GXColor color = (GXColor){0, 0, 0x80, 0x80};
if (l_HIO.enable_debug_display) {
dDbVw_drawCylinderXlu(current.pos, mRadius, field_0x56c, color, 1);
}
#endif
return 1;
}
static int daTagSpinner_Execute(daTagSpinner_c* tag) {
return tag->execute();
int daTagSpinner_c::_delete() {
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
static int daTagSpinner_Execute(daTagSpinner_c* i_this) {
return i_this->execute();
}
static int daTagSpinner_Draw(daTagSpinner_c* i_this) {
return i_this->draw();
}
static int daTagSpinner_Delete(daTagSpinner_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static int daTagSpinner_Create(fopAc_ac_c* tag) {
return static_cast<daTagSpinner_c*>(tag)->create();
static int daTagSpinner_Create(fopAc_ac_c* i_this) {
daTagSpinner_c* spinner = static_cast<daTagSpinner_c*>(i_this);
int id = fopAcM_GetID(i_this);
return spinner->create();
}
static actor_method_class l_daTagSpinner_Method = {
(process_method_func)daTagSpinner_Create,
(process_method_func)daTagSpinner_Delete,
(process_method_func)daTagSpinner_Execute,
(process_method_func)NULL,
#if DEBUG
(process_method_func)daTagSpinner_Draw,
#else
(process_method_func)NULL,
#endif
};
+48 -32
View File
@@ -28,8 +28,8 @@ static dCcD_SrcCyl l_cylSrc = {
int daTagSppath_c::create() {
fopAcM_ct(this, daTagSppath_c);
mSwNo1 = fopAcM_GetParamBit(this, 8, 8);
mSwNo2 = fopAcM_GetParamBit(this, 16, 8);
mSwNo1 = (fopAcM_GetParam(this) >> 8) & 0xFF;
mSwNo2 = (fopAcM_GetParam(this) >> 16) & 0xFF;
s32 pathIndex = fopAcM_GetParam(this) & 0xff;
if (pathIndex == 0xff ||
@@ -53,53 +53,65 @@ int daTagSppath_c::create() {
}
static int daTagSppath_Create(fopAc_ac_c* i_this) {
return static_cast<daTagSppath_c*>(i_this)->create();
daTagSppath_c* spPath = static_cast<daTagSppath_c*>(i_this);
int id = fopAcM_GetID(i_this);
return spPath->create();
}
daTagSppath_c::~daTagSppath_c() {}
static int daTagSppath_Delete(daTagSppath_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagSppath_c();
return 1;
}
int daTagSppath_c::getNearPathPos(cXyz* i_result, dPath* i_path) {
daPy_py_c* py = daPy_getPlayerActorClass();
cXyz* pyCurPos = &py->current.pos;
cXyz* pyCurPos = &daPy_getPlayerActorClass()->current.pos;
dPnt* curPnt = i_path->m_points;
f32 bestDist = FLT_MAX;
int bestNo;
f32 distToSeg;
BOOL isValid;
cM3dGLin line;
cXyz nearestPointOnSeg;
cXyz pntDiff;
f32 distToSeg;
int bestNo;
f32 flatness;
f32 segLen;
dPnt* adjPnt;
for (int i = 0; i < i_path->m_num; i++, curPnt++) {
if (i != i_path->m_num - 1) {
line.set(curPnt[0].m_position, curPnt[1].m_position);
if (!dPath_ChkClose(i_path)) {
adjPnt = curPnt + 1;
if (i == 0) {
pntDiff.set(curPnt[1].m_position.x - curPnt[0].m_position.x,
curPnt[1].m_position.y - curPnt[0].m_position.y,
curPnt[1].m_position.z - curPnt[0].m_position.z);
f32 segLen = pntDiff.abs();
pntDiff.set(adjPnt->m_position.x - curPnt->m_position.x,
adjPnt->m_position.y - curPnt->m_position.y,
adjPnt->m_position.z - curPnt->m_position.z);
segLen = pntDiff.abs();
pntDiff.normalizeZP();
f32 flatness = pntDiff.absXZ();
if (flatness > 0.001f && segLen > 30.0f / flatness) {
line.GetStartP() = line.GetStart() + pntDiff * (30.0f / flatness);
flatness = pntDiff.absXZ();
if (flatness > 0.001f) {
flatness = 30.0f / flatness;
if (segLen > flatness) {
line.GetStartP() = line.GetStart() + pntDiff * flatness;
}
}
}
if (i == i_path->m_num - 2) {
pntDiff.set(curPnt[0].m_position.x - curPnt[1].m_position.x,
curPnt[0].m_position.y - curPnt[1].m_position.y,
curPnt[0].m_position.z - curPnt[1].m_position.z);
f32 segLen = pntDiff.abs();
pntDiff.set(curPnt->m_position.x - adjPnt->m_position.x,
curPnt->m_position.y - adjPnt->m_position.y,
curPnt->m_position.z - adjPnt->m_position.z);
segLen = pntDiff.abs();
pntDiff.normalizeZP();
f32 flatness = pntDiff.absXZ();
if (flatness > 0.001f && segLen > 30.0f / flatness) {
line.GetEndP() = line.GetEnd() + pntDiff * (30.0f / flatness);
flatness = pntDiff.absXZ();
if (flatness > 0.001f) {
flatness = 30.0f / flatness;
if (segLen > flatness) {
line.GetEndP() = line.GetEnd() + pntDiff * flatness;
}
}
}
}
@@ -117,7 +129,6 @@ int daTagSppath_c::getNearPathPos(cXyz* i_result, dPath* i_path) {
if (isValid == 0) {
nearestPointOnSeg = curPnt->m_position;
if (!dPath_ChkClose(i_path) && ((i == 0 || (i == i_path->m_num - 1)))) {
dPnt* adjPnt;
if (i == 0) {
adjPnt = curPnt + 1;
} else {
@@ -127,11 +138,14 @@ int daTagSppath_c::getNearPathPos(cXyz* i_result, dPath* i_path) {
pntDiff.set(adjPnt->m_position.x - curPnt->m_position.x,
adjPnt->m_position.y - curPnt->m_position.y,
adjPnt->m_position.z - curPnt->m_position.z);
f32 segLen = pntDiff.abs();
segLen = pntDiff.abs();
pntDiff.normalizeZP();
f32 flatness = pntDiff.absXZ();
if (flatness > 0.001f && segLen > 30.0f / flatness) {
nearestPointOnSeg += pntDiff * (30.0f / flatness);
flatness = pntDiff.absXZ();
if (flatness > 0.001f) {
flatness = 30.0f / flatness;
if (segLen > flatness) {
nearestPointOnSeg += pntDiff * flatness;
}
}
}
}
@@ -157,12 +171,14 @@ int daTagSppath_c::execute() {
}
dPath* path = mpInitPath;
cXyz nearestPointOnPath;
f32 bestDist = FLT_MAX;
f32 dist;
int no;
for (; path != NULL; path = dPath_GetNextRoomPath(path, fopAcM_GetRoomNo(this))) {
cXyz nearestPointOnPath;
int no = getNearPathPos(&nearestPointOnPath, path);
f32 dist = nearestPointOnPath.abs2(py->current.pos);
no = getNearPathPos(&nearestPointOnPath, path);
dist = nearestPointOnPath.abs2(py->current.pos);
if (dist < bestDist) {
bestDist = dist;
current.pos = nearestPointOnPath;
@@ -172,8 +188,7 @@ int daTagSppath_c::execute() {
}
if (mpBestPath->field_0x4 == 0) {
u32 swNo = mpBestPath->field_0x6;
if (swNo == 0xff || fopAcM_isSwitch(this, swNo) == 0) {
if (mpBestPath->field_0x6 == 0xff || fopAcM_isSwitch(this, mpBestPath->field_0x6) == 0) {
field_0x6e8 = 1;
} else {
field_0x6e8 = 2;
@@ -182,7 +197,8 @@ int daTagSppath_c::execute() {
field_0x6e8 = 0;
}
mCyl.SetC(cXyz(current.pos.x, current.pos.y - mHeight * 0.5f, current.pos.z));
cXyz sp10(current.pos.x, current.pos.y - mHeight * 0.5f, current.pos.z);
mCyl.SetC(sp10);
dComIfG_Ccsp()->Set(&mCyl);
return 1;
+73 -4
View File
@@ -6,9 +6,41 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_spring.h"
#include "d/actor/d_a_player.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
class daTagSpring_HIO_c : public mDoHIO_entry_c {
public:
daTagSpring_HIO_c();
void genMessage(JORMContext*);
u8 draw_range;
u8 recovery_time;
u8 field_0x8;
};
daTagSpring_HIO_c::daTagSpring_HIO_c() {
draw_range = 0;
recovery_time = 30;
field_0x8 = 1;
}
#if DEBUG
daTagSpring_HIO_c l_HIO;
void daTagSpring_HIO_c::genMessage(JORMContext* ctx) {
// "Spirit spring"
ctx->genLabel("精霊の泉", 0);
// "Draw range"
ctx->genCheckBox("範囲描画", &draw_range, 1);
// "Recovery time"
ctx->genSlider("回復時間", &recovery_time, 0, 200);
}
#endif
void daTagSpring_c::initBaseMtx() {
setBaseMtx();
}
@@ -30,7 +62,11 @@ int daTagSpring_c::create() {
return cPhs_ERROR_e;
}
fopAcM_GetParam(this);
OS_REPORT("SPRING PARAM:%x\n", fopAcM_GetParam(this));
#if DEBUG
l_HIO.entryHIO("精霊の泉");
#endif
return cPhs_COMPLEATE_e;
}
@@ -49,40 +85,73 @@ int daTagSpring_c::execute() {
if (checkArea() && fopAcM_wt_c::waterCheck(&player_p->current.pos) &&
(!dComIfGp_checkPlayerStatus0(0, 0x100000) &&
fopAcM_wt_c::mWaterY > player_p->current.pos.y ||
fopAcM_wt_c::getWaterY() > player_p->current.pos.y ||
dComIfGp_checkPlayerStatus0(0, 0x100000)))
{
if (mTimer != 0) {
mTimer--;
} else {
#if DEBUG
mTimer = l_HIO.recovery_time;
#else
mTimer = 30;
#endif
dComIfGp_setItemLifeCount(1.0f, 1);
}
} else {
#if DEBUG
mTimer = l_HIO.recovery_time;
#else
mTimer = 30;
#endif
}
return 1;
}
u8 daTagSpring_c::checkArea() {
bool daTagSpring_c::checkArea() {
fopAc_ac_c* player_p = daPy_getPlayerActorClass();
return player_p->current.pos.absXZ(current.pos) < (scale.x * 1000);
if (player_p->current.pos.absXZ(current.pos) < (scale.x * 1000.0f)) {
return 1;
} else {
return 0;
}
}
int daTagSpring_c::draw() {
#if DEBUG
if (l_HIO.draw_range) {
GXColor color = (GXColor){0, 0, 0xff, 0x80};
dDbVw_drawCylinderXlu(current.pos, scale.x * 1000.0f, 100.0f, color, 1);
}
#endif
return 1;
}
int daTagSpring_c::_delete() {
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
static int daTagSpring_Draw(daTagSpring_c* i_this) {
return i_this->draw();
}
static int daTagSpring_Execute(daTagSpring_c* i_this) {
return i_this->execute();
}
static int daTagSpring_Delete(daTagSpring_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->_delete();
}
static int daTagSpring_Create(daTagSpring_c* i_this) {
int id = fopAcM_GetID(i_this);
return i_this->create();
}
+15 -23
View File
@@ -26,7 +26,8 @@ int daTag_SSDrink_c::Delete() {
}
int daTag_SSDrink_c::Execute() {
if (chkEvent()) {
int eventResult = chkEvent();
if (eventResult) {
if (mProcessFunc) {
(this->*mProcessFunc)(0);
}
@@ -40,8 +41,9 @@ int daTag_SSDrink_c::Draw() {
return 1;
}
int daTag_SSDrink_c::getTypeFromParam() {
switch (fopAcM_GetParamBit(this, 0, 4)) {
u8 daTag_SSDrink_c::getTypeFromParam() {
u8 param = fopAcM_GetParam(this) & 0xF;
switch (param) {
case 0:
field_0x5D3 = 0x69;
return 0;
@@ -70,28 +72,18 @@ int daTag_SSDrink_c::getTypeFromParam() {
}
u8 daTag_SSDrink_c::getSwitchFromParam() {
return fopAcM_GetParamBit(this, 4, 8);
u8 result = (fopAcM_GetParam(this) & 0xFF0) >> 4;
return result;
}
u16 daTag_SSDrink_c::getFlowNodeNum() {
u16 num = home.angle.x;
bool bVar1 = false;
if (num == 0xFFFF || num == 0) {
bVar1 = true;
}
u16 num2;
if (!bVar1) {
num2 = num;
} else {
num2 = 0xFFFF;
}
return num2 & 0xFFFF;
u16 angleX = home.angle.x;
return angleX == 0xFFFF || angleX == 0 ? 0xFFFF : angleX;
}
u16 daTag_SSDrink_c::getValue() {
return fopAcM_GetParamBit(this, 12, 16);
u16 result = (fopAcM_GetParam(this) & 0xFFFF000) >> 12;
return result;
}
void daTag_SSDrink_c::restart() {
@@ -117,7 +109,7 @@ int daTag_SSDrink_c::setProcess(ProcessFunc i_processFunc) {
int retVal = 0;
if (checkProcess(i_processFunc)) {
return 0;
return retVal;
} else {
mEventType = 2;
if (mProcessFunc) {
@@ -167,7 +159,7 @@ int daTag_SSDrink_c::chkEvent() {
}
int daTag_SSDrink_c::orderEvent() {
if (!dComIfGp_getLinkPlayer()->checkWolf() && fopAcM_isSwitch(this, getSwitchFromParam()) &&
if (!daPy_py_c::checkNowWolf() && fopAcM_isSwitch(this, getSwitchFromParam()) &&
field_0x5D3 != 0x60 && getFlowNodeNum() != 0xFFFF)
{
attention_info.flags = (fopAc_AttnFlag_TALKREAD_e | fopAc_AttnFlag_SPEAK_e);
@@ -176,7 +168,7 @@ int daTag_SSDrink_c::orderEvent() {
}
if (attention_info.flags == (fopAc_AttnFlag_TALKREAD_e | fopAc_AttnFlag_SPEAK_e)) {
if (fopAcM_searchPlayerDistanceXZ(this) <= 160.0f && fopAcM_seenPlayerAngleY() <= 0x2000) {
if (fopAcM_searchPlayerDistanceXZ(this) <= 160.0f && fopAcM_seenPlayerAngleY(this) <= 0x2000) {
attention_info.distances[fopAc_attn_TALK_e] = 0x9D;
attention_info.distances[fopAc_attn_SPEAK_e] = 0x9D;
eventInfo.onCondition(1);
@@ -192,7 +184,7 @@ int daTag_SSDrink_c::wait(void* param_0) {
if (!eventInfo.checkCommandCatch()) {
if (fopAcM_isSwitch(this, getSwitchFromParam())) {
if (fopAcM_searchPlayerDistanceXZ(this) <= 160.0f &&
fopAcM_seenPlayerAngleY() <= 0x2000)
fopAcM_seenPlayerAngleY(this) <= 0x2000)
{
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz local_28 = attention_info.position - player->attention_info.position;
+193 -122
View File
@@ -5,8 +5,25 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_player.h"
#include "d/actor/d_a_tag_statue_evt.h"
#include "d/d_com_inf_game.h"
#include "d/d_debug_viewer.h"
class daTagStatue_HIO_c : public mDoHIO_entry_c {
public:
daTagStatue_HIO_c();
void genMessage(JORMContext*);
f32 check_range;
f32 event_trigger_range;
u8 show_range;
};
#if DEBUG
daTagStatue_HIO_c l_HIO;
#endif
static int CheckCreateHeap(fopAc_ac_c* i_this) {
daTagStatue_c* tag_statue = static_cast<daTagStatue_c*>(i_this);
@@ -14,8 +31,9 @@ static int CheckCreateHeap(fopAc_ac_c* i_this) {
}
// Returns ID of Owl Statue corresponding to tag
static void* s_s_sub(void* i_proc, void* unused) {
if (fopAc_IsActor(i_proc) && fopAcM_GetName(i_proc) == PROC_CSTAF) {
static void* s_s_sub(void* i_proc, void* param_1) {
UNUSED(param_1);
if (fopAcM_IsActor(i_proc) && fopAcM_GetName(i_proc) == PROC_CSTAF) {
return i_proc;
}
@@ -36,15 +54,6 @@ static const u16 l_event_bit[6] = {
dSv_event_flag_c::F_0812, /* N/A - N/A */
};
void daTagStatue_c::setBaseMtx() {
const cXyz& current_pos = fopAcM_GetPosition(this);
mDoMtx_stack_c::transS(current_pos.x, 1.0f + current_pos.y, current_pos.z);
const csXyz& shape_angle = *fopAcM_GetShapeAngle_p(this);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mpModel->setBaseTRMtx(mDoMtx_stack_c::now);
}
static char* l_arcName = "Obj_cs_f";
static u16 l_eff_id[3] = {
@@ -74,19 +83,42 @@ static cull_box l_cull_box = {
{300.0f, 400.0f, 300.0f} // Max
};
#if DEBUG
daTagStatue_HIO_c::daTagStatue_HIO_c() {
check_range = 120.0f;
event_trigger_range = 100.0f;
show_range = 0;
}
void daTagStatue_HIO_c::genMessage(JORMContext* ctx) {
// "Sky Character tag"
ctx->genLabel("天空文字タグ", 0, 0);
ctx->genCheckBox("範囲表示", &show_range, 1);
// "Stone statue check range"
ctx->genSlider("石像チェック範囲", &check_range, 0.0f, 1000.0f);
// "Event trigger range"
ctx->genSlider("イベント起動範囲", &event_trigger_range, 0.0f, 1000.0f);
}
#endif
void daTagStatue_c::setBaseMtx() {
mDoMtx_stack_c::transS(current.pos.x, 1.0f + current.pos.y, current.pos.z);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
}
cPhs__Step daTagStatue_c::Create() {
if(fopAcM_isSwitch(this, getSwbit2())) {
if (fopAcM_isSwitch(this, getSwbit2())) {
// Player already obtained Sky Character from this tag
setAction(ACTION_DEAD_e);
mpGlowingSkyCharacterBrk->setFrame(0.0f);
mpGlowingSkyCharacterBrk->setPlaySpeed(0.0f);
}
else {
if(fopAcM_isSwitch(this, getSwbit())) {
} else {
if (fopAcM_isSwitch(this, getSwbit())) {
setParticle();
mpGlowingSkyCharacterBrk->setFrame(mpGlowingSkyCharacterBrk->getEndFrame());
}
else {
} else {
mpGlowingSkyCharacterBrk->setFrame(0.0f);
mpGlowingSkyCharacterBrk->setPlaySpeed(0.0f);
}
@@ -94,49 +126,56 @@ cPhs__Step daTagStatue_c::Create() {
setAction(ACTION_WAIT_e);
}
mpPlatformCircleBtk->setFrame(static_cast<f32>(mSkyCharacterEventBitIdIndex));
mpPlatformCircleBtk->setFrame(mSkyCharacterEventBitIdIndex);
initBaseMtx();
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
fopAcM_setCullSizeBox(this, l_cull_box.min.x, l_cull_box.min.y, l_cull_box.min.z, l_cull_box.max.x, l_cull_box.max.y, l_cull_box.max.z);
fopAcM_setCullSizeBox(this, l_cull_box.min.x, l_cull_box.min.y, l_cull_box.min.z,
l_cull_box.max.x, l_cull_box.max.y, l_cull_box.max.z);
char* ev_arc_name = l_evArcName[mSkyCharacterEventBitIdIndex];
if(!ev_arc_name) {
if (!l_evArcName[mSkyCharacterEventBitIdIndex]) {
eventInfo.setArchiveName(l_arcName);
}
else {
eventInfo.setArchiveName(ev_arc_name);
} else {
eventInfo.setArchiveName(l_evArcName[mSkyCharacterEventBitIdIndex]);
}
mMapToolId = 255;
mEventId = dComIfGp_getPEvtManager()->getEventIdx(this, l_eventName[mSkyCharacterEventBitIdIndex], 0xFF);
mEventId = (int)dComIfGp_getEventManager().
getEventIdx(this, l_eventName[mSkyCharacterEventBitIdIndex], 0xFF);
mTreasureDemoItemId = -1;
mItemId = -1;
mOwlStatueId = -1;
return cPhs_LOADING_e;
}
int daTagStatue_c::CreateHeap() {
J3DModelData* model_data = static_cast<J3DModelData*>(dComIfG_getObjectRes(l_arcName, 6));
mpModel = mDoExt_J3DModel__create(model_data, 0x00080000, 0x11000284);
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(l_arcName, 6));
JUT_ASSERT(277, modelData != NULL)
mpModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000284);
if(!mpModel) return 0;
if (!mpModel) {
return 0;
}
J3DAnmTextureSRTKey* btk = reinterpret_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(l_arcName, 12));
J3DAnmTextureSRTKey* pbtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(l_arcName, 12);
JUT_ASSERT(291, pbtk != NULL);
mpPlatformCircleBtk = new mDoExt_btkAnm();
if(!mpPlatformCircleBtk || !mpPlatformCircleBtk->init(model_data, btk, 1, 0, 1.0f, 0, -1))
if (!mpPlatformCircleBtk || !mpPlatformCircleBtk->init(modelData, pbtk, 1, 0, 1.0f, 0, -1)) {
return 0;
}
J3DAnmTevRegKey* brk = reinterpret_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_arcName, 9));
J3DAnmTevRegKey* pbrk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(l_arcName, 9);
JUT_ASSERT(303, pbrk != NULL);
mpGlowingSkyCharacterBrk = new mDoExt_brkAnm();
if(!mpGlowingSkyCharacterBrk || !mpGlowingSkyCharacterBrk->init(model_data, brk, 1, 0, 1.0f, 0, -1))
if (!mpGlowingSkyCharacterBrk ||
!mpGlowingSkyCharacterBrk->init(modelData, pbrk, 1, 0, 1.0f, 0, -1)) {
return 0;
}
return 1;
}
@@ -144,40 +183,50 @@ int daTagStatue_c::CreateHeap() {
cPhs__Step daTagStatue_c::create() {
fopAcM_ct(this, daTagStatue_c);
mSkyCharacterEventBitIdIndex = fopAcM_GetParamBit(this, 8, 4);
mSkyCharacterEventBitIdIndex = getType();
int phase;
if(l_evArcName[mSkyCharacterEventBitIdIndex]) {
if (l_evArcName[mSkyCharacterEventBitIdIndex]) {
phase = dComIfG_resLoad(&mEvArcPhase, l_evArcName[mSkyCharacterEventBitIdIndex]);
if(phase != cPhs_COMPLEATE_e)
if (phase != cPhs_COMPLEATE_e) {
return static_cast<cPhs__Step>(phase);
}
}
phase = dComIfG_resLoad(&mArcPhase, l_arcName);
if(phase == cPhs_COMPLEATE_e) {
if(!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x1100))
if (phase == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x1100)) {
return cPhs_ERROR_e;
}
if(Create() == cPhs_INIT_e)
if (Create() == cPhs_INIT_e) {
return cPhs_ERROR_e;
}
#if DEBUG
// "Sky Character tag"
l_HIO.entryHIO("天空文字タグ");
#endif
}
return static_cast<cPhs__Step>(phase);
}
int daTagStatue_c::execute() {
if(static_cast<u32>(mOwlStatueId + (1 << 16)) == 0xFFFF) {
base_process_class* found_owl_statue = fpcEx_Search(s_s_sub, this);
if(found_owl_statue) {
if (static_cast<u32>(mOwlStatueId + (1 << 16)) == 0xFFFF) {
base_process_class* found_owl_statue = fpcM_Search(s_s_sub, this);
if (found_owl_statue) {
mOwlStatueId = fopAcM_GetID(found_owl_statue);
// "Sky Character tag: a stone statue was discovered!"
OS_REPORT("天空文字タグ:石像発見しました!ID=%d\n", mOwlStatueId);
}
}
event_proc_call();
setBaseMtx();
if(mpGlowingSkyCharacterBrk) {
if (mpGlowingSkyCharacterBrk) {
mpGlowingSkyCharacterBrk->play();
}
@@ -191,20 +240,21 @@ void daTagStatue_c::event_proc_call() {
(this->*l_func[mCurrentAction])();
// Form ring of light around platform and glowing Sky Character if Owl Statue has been moved far enough away
if(checkOnEffect()) {
// Form ring of light around platform and glowing Sky Character if Owl Statue has been moved far
// enough away
if (checkOnEffect()) {
setParticle();
mpGlowingSkyCharacterBrk->setPlaySpeed(1.0f);
}
else {
} else {
endParticle();
mpGlowingSkyCharacterBrk->setPlaySpeed(-1.0f);
}
}
void daTagStatue_c::actionWait() {
if(checkStartDemo()) {
// Statue is far enough away and player is close enough to the tag for the cutscene to be ordered
if (checkStartDemo()) {
// Statue is far enough away and player is close enough to the tag for the cutscene to be
// ordered
setAction(ACTION_ORDER_EVENT_e);
fopAcM_orderOtherEventId(this, mEventId, mMapToolId, 0xFFFF, 0, 1);
eventInfo.onCondition(0x0002);
@@ -212,13 +262,12 @@ void daTagStatue_c::actionWait() {
}
void daTagStatue_c::actionOrderEvent() {
if(eventInfo.checkCommandDemoAccrpt()) {
if (eventInfo.checkCommandDemoAccrpt()) {
// Cutscene order accepted
setAction(ACTION_EVENT_e);
mDoAud_subBgmStart(Z2BGM_KOMONJO_GET_INTRO);
Z2GetAudioMgr()->subBgmStart(Z2BGM_KOMONJO_GET_INTRO);
demoProc();
}
else {
} else {
// Cutscene order has not been accepted yet, attempt again
fopAcM_orderOtherEventId(this, mEventId, mMapToolId, 0xFFFF, 0, 1);
eventInfo.onCondition(0x0002);
@@ -226,13 +275,12 @@ void daTagStatue_c::actionOrderEvent() {
}
void daTagStatue_c::actionEvent() {
if(dComIfGp_evmng_endCheck(mEventId)) {
if (dComIfGp_evmng_endCheck(mEventId)) {
setAction(ACTION_DEAD_e);
dComIfGp_event_reset();
fopAcM_onSwitch(this, getSwbit2());
dComIfGs_onEventBit(l_event_bit[mSkyCharacterEventBitIdIndex]);
}
else {
dComIfGs_onEventBit((u16)l_event_bit[mSkyCharacterEventBitIdIndex]);
} else {
demoProc();
}
}
@@ -268,13 +316,19 @@ int daTagStatue_c::demoProc() {
16384 // Ruined Theatre
};
int act_id = dComIfGp_evmng_getMyActIdx(mStaffId, action_table, ARRAY_SIZEU(action_table), 0, 0);
daPy_py_c* player = daPy_getPlayerActorClass();
if(dComIfGp_evmng_getIsAddvance(mStaffId)) {
int act_id =
dComIfGp_evmng_getMyActIdx(mStaffId, action_table, ARRAY_SIZEU(action_table), 0, 0);
int item;
int* timer_p;
fopAc_ac_c* found_owl_statue;
if (dComIfGp_evmng_getIsAddvance(mStaffId)) {
switch(act_id) {
case DEMO_ACTION_WAIT: {
// Delay fading to black
int* timer_p = dComIfGp_evmng_getMyIntegerP(mStaffId, "Timer");
timer_p = dComIfGp_evmng_getMyIntegerP(mStaffId, "Timer");
if (!timer_p) {
mTimer = 1;
@@ -286,9 +340,11 @@ int daTagStatue_c::demoProc() {
}
case DEMO_ACTION_MOVE_OWL_STATUE:
// Position and orient Owl Statue behind player
if(mSkyCharacterEventBitIdIndex != TAG_LOCATION_GERUDO_DESERT && mSkyCharacterEventBitIdIndex != TAG_LOCATION_LAKE_HYLIA && mSkyCharacterEventBitIdIndex != TAG_LOCATION_RUINED_THEATRE) {
fopAc_ac_c* found_owl_statue = reinterpret_cast<fopAc_ac_c*>(fpcEx_Search(s_s_sub, this));
if(found_owl_statue) {
if (mSkyCharacterEventBitIdIndex != TAG_LOCATION_GERUDO_DESERT &&
mSkyCharacterEventBitIdIndex != TAG_LOCATION_LAKE_HYLIA &&
mSkyCharacterEventBitIdIndex != TAG_LOCATION_RUINED_THEATRE) {
found_owl_statue = reinterpret_cast<fopAc_ac_c*>(fpcM_Search(s_s_sub, this));
if (found_owl_statue) {
found_owl_statue->current.pos = l_statue_pos[mSkyCharacterEventBitIdIndex];
found_owl_statue->shape_angle.y = l_statue_ang[mSkyCharacterEventBitIdIndex];
fopAcM_OnStatus(found_owl_statue, 0x800);
@@ -296,31 +352,31 @@ int daTagStatue_c::demoProc() {
}
break;
case DEMO_ACTION_AWARD_ITEM:
// If the player already has 5 Sky Characters, reward them with the completed Ancient Sky Book,
// otherwise, reward another character
int item;
if(getLetterCount() == 5) {
// If the player already has 5 Sky Characters, reward them with the completed
// Ancient Sky Book, otherwise, reward another character
if (getLetterCount() == 5) {
item = fpcNm_ITEM_ANCIENT_DOCUMENT2;
/* Sky character - Sky character 6 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0796);
}
else {
} else {
item = fpcNm_ITEM_AIR_LETTER;
}
mTreasureDemoItemId = fopAcM_createItemForTrBoxDemo(&fopAcM_GetPosition(this), item, -1, fopAcM_GetRoomNo(this), 0, 0);
mItemId =
fopAcM_createItemForTrBoxDemo(&current.pos, item, -1,
fopAcM_GetRoomNo(this), 0, 0);
if(static_cast<u32>(mTreasureDemoItemId + (1 << 16)) != 0xFFFF) {
dComIfGp_event_setItemPartnerId(mTreasureDemoItemId);
JUT_ASSERT(580, mItemId != fpcM_ERROR_PROCESS_ID_e);
if (mItemId + (1 << 16) != 0xFFFF) {
dComIfGp_event_setItemPartnerId(mItemId);
}
break;
}
}
switch(act_id) {
case DEMO_ACTION_WAIT:
if(!cLib_calcTimer<u8>(&mTimer)) {
if (!cLib_calcTimer<u8>(&mTimer)) {
dComIfGp_evmng_cutEnd(mStaffId);
}
break;
@@ -336,16 +392,18 @@ int daTagStatue_c::demoProc() {
}
void daTagStatue_c::setParticle() {
for(int i = 0; i < 3; i++) {
if(!mpLightRingEmitters[i]) {
mpLightRingEmitters[i] = dComIfGp_particle_set(l_eff_id[i], &current.pos, &home.angle, &scale);
for (int i = 0; i < 3; i++) {
if (!mpLightRingEmitters[i]) {
mpLightRingEmitters[i] =
dComIfGp_particle_set(l_eff_id[i], &current.pos, &home.angle, &scale, 0xff, NULL,
-1, NULL, NULL, NULL);
}
}
}
void daTagStatue_c::endParticle() {
for(int i = 0; i < 3; i++) {
if(mpLightRingEmitters[i]) {
for (int i = 0; i < 3; i++) {
if (mpLightRingEmitters[i]) {
mpLightRingEmitters[i]->becomeInvalidEmitter();
mpLightRingEmitters[i]->quitImmortalEmitter();
mpLightRingEmitters[i] = NULL;
@@ -353,48 +411,48 @@ void daTagStatue_c::endParticle() {
}
}
// Check if statue is far enough away from the Sky Character platform and if player is close enough to the tag for the cutscene
// of obtaining a Sky Character to be ordered
// Check if statue is far enough away from the Sky Character platform and if player is close enough
// to the tag for the cutscene of obtaining a Sky Character to be ordered
BOOL daTagStatue_c::checkStartDemo() {
const fopAc_ac_c* const player = dComIfGp_getPlayer(0);
const fopAc_ac_c* const player = daPy_getPlayerActorClass();
if(!checkOnEffect()) {
if (!checkOnEffect()) {
// Owl Statue is not far enough away from tag
return 0;
}
const f32 tag_distance_to_player = sqrtf(PSVECSquareDistance(&player->current.pos, &current.pos));
#if DEBUG
#define TAG_STATUE_EVENT_TRIGGER_RANGE l_HIO.event_trigger_range
#else
#define TAG_STATUE_EVENT_TRIGGER_RANGE 100.0f
#endif
return (tag_distance_to_player < 100.0f);
if (player->current.pos.abs(current.pos) < TAG_STATUE_EVENT_TRIGGER_RANGE) {
return 1;
} else {
return 0;
}
}
// Return whether the owl statue has moved far enough away (in the horizontal plane) from the platform where the Sky Character is obtained
// in order for its glowing effects to occur and the cutscene to be ordered
// Return whether the owl statue has moved far enough away (in the horizontal plane) from the
// platform where the Sky Character is obtained in order for its glowing effects to occur and the
// cutscene to be ordered
BOOL daTagStatue_c::checkOnEffect() {
BOOL is_switch = fopAcM_isSwitch(this, getSwbit2());
if(!is_switch && static_cast<u32>(mOwlStatueId + (1 << 16)) != 0xFFFF) {
daPy_py_c* player = daPy_getPlayerActorClass();
if (!fopAcM_isSwitch(this, getSwbit2()) &&
static_cast<u32>(mOwlStatueId + (1 << 16)) != 0xFFFF) {
fopAc_ac_c* found_owl_statue = fopAcM_SearchByID(mOwlStatueId);
if(found_owl_statue) {
Vec statue_tag_xy_pos;
Vec found_owl_statue_xy_pos;
if (found_owl_statue) {
#if DEBUG
#define TAG_STATUE_CHECK_RANGE l_HIO.check_range
#else
#define TAG_STATUE_CHECK_RANGE 120.0f
#endif
const f32 found_owl_statue_z = fopAcM_GetPosition(found_owl_statue).z;
const f32 found_owl_statue_x = fopAcM_GetPosition(found_owl_statue).x;
found_owl_statue_xy_pos.x = found_owl_statue_x;
found_owl_statue_xy_pos.y = 0.0f;
found_owl_statue_xy_pos.z = found_owl_statue_z;
const f32 statue_tag_z = fopAcM_GetPosition(this).z;
const f32 statue_tag_x = fopAcM_GetPosition(this).x;
statue_tag_xy_pos.x = statue_tag_x;
statue_tag_xy_pos.y = 0.0f;
statue_tag_xy_pos.z = statue_tag_z;
const f32 distance_between_statue_and_tag = sqrtf(PSVECSquareDistance(&found_owl_statue_xy_pos, &statue_tag_xy_pos));
if(distance_between_statue_and_tag > 120.0f) return TRUE;
}
else {
if (found_owl_statue->current.pos.absXZ(current.pos) > TAG_STATUE_CHECK_RANGE) {
return TRUE;
}
} else {
// No Owl Statue found, platform cannot be covered
return TRUE;
}
@@ -403,21 +461,20 @@ BOOL daTagStatue_c::checkOnEffect() {
return FALSE;
}
s32 daTagStatue_c::getLetterCount() {
s32 numLetters = 0;
for(int i = 0; i < 6; i++) {
if(dComIfGs_isEventBit(l_event_bit[i])) {
int daTagStatue_c::getLetterCount() {
int numLetters = 0;
for (int i = 0; i < 6; i++) {
if (dComIfGs_isEventBit((u16)l_event_bit[i])) {
numLetters++;
}
}
return numLetters;
return numLetters;
}
int daTagStatue_c::draw() {
dScnKy_env_light_c* env_light = dKy_getEnvlight();
env_light->settingTevStruct(0, &current.pos, &tevStr);
env_light->setLightTevColorType_MAJI(mpModel, &tevStr);
g_env_light.settingTevStruct(0, &current.pos, &tevStr);
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
dComIfGd_setListBG();
@@ -429,32 +486,46 @@ int daTagStatue_c::draw() {
dComIfGd_setList();
#if DEBUG
if (l_HIO.show_range) {
GXColor color1 = (GXColor){0xff, 0, 0, 0xff};
GXColor color2 = (GXColor){0, 0, 0xff, 0xff};
dDbVw_drawCircleXlu(current.pos, l_HIO.check_range, color1, 1, 12);
dDbVw_drawCircleXlu(current.pos, l_HIO.event_trigger_range, color2, 1, 12);
}
#endif
return 1;
}
int daTagStatue_c::_delete() {
endParticle();
dComIfG_resDelete(&mArcPhase, l_arcName);
if(l_evArcName[mSkyCharacterEventBitIdIndex]) {
if (l_evArcName[mSkyCharacterEventBitIdIndex]) {
dComIfG_resDelete(&mEvArcPhase, l_evArcName[mSkyCharacterEventBitIdIndex]);
}
#if DEBUG
l_HIO.removeHIO();
#endif
return 1;
}
static int daTagStatue_Draw(daTagStatue_c* i_this) {
static int daTagStatue_Draw(daTagStatue_c* i_this) {
return i_this->draw();
}
}
static int daTagStatue_Execute(daTagStatue_c* i_this) {
return i_this->execute();
}
static int daTagStatue_Delete(daTagStatue_c* i_this) {
fopAcM_RegisterDeleteID(i_this, "Sample");
return i_this->_delete();
}
static int daTagStatue_Create(daTagStatue_c* i_this) {
fopAcM_RegisterCreateID(i_this, "Sample");
return i_this->create();
}
+44 -12
View File
@@ -5,18 +5,25 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_stream.h"
#include "SSystem/SComponent/c_math.h"
#include "d/actor/d_a_tag_stream.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
#include "d/d_s_play.h"
int daTagStream_c::create() {
fopAcM_ct(this, daTagStream_c);
mPriority = fopAcM_GetParam(this) >> 8;
mPriority = (fopAcM_GetParam(this) >> 8) & 0xFF;
mPower = fopAcM_GetParam(this);
field_0x56b = fopAcM_GetParam(this) >> 16;
field_0x56b = (fopAcM_GetParam(this) >> 16) & 0xFF;
fopAcM_GetParam(this) >> 24 != 0 ? mParameters = 0 : mParameters = 1;
if ((fopAcM_GetParam(this) >> 24) != 0) {
mParameters = 0;
} else {
mParameters = 1;
}
scale.x *= 100.0f;
scale.y *= 100.0f;
@@ -49,18 +56,17 @@ int daTagStream_c::create() {
} else {
m_top = this;
}
f32 float1 = cM_scos(shape_angle.y) * cM_scos(shape_angle.x);
f32 float2 = -cM_ssin(shape_angle.x);
f32 float3 = cM_ssin(shape_angle.y) * cM_scos(shape_angle.x);
speed.set(float3,float2,float1);
speed.set(cM_ssin(shape_angle.y) * cM_scos(shape_angle.x), -cM_ssin(shape_angle.x),
cM_scos(shape_angle.y) * cM_scos(shape_angle.x));
return cPhs_COMPLEATE_e;
}
static int daTagStream_Create(fopAc_ac_c* i_this) {
return static_cast<daTagStream_c*>(i_this)->create();
daTagStream_c* stream = static_cast<daTagStream_c*>(i_this);
int id = fopAcM_GetID(i_this);
return stream->create();
}
daTagStream_c::~daTagStream_c() {
@@ -78,6 +84,7 @@ daTagStream_c::~daTagStream_c() {
};
static int daTagStream_Delete(daTagStream_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagStream_c();
return 1;
}
@@ -96,8 +103,33 @@ static int daTagStream_Execute(daTagStream_c* i_this) {
return i_this->execute();
}
static bool daTagStream_Draw(daTagStream_c* param_0) {
return true;
static int daTagStream_Draw(daTagStream_c* i_this) {
#if DEBUG
if (UREG_S(9) != 0 && i_this->checkStreamOn()) {
cXyz vertices[8];
vertices[0].set(-i_this->scale.x, i_this->scale.y, -i_this->scale.z);
vertices[1].set(i_this->scale.x, vertices[0].y, vertices[0].z);
vertices[2].set(vertices[0].x, vertices[0].y, i_this->scale.z);
vertices[3].set(vertices[1].x, vertices[0].y, vertices[2].z);
vertices[4].set(vertices[0].x, 0.0f, vertices[0].z);
vertices[5].set(vertices[1].x, 0.0f, vertices[1].z);
vertices[6].set(vertices[2].x, 0.0f, vertices[2].z);
vertices[7].set(vertices[3].x, 0.0f, vertices[3].z);
mDoMtx_stack_c::transS(i_this->current.pos);
mDoMtx_stack_c::YrotM(i_this->shape_angle.y);
for (int i = 0; i < ARRAY_SIZE(vertices); i++) {
mDoMtx_stack_c::multVec(&vertices[i], &vertices[i]);
}
static GXColor color = {0xff, 0, 0xff, 0x80};
dDbVw_drawCube8pXlu(vertices, color);
}
#endif
return 1;
}
static actor_method_class l_daTagStream_Method = {
+4 -1
View File
@@ -52,12 +52,15 @@ static int daTag_Telop_IsDelete(daTag_Telop_c* i_this) {
}
static int daTag_Telop_Delete(daTag_Telop_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTag_Telop_c();
return 1;
}
static int daTag_Telop_Create(fopAc_ac_c* i_this) {
return static_cast<daTag_Telop_c*>(i_this)->create();
daTag_Telop_c* telop = static_cast<daTag_Telop_c*>(i_this);
int id = fopAcM_GetID(i_this);
return telop->create();
}
static actor_method_class l_daTag_Telop_Method = {
+29 -1
View File
@@ -6,12 +6,40 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_tag_theB_hint.h"
#include "d/actor/d_a_npc_theB.h"
int daTagTheBHint_c::create() {
fopAcM_ct(this, daTagTheBHint_c);
field_0x568 = std::pow(scale.x * 100.0f,2.0f);
return cPhs_COMPLEATE_e;
}
int daTagTheBHint_c::execute() {
if (fopAcM_isSwitch(this, getSwitchNo())) {
fopAcM_delete(this);
return 1;
}
if (fopAcM_searchPlayerDistanceXZ2(this) < field_0x568) {
daNpcTheB_c* the_b = (daNpcTheB_c*)fpcM_SearchByName(PROC_NPC_THEB);
if (the_b) {
int roomNo = getRoomNo() == 0xff ? fopAcM_GetRoomNo(this) : getRoomNo();
the_b->setHintEvent(getMessageNo(), getLinkID(), roomNo);
}
}
return 1;
}
static int daTagTheBHint_Create(fopAc_ac_c* i_this) {
return static_cast<daTagTheBHint_c*>(i_this)->create();
daTagTheBHint_c* theBHint = static_cast<daTagTheBHint_c*>(i_this);
int id = fopAcM_GetID(i_this);
return theBHint->create();
}
static int daTagTheBHint_Delete(daTagTheBHint_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagTheBHint_c();
return 1;
}
+3 -2
View File
@@ -45,12 +45,13 @@ void daTagWrHowl_c::init() {
}
bool daTagWrHowl_c::chkWlfInTag() {
if (dComIfGp_getPlayer(0) == NULL) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
if (player == NULL) {
return false;
}
if (daPy_py_c::checkNowWolf()) {
cXyz player_pos = dComIfGp_getPlayer(0)->current.pos;
cXyz player_pos = player->current.pos;
if (player_pos.abs2(current.pos) < field_0x570) {
return true;
}
+1
View File
@@ -54,6 +54,7 @@ static int daTagWatchGe_IsDelete(daTagWatchGe_c* i_this) {
}
static int daTagWatchGe_Delete(daTagWatchGe_c* i_this) {
fopAcM_RegisterDeleteID(i_this, "Tag_WatchGe");
return 1;
}
+171 -77
View File
@@ -7,25 +7,113 @@
#include "d/actor/d_a_tag_waterfall.h"
#include "d/d_com_inf_game.h"
#include "d/d_debug_viewer.h"
#include "d/d_procname.h"
#include "f_op/f_op_camera_mng.h"
static u32 m_master_id = static_cast<u32>(0xFFFFFFFF);
daTagWaterFall_HIO_c::daTagWaterFall_HIO_c() {
field_0x04 = -1;
mBaseFogNear = 0.0f;
mBaseFogFar = 10000.0f;
mColorBlendStepDivisor = 3.0f;
mShouldModifyFog = false;
field_0x14 = 0;
field_0x15 = 0;
field_0x18 = 0.0f;
field_0x1C = 0.0f;
field_0x20 = 0.0f;
child = -1;
base_fog_far = 0.0f;
base_fog_near = 10000.0f;
color_blend_step_divisor = 3.0f;
enable_fog_adjust = false;
draw_ellipse = 0;
enable_ellipse_adjust = 0;
ellipse_radius_a = 0.0f;
ellipse_radius_b = 0.0f;
ellipse_rotate = 0.0f;
}
#if DEBUG
void daTagWaterFall_HIO_c::genMessage(JORMContext* ctx) {
// "Zora river waterfall"
ctx->genLabel("ゾーラ川の滝", 0x80000001);
ctx->genLabel("-", 0x80000001);
// "Fog adjustment parameters"
ctx->genLabel("フォグ調整パラメータ", 0x80000001);
ctx->genLabel("-", 0x80000001);
// "Fog adjustment ON?"
ctx->genCheckBox("フォグ調整ON?", &enable_fog_adjust, 0x1);
// "Near direct value"
ctx->genSlider("near直値", &base_fog_far, -100000.0f, 100000.0f);
// "Far direct value"
ctx->genSlider("far直値", &base_fog_near, -100000.0f, 100000.0f);
// "Switching time"
ctx->genSlider("切り替わり時間", &color_blend_step_divisor, 0.0f, 100.0f);
ctx->genLabel("-", 0x80000001);
ctx->genLabel("-", 0x80000001);
ctx->genLabel("-", 0x80000001);
// "Ellipse adjustment parameters"
ctx->genLabel("楕円調整パラメータ", 0x80000001);
ctx->genLabel("-", 0x80000001);
// "Ellipse display"
ctx->genCheckBox("楕円表示", &draw_ellipse, 0x1);
ctx->genLabel("-", 0x80000001);
// "Ellipse adjustment ON?"
ctx->genCheckBox("楕円調整ON?", &enable_ellipse_adjust, 0x1);
// "Ellipse X radius"
ctx->genSlider("楕円X半径", &ellipse_radius_a, 0.0f, 10000.0f);
// "Ellipse Z radius"
ctx->genSlider("楕円Z半径", &ellipse_radius_b, 0.0f, 10000.0f);
// "Ellipse rotation"
ctx->genSlider("楕円回転", &ellipse_rotate, 0.0f, 65536.0f);
}
#endif
static bool masterWaterfallTagExists;
static u32 m_master_id = 0xFFFFFFFF;
static daTagWaterFall_HIO_c l_HIO;
int daTagWaterFall_c::draw() {
#if DEBUG
f32 paramX;
f32 paramY;
f32 rotCos;
f32 rotSin;
s16 angle;
if (l_HIO.draw_ellipse || l_HIO.enable_ellipse_adjust) {
angle = 0;
cXyz startPos = current.pos;
if (!l_HIO.draw_ellipse) {
paramX = l_HIO.ellipse_radius_a * cM_ssin(angle);
paramY = l_HIO.ellipse_radius_b * cM_scos(angle);
rotCos = cM_scos(l_HIO.ellipse_rotate);
rotSin = cM_ssin(l_HIO.ellipse_rotate);
} else {
paramX = mCylinderRadiusA * cM_ssin(angle);
paramY = mCylinderRadiusB * cM_scos(angle);
rotCos = cM_scos(shape_angle.y);
rotSin = cM_ssin(shape_angle.y);
}
startPos.x += paramX * rotCos + paramY * rotSin;
startPos.z += -paramX * rotSin + paramY * rotCos;
cXyz endPos;
for (int i = 0; i < 0x10; i++) {
angle += (s16)0x1000;
endPos = current.pos;
if (l_HIO.draw_ellipse == 0) {
paramX = l_HIO.ellipse_radius_a * cM_ssin(angle);
paramY = l_HIO.ellipse_radius_b * cM_scos(angle);
} else {
paramX = mCylinderRadiusA * cM_ssin(angle);
paramY = mCylinderRadiusB * cM_scos(angle);
}
endPos.x += paramX * rotCos + paramY * rotSin;
endPos.z += -paramX * rotSin + paramY * rotCos;
dDbVw_drawLineXlu(startPos, endPos, (GXColor){0, 0xff, 0, 0xff}, 1, 0xc);
startPos = endPos;
}
}
#endif
return 1;
}
@@ -33,18 +121,14 @@ static int daTagWaterFall_Draw(daTagWaterFall_c* i_this) {
return i_this->draw();
}
void* s_waterfall(void* pProc, void* unused) {
if (fopAc_IsActor(pProc)) {
if (fopAcM_GetName(pProc) == PROC_Tag_WaterFall) {
daTagWaterFall_c* pProcWaterfallTag = static_cast<daTagWaterFall_c*>(pProc);
void* s_waterfall(void* pProc, void* param_1) {
UNUSED(param_1);
s32 id = fpcM_GetID(pProc);
if (!fpcM_IsCreating(id)) {
if (pProcWaterfallTag->checkHitWaterFallCamera()) {
return pProc;
}
}
}
if (fopAcM_IsActor(pProc) &&
fopAcM_GetName(pProc) == PROC_Tag_WaterFall &&
!fpcM_IsCreating(fopAcM_GetID(pProc)) &&
static_cast<daTagWaterFall_c*>(pProc)->checkHitWaterFallCamera()) {
return pProc;
}
return NULL;
@@ -56,67 +140,69 @@ f32 daTagWaterFall_c::getEllipseY(f32 x) {
f32 ellipseRadiusB = mCylinderRadiusB;
f32 ellipseRadiusA = mCylinderRadiusA;
f32 ellipseRadiusBSquared = ellipseRadiusB * ellipseRadiusB;
f32 ellipseRadiusASquared = ellipseRadiusA * ellipseRadiusA;
f32 ellipseYSquared_OverBSquared = (1.0f - ((x * x) / (ellipseRadiusASquared)));
f32 ellipseYSquared = (ellipseRadiusBSquared)*ellipseYSquared_OverBSquared;
#if DEBUG
if (l_HIO.enable_ellipse_adjust) {
ellipseRadiusB = l_HIO.ellipse_radius_b;
ellipseRadiusA = l_HIO.ellipse_radius_a;
}
#endif
return JMAFastSqrt(ellipseYSquared);
f32 result = JMAFastSqrt((ellipseRadiusB * ellipseRadiusB) *
(1.0f - ((x * x) / (ellipseRadiusA * ellipseRadiusA))));
return result;
}
bool daTagWaterFall_c::checkHitWaterFall(cXyz objPos) {
Vec dst;
cXyz dst;
s16 angleY = shape_angle.y;
f32 ellipseRadiusA = mCylinderRadiusA;
mDoMtx_stack_c::YrotS(-fopAcM_GetShapeAngle_p(this)->y);
#if DEBUG
if (l_HIO.enable_ellipse_adjust) {
angleY = l_HIO.ellipse_rotate;
ellipseRadiusA = l_HIO.ellipse_radius_a;
}
#endif
const cXyz& waterfallTagPos = fopAcM_GetPosition(this);
mDoMtx_stack_c::transM(-waterfallTagPos.x, -waterfallTagPos.y, -waterfallTagPos.z);
mDoMtx_stack_c::YrotS(-angleY);
mDoMtx_stack_c::transM(-current.pos.x, -current.pos.y, -current.pos.z);
mDoMtx_stack_c::multVec(&objPos, &dst);
if (fabsf(dst.x) < ellipseRadiusA) {
const f32 absEllipseY = fabsf(getEllipseY(dst.x));
if (fabsf(dst.z) < absEllipseY) {
if (waterfallTagPos.y < objPos.y) {
// Instruction reordering occurs when mCylinderHeight == 0.0f is used
if (!mCylinderHeight || (waterfallTagPos.y + mCylinderHeight) > objPos.y) {
return true;
}
f32 absEllipseY;
if (std::abs(dst.x) < ellipseRadiusA) {
absEllipseY = std::abs(getEllipseY(dst.x));
if (std::abs(dst.z) < absEllipseY && current.pos.y < objPos.y) {
// Instruction reordering occurs when mCylinderHeight == 0.0f is used
if (!mCylinderHeight || (current.pos.y + mCylinderHeight) > objPos.y) {
return true;
}
}
}
}
return false;
}
bool daTagWaterFall_c::checkHitWaterFallCamera() {
const camera_class* camera = dComIfGp_getCamera(0);
return checkHitWaterFall(camera->lookat.eye);
return checkHitWaterFall(dComIfGp_getCamera(0)->lookat.eye);
}
static bool masterWaterfallTagExists;
static daTagWaterFall_HIO_c l_HIO;
int daTagWaterFall_c::execute() {
u32 masterId = m_master_id;
u32 waterfallId = fpcM_GetID(this);
if (masterId == waterfallId) {
if (m_master_id == fopAcM_GetID(this)) {
if (mFrameCountdown) {
const dScnKy_env_light_c* const envLight = dKy_getEnvlight();
mFogNear = envLight->mFogNear;
mFogFar = envLight->mFogFar;
mFrameCountdown--;
mColpat = envLight->mColpatWeather;
mColpat = g_env_light.mColpatWeather;
mColorBlend = 1.0f;
} else {
bool currCameraInWaterfall = false;
if (fpcEx_Search(s_waterfall, this)) {
currCameraInWaterfall = true;
u8 currCameraInWaterfall = FALSE;
if (fpcM_Search(s_waterfall, this)) {
currCameraInWaterfall = TRUE;
}
if (!currCameraInWaterfall) {
@@ -132,7 +218,7 @@ int daTagWaterFall_c::execute() {
mPrevCameraInWaterfall = currCameraInWaterfall;
}
cLib_chaseF(&mColorBlend, 1.0f, 1.0f / l_HIO.mColorBlendStepDivisor);
cLib_chaseF(&mColorBlend, 1.0f, 1.0f / l_HIO.color_blend_step_divisor);
if (!mPrevCameraInWaterfall) {
dKy_custom_colset(7, mColpat, mColorBlend);
@@ -141,23 +227,24 @@ int daTagWaterFall_c::execute() {
}
f32 instanceFogMultiplier;
f32 HIOFogMultiplier;
f32 hioFogMultiplier;
if (l_HIO.mShouldModifyFog) {
if (l_HIO.enable_fog_adjust) {
if (mPrevCameraInWaterfall) {
instanceFogMultiplier = 1.0f - mColorBlend;
HIOFogMultiplier = mColorBlend;
hioFogMultiplier = mColorBlend;
} else {
instanceFogMultiplier = mColorBlend;
HIOFogMultiplier = 1.0f - mColorBlend;
hioFogMultiplier = 1.0f - mColorBlend;
}
f32 fogParam0 =
(mFogNear * instanceFogMultiplier) + (l_HIO.mBaseFogNear * HIOFogMultiplier);
f32 fogParam1 =
(mFogFar * instanceFogMultiplier) + (l_HIO.mBaseFogFar * HIOFogMultiplier);
dKy_fog_startendz_set(fogParam0, fogParam1, 1.0f);
dKy_fog_startendz_set(
(mFogNear * instanceFogMultiplier) +
(l_HIO.base_fog_far * hioFogMultiplier),
(mFogFar * instanceFogMultiplier) +
(l_HIO.base_fog_near * hioFogMultiplier),
1.0f
);
}
}
}
@@ -177,7 +264,12 @@ static int daTagWaterFall_IsDelete(daTagWaterFall_c* i_this) {
int daTagWaterFall_c::_delete() {
if (mIsMasterWaterfallTag) {
masterWaterfallTagExists = false;
#if DEBUG
mDoHIO_deleteChild(l_HIO.child);
#endif
}
return 1;
}
@@ -189,37 +281,41 @@ static int daTagWaterFall_Delete(daTagWaterFall_c* i_this) {
cPhs__Step daTagWaterFall_c::create() {
fopAcM_ct(this, daTagWaterFall_c);
OS_REPORT("Tag_WaterFall PARAM %x %x %x \n", fopAcM_GetParam(this), current.angle.x, current.angle.y);
if (masterWaterfallTagExists == false) {
masterWaterfallTagExists = true;
mIsMasterWaterfallTag = 1;
l_HIO.field_0x04 = -1;
#if DEBUG
// "Zora river waterfall"
l_HIO.child = mDoHIO_createChild("ゾーラ川の滝", &l_HIO);
#else
l_HIO.child = -1;
#endif
}
mCylinderRadiusA = static_cast<f32>(fpcM_GetParam(this) & 0x0000FFFF);
mCylinderRadiusA = static_cast<f32>(fopAcM_GetParam(this) & 0x0000FFFF);
if (mCylinderRadiusA < 0.0f) {
mCylinderRadiusB = 0.0f;
}
mCylinderHeight = static_cast<f32>((fpcM_GetParam(this) & 0xFFFF0000) >> 16);
mCylinderHeight = static_cast<f32>((fopAcM_GetParam(this) >> 16) & 0xFFFF);
if (mCylinderHeight < 0.0f) {
mCylinderHeight = 0.0f;
}
mCylinderRadiusB = static_cast<f32>((fopAcM_GetAngle_p(this)->x & 0x0000FFFF));
mCylinderRadiusB = static_cast<f32>(current.angle.x & 0xFFFF);
if (mCylinderRadiusB <= 0.0f) {
mCylinderRadiusB = mCylinderRadiusA;
}
fopAcM_GetShapeAngle_p(this)->x = 0;
fopAcM_GetAngle_p(this)->x = 0;
current.angle.x = shape_angle.x = 0;
if (m_master_id + (1 << 16) == 0xFFFF) {
u32 id = fopAcM_GetID(this);
m_master_id = id;
m_master_id = fopAcM_GetID(this);
mColorBlend = 0.0f;
mFrameCountdown = 30;
@@ -232,8 +328,6 @@ static int daTagWaterFall_Create(daTagWaterFall_c* i_this) {
return i_this->create();
}
daTagWaterFall_HIO_c::~daTagWaterFall_HIO_c() {}
static actor_method_class l_daTagWaterFall_Method = {
(process_method_func)daTagWaterFall_Create, (process_method_func)daTagWaterFall_Delete,
(process_method_func)daTagWaterFall_Execute, (process_method_func)daTagWaterFall_IsDelete,
+12 -8
View File
@@ -55,8 +55,8 @@ int daTagYami_c::create() {
} else {
on_CoHit();
}
break;
}
break;
default:
return cPhs_ERROR_e;
}
@@ -72,7 +72,8 @@ int daTagYami_c::Execute() {
void daTagYami_c::calcCoC(cXyz& i_dst) {
cXyz base(0.0f, 0.0f, 430.0f);
mDoMtx_stack_c::ZXYrotS(csXyz(0, -0x7f96, 0));
csXyz sp10(0, -0x7f96, 0);
mDoMtx_stack_c::ZXYrotS(sp10);
mDoMtx_stack_c::multVec(&base, &base);
i_dst = home.pos + base;
}
@@ -87,14 +88,12 @@ u32 daTagYami_c::chk_CoHit() {
}
f32 coR = getCoR();
f32 plDist = getPlDist();
return plDist < coR;
return getPlDist() < coR;
}
f32 daTagYami_c::getPlDist() {
cXyz coC(mCoC);
daPy_py_c* py = daPy_getPlayerActorClass();
cXyz pyPos = fopAcM_GetPosition((fopAc_ac_c*)py);
cXyz pyPos = *fopAcM_GetPosition_p(daPy_getPlayerActorClass());
cXyz diff = pyPos - coC;
return diff.absXZ();
}
@@ -109,14 +108,19 @@ void daTagYami_c::offMidnaTagSw2() {
}
int daTagYami_Create(fopAc_ac_c* i_this) {
return static_cast<daTagYami_c*>(i_this)->create();
daTagYami_c* yami = static_cast<daTagYami_c*>(i_this);
int id = fopAcM_GetID(i_this);
return yami->create();
}
int daTagYami_Execute(fopAc_ac_c* i_this) {
return static_cast<daTagYami_c*>(i_this)->Execute();
daTagYami_c* yami = static_cast<daTagYami_c*>(i_this);
int id = fopAcM_GetID(i_this);
return yami->Execute();
}
int daTagYami_Delete(daTagYami_c* i_this) {
int id = fopAcM_GetID(i_this);
i_this->~daTagYami_c();
return 1;
}