mirror of https://github.com/zeldaret/tp.git
914 lines
29 KiB
C++
914 lines
29 KiB
C++
/**
|
|
* @file d_a_obj_yousei.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h"
|
|
|
|
#include "d/actor/d_a_obj_yousei.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_s_play.h"
|
|
#include "d/d_item.h"
|
|
#include "Z2AudioLib/Z2Instances.h"
|
|
|
|
/* 804CE738-804CE7A4 000078 006C+00 1/1 0/0 0/0 .text InitCcSph__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::InitCcSph() {
|
|
const static dCcD_SrcSph ccSphSrc = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x0}, {0x14002, 0x11}, 0x75}}, // mObj
|
|
{dCcD_SE_STONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
mCcStts.Init(1, 0, this);
|
|
mCcSph.Set(ccSphSrc);
|
|
mCcSph.SetStts(&mCcStts);
|
|
mCcSph.SetC(current.pos);
|
|
mCcSph.OnTgNoHitMark();
|
|
}
|
|
|
|
/* 804CE7A4-804CE7FC 0000E4 0058+00 1/1 0/0 0/0 .text SetCcSph__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::SetCcSph() {
|
|
mCcSph.SetC(current.pos);
|
|
mCcSph.SetR(40.0f);
|
|
dComIfG_Ccsp()->Set(&mCcSph);
|
|
}
|
|
|
|
int daObjYOUSEI_c::CreateHeap() {
|
|
void* modelData = dComIfG_getObjectRes("Always", 0x21);
|
|
JUT_ASSERT(177, modelData != 0);
|
|
|
|
mpModelMorf = new mDoExt_McaMorfSO((J3DModelData*)modelData, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("Always", 0xF), 2, 0.4f, 0, -1, &mSound, 0x80000, 0x11000084);
|
|
if (mpModelMorf == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 804CE7FC-804CE8DC 00013C 00E0+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */
|
|
static int useHeapInit(fopAc_ac_c* i_this) {
|
|
daObjYOUSEI_c* a_this = (daObjYOUSEI_c*)i_this;
|
|
return a_this->CreateHeap();
|
|
}
|
|
|
|
/* 804CE8DC-804CE8FC 00021C 0020+00 1/0 0/0 0/0 .text daObjYOUSEI_Create__FP10fopAc_ac_c
|
|
*/
|
|
static int daObjYOUSEI_Create(fopAc_ac_c* i_this) {
|
|
daObjYOUSEI_c* a_this = (daObjYOUSEI_c*)i_this;
|
|
fpc_ProcID id = fopAcM_GetID(i_this);
|
|
return a_this->create();
|
|
}
|
|
|
|
/* 804CE8FC-804CE920 00023C 0024+00 1/0 0/0 0/0 .text daObjYOUSEI_Delete__FP13daObjYOUSEI_c */
|
|
static int daObjYOUSEI_Delete(daObjYOUSEI_c* i_this) {
|
|
fpc_ProcID id = fopAcM_GetID(i_this);
|
|
i_this->Delete();
|
|
return 1;
|
|
}
|
|
|
|
/* 804CE920-804CE9D0 000260 00B0+00 1/1 0/0 0/0 .text SpeedSet__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::SpeedSet() {
|
|
speed.y += gravity;
|
|
current.pos.y += speed.y;
|
|
|
|
cXyz mae(0.0f, 0.0f, speedF);
|
|
cXyz ato(0.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::YrotS(current.angle.y);
|
|
mDoMtx_stack_c::multVec(&mae, &ato);
|
|
current.pos.x += ato.x;
|
|
current.pos.z += ato.z;
|
|
}
|
|
|
|
/* 804D1828-804D182C 000040 0004+00 0/0 0/0 0/0 .bss s_dis */
|
|
static f32 s_dis;
|
|
|
|
/* 804D182C-804D1830 000044 0004+00 4/5 0/0 0/0 .bss sLink_Pos */
|
|
static cXyz* sLink_Pos;
|
|
|
|
/* 804CE9D0-804CEE50 000310 0480+00 1/1 0/0 0/0 .text MoveAction__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::MoveAction() {
|
|
switch (mMode) {
|
|
case 0:
|
|
mMode++;
|
|
field_0x5dc = -0x1CB8;
|
|
mSpeedVTarget = 0.0f;
|
|
field_0x5d6 = 120.0f + yREG_F(18);
|
|
mAngleTarget = yREG_F(17) + (f32)(cLib_targetAngleY(sLink_Pos, ¤t.pos) - 0x3000);
|
|
break;
|
|
case 1:
|
|
if (field_0x5d6 == 100 && mPrm != 0) {
|
|
execItemGet(fpcNm_ITEM_RECOVERY_FAILY);
|
|
}
|
|
|
|
f32 var_f31 = (25.0f + yREG_F(16)) / field_0x5d6;
|
|
if (var_f31 > 1.0f) {
|
|
var_f31 = 1.0f;
|
|
}
|
|
|
|
cXyz sp30;
|
|
cXyz sp24;
|
|
f32 temp_f30 = field_0x5d6 / 120.0f;
|
|
|
|
if ((fopAcM_GetParam(this) & 0xFF) == 0 && field_0x5d6 > 110) {
|
|
if (field_0x5d6 > 115) {
|
|
var_f31 = 0.03f + BREG_F(1);
|
|
sp30.set(0.0f, 600.0f + BREG_F(3), (10.0f / field_0x5e8) + (130.0f * temp_f30));
|
|
} else if (field_0x5d6 > 110) {
|
|
var_f31 = 0.06f + BREG_F(2);
|
|
sp30.set(0.0f, BREG_F(4), (10.0f / field_0x5e8) + (130.0f * temp_f30));
|
|
}
|
|
|
|
cXyz sp18(1.0f, 1.0f, 1.0f);
|
|
cLib_addCalcPos2(&scale, sp18, 0.2f + nREG_F(16), 10.0f);
|
|
mpModelMorf->setPlaySpeed(0.6f);
|
|
} else {
|
|
mAngleTarget += field_0x5dc * var_f31;
|
|
sp30.set(0.0f, mSpeedVTarget, (10.0f / field_0x5e8) + (130.0f * temp_f30));
|
|
mpModelMorf->setPlaySpeed((3.0f + yREG_F(9)) * field_0x5ec);
|
|
}
|
|
|
|
current.angle.y = mAngleTarget - 0x4000;
|
|
cLib_addCalc2(&field_0x5ec, var_f31, 0.2f + BREG_F(5), 10.0f);
|
|
|
|
mDoMtx_stack_c::transS(*sLink_Pos);
|
|
mDoMtx_stack_c::YrotM(mAngleTarget);
|
|
mDoMtx_stack_c::multVec(&sp30, &sp24);
|
|
mSpeedVTarget += (2.0f + yREG_F(19)) * field_0x5e8;
|
|
|
|
cLib_addCalc(¤t.pos.x, sp24.x, field_0x5ec, 100.0f, 0.0f);
|
|
cLib_addCalc(¤t.pos.y, sp24.y, field_0x5ec * (0.3f + yREG_F(10)), 30.0f, 0.0f);
|
|
cLib_addCalc(¤t.pos.z, sp24.z, field_0x5ec, 100.0f, 0.0f);
|
|
break;
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(7.0f)) {
|
|
mpModelMorf->setFrame(0.0f);
|
|
}
|
|
|
|
if (field_0x5d6 == 0) {
|
|
fopAcM_delete(this);
|
|
}
|
|
|
|
field_0x604 = dComIfGp_particle_set(field_0x604, 0x72F, ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
field_0x60c = dComIfGp_particle_set(field_0x60c, 0x730, ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
field_0x610 = dComIfGp_particle_set(field_0x610, 0x732, ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
}
|
|
|
|
/* 804CEE50-804CF098 000790 0248+00 1/1 0/0 0/0 .text BinAction__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::BinAction() {
|
|
switch (mMode) {
|
|
case 0:
|
|
mAngleTarget = yREG_F(17) + (f32)(cLib_targetAngleY(sLink_Pos, ¤t.pos) - 0x3000);
|
|
mSpeedVTarget = 1.5f + nREG_F(18);
|
|
speedF = 2.0f;
|
|
mSpeedFTarget = 10.0f;
|
|
mMode++;
|
|
mpModelMorf->setPlaySpeed(0.4f);
|
|
mTimers[0] = 7.0f + nREG_F(12);
|
|
break;
|
|
case 1:
|
|
if (mpModelMorf->checkFrame(7.0f)) {
|
|
mpModelMorf->setFrame(0.0f);
|
|
mSpeedVTarget = 1.0f;
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(4.5f + yREG_F(12))) {
|
|
mSpeedVTarget = -2.0f + BREG_F(6);
|
|
}
|
|
|
|
if (mTimers[0] == 0) {
|
|
CareAction();
|
|
}
|
|
break;
|
|
}
|
|
|
|
cXyz sp18(1.0f, 1.0f, 1.0f);
|
|
cLib_addCalcPos2(&scale, sp18, 0.05f + nREG_F(16), 10.0f);
|
|
cLib_addCalc(&speed.y, mSpeedVTarget, 0.2f, 25.0f + yREG_F(11), 0.0f);
|
|
cLib_addCalc(&speedF, mSpeedFTarget, 0.02f + yREG_F(7), 5.0f, 0.0f);
|
|
cLib_addCalcAngleS2(¤t.angle.y, mAngleTarget, 3, 0x1000);
|
|
|
|
field_0x604 = dComIfGp_particle_set(field_0x604, 0x72F, ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
field_0x608 = dComIfGp_particle_set(field_0x608, 0x731, ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
}
|
|
|
|
/* 804D1830-804D1834 -00001 0004+00 2/3 0/0 0/0 .bss None */
|
|
/* 804D1830 0001+00 data_804D1830 None */
|
|
static u8 data_804D1830;
|
|
|
|
/* 804D1831 0003+00 data_804D1831 None */
|
|
static u8 data_804D1831;
|
|
|
|
/* 804CF098-804CF6C4 0009D8 062C+00 1/1 0/0 0/0 .text LinkChk__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::LinkChk() {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
cXyz& player_pos = fopAcM_GetPosition(player);
|
|
cXyz sp20;
|
|
cXyz sp14;
|
|
|
|
if (current.pos.abs(player_pos) < 500.0f && 0.0f == fopAcM_GetSpeedF(player)) {
|
|
if (player->checkItemSwordEquip() && current.pos.y - player_pos.y < 130.0f && !player->checkAttentionLock() && (data_804D1830 == 0 || field_0x5ac != 0)) {
|
|
data_804D1830 = 1;
|
|
field_0x5ac = 1;
|
|
|
|
sp20.set(30.0f + yREG_F(8), 80.0f + yREG_F(9), yREG_F(10));
|
|
MTXCopy(daPy_getLinkPlayerActorClass()->getModelJointMtx(9), *calc_mtx);
|
|
MtxPosition(&sp20, &sp14);
|
|
|
|
mAngleTarget = cLib_targetAngleY(¤t.pos, &sp14);
|
|
cLib_addCalcAngleS2(¤t.angle.y, mAngleTarget, 10, 0x500);
|
|
|
|
if (current.pos.y - sp14.y < 0.0f) {
|
|
mAnmSpeed = 0.58f;
|
|
} else {
|
|
mAnmSpeed = 0.35f;
|
|
}
|
|
|
|
if (current.pos.abs(sp14) < 30.0f + TREG_F(2)) {
|
|
mAction = 3;
|
|
mMode = 0;
|
|
}
|
|
|
|
field_0x5f8 = sp14;
|
|
} else if ((data_804D1831 == 0 || field_0x5ad != 0) && current.pos.y - player_pos.y > 130.0f && current.pos.y - player_pos.y < 200.0f) {
|
|
data_804D1831 = 1;
|
|
field_0x5ad = 1;
|
|
mAnmSpeed = 0.50999999f;
|
|
sp14 = player->getHeadTopPos();
|
|
mAngleTarget = cLib_targetAngleY(¤t.pos, &sp14);
|
|
field_0x61a = -0xE90;
|
|
|
|
if (current.pos.y > 5.0f + sp14.y && current.pos.y < 50.0f + sp14.y) {
|
|
cLib_addCalcAngleS2(¤t.angle.y, mAngleTarget, 2, 0x600);
|
|
}
|
|
|
|
if (current.pos.abs(sp14) < 50.0f + TREG_F(2) && current.pos.y > sp14.y && (current.angle.y - mAngleTarget) < 0x2000 && (current.angle.y - mAngleTarget) > -0x2000) {
|
|
mAction = 3;
|
|
mMode = 2;
|
|
}
|
|
|
|
field_0x5f8 = sp14;
|
|
} else if (field_0x5ac != 0) {
|
|
data_804D1830 = 0;
|
|
field_0x5ac = 0;
|
|
} else if (field_0x5ad != 0) {
|
|
data_804D1831 = 0;
|
|
field_0x5ad = 0;
|
|
}
|
|
} else {
|
|
if (field_0x5ac != 0) {
|
|
data_804D1830 = 0;
|
|
field_0x5ac = 0;
|
|
} else if (field_0x5ad != 0) {
|
|
data_804D1831 = 0;
|
|
field_0x5ad = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 804CF6C4-804CFCE8 001004 0624+00 1/1 0/0 0/0 .text WaitAction__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::WaitAction() {
|
|
u8 sp18 = 0;
|
|
f32 var_f30 = 0.0f;
|
|
f32 anm_frame = mpModelMorf->getFrame();
|
|
f32 var_f28 = 0.0f;
|
|
f32 var_f29 = 0.0f;
|
|
f32 var_f31 = 0.0f;
|
|
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
if (dComIfGs_getLife() != dComIfGs_getMaxLifeGauge() && 0.0f != fopAcM_GetSpeedF(player) && LinkSearch()) {
|
|
var_f30 = 1.0f + nREG_F(1);
|
|
var_f28 = 50.0f + nREG_F(3);
|
|
mTimers[0] = 150;
|
|
var_f31 = 15.0f;
|
|
var_f29 = 5.0f;
|
|
}
|
|
|
|
cXyz sp40;
|
|
cXyz sp34;
|
|
switch (mMode) {
|
|
case 0:
|
|
mMode++;
|
|
mSpeedFTarget = 5.0f;
|
|
mTimers[1] = 30;
|
|
break;
|
|
case 1:
|
|
if (mpModelMorf->checkFrame(7.0f)) {
|
|
mpModelMorf->setFrame(0.0f);
|
|
|
|
if (mTimers[0] == 0) {
|
|
mTimers[0] = 30.0f + cM_rndF(40.0f);
|
|
mAnmSpeed = 0.3f + var_f30 + yREG_F(6) + cM_rndF((0.3f - var_f30) + yREG_F(5));
|
|
mpModelMorf->setPlaySpeed(mAnmSpeed);
|
|
}
|
|
|
|
mSpeedVTarget = (6.0f + yREG_F(1)) * ((mAnmSpeed - 0.25f) + yREG_F(13));
|
|
mSpeedFTarget = (13.0f + yREG_F(8)) * ((mAnmSpeed - 0.25f) + yREG_F(14));
|
|
|
|
if (current.pos.y > 150.0f + home.pos.y + var_f28) {
|
|
mAnmSpeed = 0.35f;
|
|
mTimers[0] = 30;
|
|
mpModelMorf->setPlaySpeed(mAnmSpeed);
|
|
} else if (current.pos.y < 80.0f + home.pos.y) {
|
|
mAnmSpeed = 0.58f;
|
|
mTimers[0] = 30;
|
|
mpModelMorf->setPlaySpeed(mAnmSpeed);
|
|
}
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(4.5f + yREG_F(12))) {
|
|
mSpeedVTarget = -2.0f + yREG_F(3);
|
|
}
|
|
|
|
if (field_0x5d6 == 0 && mPrm == 5) {
|
|
mMode++;
|
|
field_0x5d6 = 100;
|
|
mSpeedVTarget = 2.5f;
|
|
mSpeedFTarget = 6.0f;
|
|
mAnmSpeed = 0.90000004f;
|
|
mpModelMorf->setPlaySpeed(mAnmSpeed);
|
|
}
|
|
break;
|
|
case 2:
|
|
if (field_0x5d6 == 0 && current.pos.y - sLink_Pos->y > 250.0f) {
|
|
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x604);
|
|
emitter->deleteAllParticle();
|
|
dComIfGp_particle_levelEmitterOnEventMove(field_0x604);
|
|
sp18 = 1;
|
|
fopAcM_delete(this);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(7.0f)) {
|
|
mpModelMorf->setFrame(0.0f);
|
|
mSpeedVTarget = 3.0f + yREG_F(4);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(4.5f + yREG_F(12))) {
|
|
mSpeedVTarget = -2.0f + yREG_F(3);
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (mTimers[2] > 0) {
|
|
var_f31 = 15.0f;
|
|
var_f29 = 10.0f + TREG_F(0);
|
|
mAnmSpeed = 0.65f + TREG_F(1);
|
|
mpModelMorf->setPlaySpeed(mAnmSpeed);
|
|
}
|
|
|
|
if (mTimers[1] == 0) {
|
|
mTimers[1] = (30.0f + nREG_F(2) + cM_rndF(20.0f - var_f31)) - var_f31;
|
|
|
|
sp40 = home.pos - current.pos;
|
|
sp40.x += cM_rndFX(200.0f + nREG_F(10));
|
|
sp40.z += cM_rndFX(200.0f + nREG_F(10));
|
|
mAngleTarget = cM_atan2s(sp40.x, sp40.z);
|
|
}
|
|
|
|
cLib_addCalc(&speed.y, mSpeedVTarget, 0.2f, 25.0f + yREG_F(11), 0.0f);
|
|
cLib_addCalc(&speedF, mSpeedFTarget, 0.02f + yREG_F(7), 5.0f, 0.0f);
|
|
|
|
if (eventInfo.checkCommandCatch()) {
|
|
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x604);
|
|
emitter->deleteAllParticle();
|
|
dComIfGp_particle_levelEmitterOnEventMove(field_0x604);
|
|
|
|
emitter = dComIfGp_particle_getEmitter(field_0x608);
|
|
emitter->deleteAllParticle();
|
|
dComIfGp_particle_levelEmitterOnEventMove(field_0x608);
|
|
|
|
sp18 = 1;
|
|
data_804D1831 = 0;
|
|
data_804D1830 = 0;
|
|
fopAcM_delete(this);
|
|
} else {
|
|
dComIfGp_att_CatchRequest(this, fpcNm_ITEM_FAIRY, 150.0f, 50.0f, -100.0f, 0x5000, 1);
|
|
eventInfo.onCondition(0x40);
|
|
}
|
|
|
|
if (sp18 == 0) {
|
|
field_0x604 = dComIfGp_particle_set(field_0x604, 0x72F, ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
field_0x608 = dComIfGp_particle_set(field_0x608, 0x731, ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
}
|
|
|
|
if (mTimers[3] == 0) {
|
|
if (dComIfGs_getLife() == dComIfGs_getMaxLifeGauge()) {
|
|
if (field_0x5d6 != 0 && mPrm == 5) {
|
|
LinkChk();
|
|
} else {
|
|
LinkChk();
|
|
}
|
|
}
|
|
}
|
|
|
|
cLib_addCalcAngleS2(¤t.angle.y, mAngleTarget, (26.0f - var_f29) + nREG_S(0), (field_0x61a + 0x1000));
|
|
}
|
|
|
|
/* 804CFCE8-804D057C 001628 0894+00 1/1 0/0 0/0 .text LinkAction__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::LinkAction() {
|
|
u8 sp18 = 0;
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
cXyz& player_pos = fopAcM_GetPosition(player);
|
|
cXyz sp44(30.0f + yREG_F(8), 80.0f + yREG_F(9), yREG_F(10));
|
|
cXyz sp38;
|
|
|
|
MTXCopy(daPy_getLinkPlayerActorClass()->getModelJointMtx(9), *calc_mtx);
|
|
MtxPosition(&sp44, &sp38);
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
sp38.y += 5.0f;
|
|
mAngleTarget = cLib_targetAngleY(¤t.pos, &sp38);
|
|
mAnmSpeed = 0.5f;
|
|
|
|
if (cLib_chasePos(¤t.pos, sp38, speedF)) {
|
|
speedF = 0.0f;
|
|
mSpeedFTarget = 0.0f;
|
|
mTimers[0] = 200;
|
|
mMode++;
|
|
}
|
|
|
|
if (!player->checkItemSwordEquip() || sp38.abs(field_0x5f8) > 6.0f) {
|
|
mAction = 0;
|
|
mMode = 0;
|
|
mTimers[2] = 80.0f + TREG_F(3);
|
|
mTimers[3] = 100;
|
|
mTimers[1] = 0;
|
|
data_804D1830 = 0;
|
|
field_0x5ac = 0;
|
|
}
|
|
|
|
mpModelMorf->setPlaySpeed(mAnmSpeed);
|
|
break;
|
|
case 1:
|
|
sp38.y += 5.0f;
|
|
|
|
if (mTimers[0] < 100) {
|
|
if (mpModelMorf->checkFrame(0.0f)) {
|
|
mAnmSpeed = 0.0f;
|
|
}
|
|
} else {
|
|
cLib_addCalc2(&mAnmSpeed, 0.3f, 0.05f, 0.001f);
|
|
}
|
|
|
|
mpModelMorf->setPlaySpeed(mAnmSpeed);
|
|
|
|
if (mTimers[0] == 0) {
|
|
mAction = 0;
|
|
mMode = 0;
|
|
mTimers[2] = 80.0f + TREG_F(3);
|
|
mTimers[3] = 100;
|
|
mTimers[1] = 0;
|
|
data_804D1830 = 0;
|
|
field_0x5ac = 0;
|
|
}
|
|
|
|
cLib_chasePos(¤t.pos, sp38, 3.0f);
|
|
|
|
if (!player->checkItemSwordEquip() || sp38.abs(field_0x5f8) > 2.0f) {
|
|
mAction = 0;
|
|
mMode = 0;
|
|
mTimers[2] = 80.0f + TREG_F(3);
|
|
mTimers[3] = 100;
|
|
mTimers[1] = 0;
|
|
data_804D1830 = 0;
|
|
field_0x5ac = 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
mAnmSpeed = 0.5f;
|
|
sp38 = player->getHeadTopPos();
|
|
sp38.y += 5.0f;
|
|
|
|
mAngleTarget = cLib_targetAngleY(¤t.pos, &sp38);
|
|
mSpeedFTarget = 2.0f;
|
|
cLib_addCalc2(&speedF, mSpeedFTarget, 0.2f + yREG_F(7), 5.0f);
|
|
|
|
if (cLib_chasePos(¤t.pos, sp38, speedF)) {
|
|
speedF = 0.0f;
|
|
mSpeedFTarget = 0.0f;
|
|
mTimers[0] = 200;
|
|
mMode++;
|
|
}
|
|
|
|
cLib_addCalcAngleS2(¤t.angle.y, mAngleTarget, 2, 0x400);
|
|
mpModelMorf->setPlaySpeed(mAnmSpeed);
|
|
break;
|
|
case 3:
|
|
if (mTimers[0] < 100) {
|
|
if (mpModelMorf->checkFrame(0.0f)) {
|
|
mAnmSpeed = 0.0f;
|
|
}
|
|
} else {
|
|
cLib_addCalc2(&mAnmSpeed, 0.3f, 0.05f, 0.001f);
|
|
}
|
|
|
|
sp38 = player->getHeadTopPos();
|
|
sp38.y += 5.0f;
|
|
mpModelMorf->setPlaySpeed(mAnmSpeed);
|
|
|
|
if (mTimers[0] == 0) {
|
|
mAction = 0;
|
|
mMode = 0;
|
|
mTimers[2] = 80.0f + TREG_F(3);
|
|
mTimers[3] = 100;
|
|
mTimers[1] = 0;
|
|
data_804D1831 = 0;
|
|
field_0x5ad = 0;
|
|
}
|
|
|
|
cLib_chasePos(¤t.pos, sp38, 3.0f);
|
|
|
|
if (sp38.abs(field_0x5f8) > 2.0f) {
|
|
mAction = 0;
|
|
mMode = 0;
|
|
mTimers[2] = 80.0f + TREG_F(3);
|
|
mTimers[3] = 100;
|
|
mTimers[1] = 0;
|
|
data_804D1831 = 0;
|
|
field_0x5ad = 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (eventInfo.checkCommandCatch()) {
|
|
dComIfGp_particle_getEmitter(field_0x604)->deleteAllParticle();
|
|
dComIfGp_particle_levelEmitterOnEventMove(field_0x604);
|
|
dComIfGp_particle_getEmitter(field_0x608)->deleteAllParticle();
|
|
dComIfGp_particle_levelEmitterOnEventMove(field_0x608);
|
|
sp18 = 1;
|
|
data_804D1831 = 0;
|
|
data_804D1830 = 0;
|
|
fopAcM_delete(this);
|
|
} else {
|
|
dComIfGp_att_CatchRequest(this, fpcNm_ITEM_FAIRY, 150.0f, 50.0f, -100.0f, 0x5000, 1);
|
|
eventInfo.onCondition(0x40);
|
|
}
|
|
|
|
if (sp18 == 0) {
|
|
field_0x604 = dComIfGp_particle_set(field_0x604, 0x72F, ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
field_0x608 = dComIfGp_particle_set(field_0x608, 0x731, ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
}
|
|
|
|
field_0x5f8 = sp38;
|
|
}
|
|
|
|
/* 804D057C-804D065C 001EBC 00E0+00 1/1 0/0 0/0 .text LinkSearch__13daObjYOUSEI_cFv */
|
|
bool daObjYOUSEI_c::LinkSearch() {
|
|
if (mDistToPlayer < 200.0f) {
|
|
f32 var_f31;
|
|
if (WayBgCheck(200.0f, 100.0f, mAngleToPlayer + 0x8000)) {
|
|
var_f31 = -200.0f;
|
|
} else {
|
|
var_f31 = 100.0f;
|
|
}
|
|
|
|
cXyz sp14(0.0f, 0.0f, var_f31);
|
|
mDoMtx_stack_c::YrotS(mAngleToPlayer + 0x8000);
|
|
cXyz sp8;
|
|
mDoMtx_stack_c::multVec(&sp14, &sp8);
|
|
home.pos.set(current.pos.x + sp8.x, home.pos.y, current.pos.z + sp8.z);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 804D065C-804D0780 001F9C 0124+00 1/1 0/0 0/0 .text WayBgCheck__13daObjYOUSEI_cFffs */
|
|
bool daObjYOUSEI_c::WayBgCheck(f32 param_0, f32 param_1, s16 param_2) {
|
|
dBgS_LinChk line_chk;
|
|
cXyz sp2C;
|
|
cXyz sp20;
|
|
cXyz sp14;
|
|
|
|
sp20 = current.pos;
|
|
sp20.y += param_1;
|
|
cMtx_YrotS(*calc_mtx, param_2);
|
|
sp2C.x = 0.0f;
|
|
sp2C.y = 50.0f;
|
|
sp2C.z = param_0;
|
|
MtxPosition(&sp2C, &sp14);
|
|
sp14 += current.pos;
|
|
line_chk.Set(&sp20, &sp14, NULL);
|
|
|
|
if (dComIfG_Bgsp().LineCross(&line_chk)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 804D0780-804D080C 0020C0 008C+00 4/4 0/0 0/0 .text CareAction__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::CareAction() {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
if (player->checkNowWolf()) {
|
|
field_0x5e8 = 0.7f + yREG_F(18);
|
|
} else {
|
|
field_0x5e8 = 1.0f;
|
|
}
|
|
|
|
mAction = 1;
|
|
mMode = 0;
|
|
field_0x5ae = 1;
|
|
mSound.startCreatureSound(Z2SE_FAIRY_S_FLY_RTT, 0, -1);
|
|
}
|
|
|
|
/* 804D080C-804D0910 00214C 0104+00 2/2 0/0 0/0 .text CheckGround__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::CheckGround() {
|
|
dBgS_ObjGndChk_All gnd_chk;
|
|
cXyz pos(current.pos.x, 100.0f + current.pos.y, current.pos.z);
|
|
gnd_chk.SetPos(&pos);
|
|
|
|
pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk);
|
|
if (pos.y != -1000000000.0f) {
|
|
home.pos.y = pos.y;
|
|
}
|
|
}
|
|
|
|
/* 804D0988-804D0AD0 0022C8 0148+00 1/1 0/0 0/0 .text CheckWater__13daObjYOUSEI_cFv */
|
|
bool daObjYOUSEI_c::CheckWater() {
|
|
dBgS_ObjGndChk_All gnd_chk;
|
|
cXyz pos(current.pos.x, 100.0f + current.pos.y, current.pos.z);
|
|
gnd_chk.SetPos(&pos);
|
|
pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk);
|
|
|
|
if (-1000000000.0f != pos.y && dComIfG_Bgsp().GetPolyAtt0(gnd_chk) == 7 && current.pos.y - pos.y < 50.0f+ yREG_F(0)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 804D0AD0-804D0CCC 002410 01FC+00 1/1 0/0 0/0 .text Action__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::Action() {
|
|
switch (mAction) {
|
|
case 0:
|
|
field_0x61a = 0;
|
|
WaitAction();
|
|
SpeedSet();
|
|
SetCcSph();
|
|
ObjHit();
|
|
|
|
if (field_0x5af != 0) {
|
|
if (mBoomerangMove.posMove(¤t.pos, &shape_angle.y, NULL, 0x1C00)) {
|
|
mBoomerangMove.bgCheckAfterOffset(¤t.pos);
|
|
} else {
|
|
field_0x5af = 0;
|
|
if (dComIfGs_getLife() != dComIfGs_getMaxLifeGauge()) {
|
|
CareAction();
|
|
}
|
|
home.pos = current.pos;
|
|
CheckGround();
|
|
}
|
|
}
|
|
|
|
mAcch.CrrPos(dComIfG_Bgsp());
|
|
|
|
if (mDistToPlayer < 50.0f && current.pos.y - sLink_Pos->y < 200.0f) {
|
|
if (dComIfGs_getLife() != dComIfGs_getMaxLifeGauge()) {
|
|
CareAction();
|
|
field_0x5af = 0;
|
|
}
|
|
}
|
|
|
|
if (fopAcM_checkHookCarryNow(this)) {
|
|
if (CheckWater()) {
|
|
fopAcM_cancelHookCarryNow(this);
|
|
}
|
|
home.pos = current.pos;
|
|
CheckGround();
|
|
}
|
|
break;
|
|
case 1:
|
|
MoveAction();
|
|
break;
|
|
case 2:
|
|
BinAction();
|
|
SpeedSet();
|
|
break;
|
|
case 3:
|
|
LinkAction();
|
|
break;
|
|
}
|
|
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
/* 804D0CCC-804D0DF0 00260C 0124+00 1/1 0/0 0/0 .text ObjHit__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::ObjHit() {
|
|
if (mCcSph.ChkTgHit()) {
|
|
cCcD_Obj* hit_obj = mCcSph.GetTgHitObj();
|
|
if (hit_obj->ChkAtType(AT_TYPE_BOOMERANG)) {
|
|
if (field_0x5af == 0) {
|
|
field_0x5af = 1;
|
|
mAcch.ClrMoveBGOnly();
|
|
mAcch.ClrGrndNone();
|
|
mCcSph.GetTgHitGObj();
|
|
mBoomerangMove.initOffset(¤t.pos);
|
|
}
|
|
} else if (hit_obj->ChkAtType(AT_TYPE_NORMAL_SWORD)) {
|
|
if (mDistToPlayer < 130.0f + TREG_F(5) && dComIfGs_getLife() != dComIfGs_getMaxLifeGauge()) {
|
|
CareAction();
|
|
} else {
|
|
mTimers[2] = 80.0f + TREG_F(3);
|
|
}
|
|
} else {
|
|
if (dComIfGs_getLife() != dComIfGs_getMaxLifeGauge()) {
|
|
CareAction();
|
|
}
|
|
}
|
|
|
|
mCcSph.ClrTgHit();
|
|
}
|
|
}
|
|
|
|
/* 804D0DF0-804D0F98 002730 01A8+00 1/1 0/0 0/0 .text Execute__13daObjYOUSEI_cFv */
|
|
int daObjYOUSEI_c::Execute() {
|
|
sLink_Pos = &fopAcM_GetPosition(daPy_getPlayerActorClass());
|
|
mDistToPlayer = fopAcM_searchPlayerDistanceXZ(this);
|
|
mAngleToPlayer = fopAcM_searchPlayerAngleY(this);
|
|
attention_info.position = current.pos;
|
|
eyePos = current.pos;
|
|
eyePos.y += 10.0f;
|
|
|
|
mSound.startCreatureSoundLevel(Z2SE_FAIRY_S_LV, 0, -1);
|
|
|
|
if (mpModelMorf->checkFrame(1.0f) && mAnmSpeed > 0.0f) {
|
|
mSound.startCreatureSound(Z2SE_FAIRY_S_FLY, 100.0f * mAnmSpeed, -1);
|
|
}
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (mTimers[i] != 0) {
|
|
mTimers[i]--;
|
|
}
|
|
}
|
|
|
|
if (field_0x5d6 != 0) {
|
|
field_0x5d6--;
|
|
}
|
|
|
|
Action();
|
|
mpModelMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
setBaseMtx();
|
|
return 1;
|
|
}
|
|
|
|
/* 804D0F98-804D0FCC 0028D8 0034+00 1/1 0/0 0/0 .text Delete__13daObjYOUSEI_cFv */
|
|
int daObjYOUSEI_c::Delete() {
|
|
if (heap != NULL) {
|
|
mpModelMorf->stopZelAnime();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 804D0FCC-804D1040 00290C 0074+00 1/1 0/0 0/0 .text setBaseMtx__13daObjYOUSEI_cFv */
|
|
void daObjYOUSEI_c::setBaseMtx() {
|
|
cXyz sp8(0.2f, 0.2f, 0.2f);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::scaleM(scale);
|
|
mpModelMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpModelMorf->modelCalc();
|
|
}
|
|
|
|
int daObjYOUSEI_c::Draw() {
|
|
J3DModel* model = mpModelMorf->getModel();
|
|
g_env_light.settingTevStruct(0, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(model, &tevStr);
|
|
mpModelMorf->entryDL();
|
|
|
|
cXyz sp8;
|
|
sp8.set(current.pos.x, 100.0f + current.pos.y, current.pos.z);
|
|
dComIfGd_setSimpleShadow(¤t.pos, mAcch.GetGroundH(), 25.0f, mAcch.m_gnd, 0, 0.8f, dDlst_shadowControl_c::getSimpleTex());
|
|
return 1;
|
|
}
|
|
|
|
/* 804D1040-804D10FC 002980 00BC+00 1/0 0/0 0/0 .text daObjYOUSEI_Draw__FP13daObjYOUSEI_c
|
|
*/
|
|
static int daObjYOUSEI_Draw(daObjYOUSEI_c* i_this) {
|
|
return i_this->Draw();
|
|
}
|
|
|
|
/* 804D10FC-804D111C 002A3C 0020+00 2/1 0/0 0/0 .text daObjYOUSEI_Execute__FP13daObjYOUSEI_c */
|
|
static int daObjYOUSEI_Execute(daObjYOUSEI_c* i_this) {
|
|
return i_this->Execute();
|
|
}
|
|
|
|
/* 804D111C-804D149C 002A5C 0380+00 1/1 0/0 0/0 .text create__13daObjYOUSEI_cFv */
|
|
int daObjYOUSEI_c::create() {
|
|
fopAcM_SetupActor(this, daObjYOUSEI_c);
|
|
|
|
OS_REPORT("YOUSEI PARAM %x\n", fopAcM_GetParam(this));
|
|
if (!fopAcM_entrySolidHeap(this, useHeapInit, 0x1100)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
mPrm = fopAcM_GetParam(this);
|
|
switch (mPrm) {
|
|
case 0:
|
|
mPrm = 0;
|
|
break;
|
|
case 1:
|
|
/* dSv_event_flag_c::F_0501 - sub-dungeon - Cave of Ordeals - B10 first arrival */
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[501])) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
mPrm = 1;
|
|
break;
|
|
case 2:
|
|
mPrm = 2;
|
|
/* dSv_event_flag_c::F_0502 - sub-dungeon - Cave of Ordeals - B20 first arrival */
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[502])) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
break;
|
|
case 3:
|
|
mPrm = 3;
|
|
/* dSv_event_flag_c::F_0503 - sub-dungeon - Cave of Ordeals - B30 first arrival */
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[503])) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
break;
|
|
case 4:
|
|
mPrm = 4;
|
|
/* dSv_event_flag_c::F_0504 - sub-dungeon - Cave of Ordeals - B40 first arrival */
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[504])) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
break;
|
|
default:
|
|
mPrm = 5;
|
|
break;
|
|
}
|
|
|
|
gravity = nREG_F(0);
|
|
mAction = 0;
|
|
mMode = 0;
|
|
|
|
mTimers[2] = 80.0f + TREG_F(3);
|
|
mAcchCir.SetWall(100.0f, 30.0f);
|
|
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL);
|
|
|
|
fopAcM_SetMtx(this, mpModelMorf->getModel()->getBaseTRMtx());
|
|
fopAcM_SetMin(this, -50.0f, -50.0f, -50.0f);
|
|
fopAcM_SetMax(this, 50.0f, 50.0f, 50.0f);
|
|
|
|
InitCcSph();
|
|
mSound.init(¤t.pos, &eyePos, 3, 1);
|
|
|
|
if (mPrm == 0) {
|
|
execItemGet(fpcNm_ITEM_RECOVERY_FAILY);
|
|
CareAction();
|
|
scale.set(0.2f, 0.2f, 0.2f);
|
|
} else {
|
|
current.pos.y += 50.0f;
|
|
field_0x5d6 = 1500;
|
|
}
|
|
|
|
CheckGround();
|
|
field_0x61a = 0;
|
|
daObjYOUSEI_Execute(this);
|
|
return cPhs_COMPLEATE_e;
|
|
}
|
|
|
|
/* 804D159C-804D15A4 002EDC 0008+00 1/0 0/0 0/0 .text daObjYOUSEI_IsDelete__FP13daObjYOUSEI_c */
|
|
static int daObjYOUSEI_IsDelete(daObjYOUSEI_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 804D1728-804D1748 -00001 0020+00 1/0 0/0 0/0 .data l_daObjYOUSEI_Method */
|
|
static actor_method_class l_daObjYOUSEI_Method = {
|
|
(process_method_func)daObjYOUSEI_Create,
|
|
(process_method_func)daObjYOUSEI_Delete,
|
|
(process_method_func)daObjYOUSEI_Execute,
|
|
(process_method_func)daObjYOUSEI_IsDelete,
|
|
(process_method_func)daObjYOUSEI_Draw,
|
|
};
|
|
|
|
/* 804D1748-804D1778 -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_Yousei */
|
|
extern actor_process_profile_definition g_profile_Obj_Yousei = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_Yousei, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjYOUSEI_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
475, // mPriority
|
|
&l_daObjYOUSEI_Method, // sub_method
|
|
0x000C0100, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|
|
|
|
AUDIO_INSTANCES
|