diff --git a/include/d/actor/d_a_obj_ikada.h b/include/d/actor/d_a_obj_ikada.h index 674d087e1..3293dafce 100644 --- a/include/d/actor/d_a_obj_ikada.h +++ b/include/d/actor/d_a_obj_ikada.h @@ -89,12 +89,12 @@ public: /* 0x02A4 */ u8 mPathId; /* 0x02A5 */ u8 m02A5[0x02A8 - 0x02A5]; /* 0x02A8 */ cXyz mCurPathP0; - /* 0x02B4 */ u8 mCurPathPoint; + /* 0x02B4 */ s8 mCurPathPoint; /* 0x02B5 */ u8 m02B5[0x02B8 - 0x02B5]; /* 0x02B8 */ dPath* mpPath; /* 0x02BC */ u8 m02BC[0x02C0 - 0x02BC]; /* 0x02C0 */ cXyz mCurPathP1; - /* 0x02CC */ u8 m02CC[0x02D8 - 0x02CC]; + /* 0x02CC */ cXyz m02CC; /* 0x02D8 */ f32 mVelocityFwdTarget; /* 0x02DC */ cXyz mPathPosTarget; /* 0x02E8 */ u8 m02E8[0x02EC - 0x02E8]; diff --git a/include/d/actor/d_a_tag_island.h b/include/d/actor/d_a_tag_island.h index 1771004d0..be839bb2f 100644 --- a/include/d/actor/d_a_tag_island.h +++ b/include/d/actor/d_a_tag_island.h @@ -3,51 +3,66 @@ #include "f_op/f_op_actor.h" +class msg_class; + class daTag_Island_c : public fopAc_ac_c { public: - void chkFlag(unsigned short) {} - void clrFlag(unsigned short) {} + bool chkFlag(u16 flag) { return (mFlag & flag) == flag; } + void clrFlag(u16 flag) { mFlag &= ~flag; } + void setFlag(u16 flag) { mFlag |= flag; } + inline s32 create(); inline BOOL draw(); inline BOOL execute(); - void setActio(unsigned char) {} - void setFlag(unsigned short) {} + void setActio(u8 v) { mAction = v; } - void getEventNo(); - void getSwbit(); - void getType(); - void checkArea(); + u8 getEventNo(); + u8 getSwbit(); + u8 getType(); + BOOL checkArea(); void makeEvId(); - void getArrivalFlag(); - void otherCheck(); - void arrivalTerms(); + u16 getArrivalFlag(); + BOOL otherCheck(); + BOOL arrivalTerms(); void demoInitProc(); - void next_msgStatus(unsigned long*); - void getMsg(); + int next_msgStatus(unsigned long*); + u32 getMsg(); void talkInit(); - void talk(); + u16 talk(); void demoInitTact_Bf(); - void demoProcTact_Bf(); + BOOL demoProcTact_Bf(); void demoInitTact_Af(); - void demoProcTact_Af(); + BOOL demoProcTact_Af(); void demoInitSpeak(); - void demoProcSpeak(); + BOOL demoProcSpeak(); void demoInitWait(); - void demoProcWait(); + BOOL demoProcWait(); void demoInitCom(); - void demoProcCom(); - void demoProcCom_ikada(); - void getNowEventAction(); - void demoProc(); - void actionTact(); - void actionEvent(); - void actionReady(); - void actionHunt(); - void actionArrival(); - void actionWait(); + BOOL demoProcCom(); + BOOL demoProcCom_ikada(); + int getNowEventAction(); + BOOL demoProc(); + BOOL actionTact(); + BOOL actionEvent(); + BOOL actionReady(); + BOOL actionHunt(); + BOOL actionArrival(); + BOOL actionWait(); public: /* Place member variables here */ + /* 0x290 */ u16 m290; + /* 0x292 */ u16 m292; + /* 0x294 */ u8 mAction; + /* 0x296 */ u16 mFlag; + /* 0x298 */ u32 mMsg; + /* 0x29C */ s8 mTalkState; + /* 0x29D */ u8 pad[3]; + /* 0x2A0 */ u8 m2A0; + /* 0x2A2 */ s16 mTimer; + /* 0x2A4 */ u32 mStaffId; + /* 0x2A8 */ s16 mEventId; + /* 0x2AC */ s32 m2AC; }; #endif /* D_A_TAG_ISLAND_H */ diff --git a/src/d/actor/d_a_tag_island.cpp b/src/d/actor/d_a_tag_island.cpp index 5972f7530..4c496cc2c 100644 --- a/src/d/actor/d_a_tag_island.cpp +++ b/src/d/actor/d_a_tag_island.cpp @@ -4,191 +4,515 @@ // #include "d/actor/d_a_tag_island.h" +#include "d/actor/d_a_obj_ikada.h" +#include "d/actor/d_a_player_main.h" +#include "d/d_com_inf_game.h" #include "d/d_procname.h" +static uint l_msgId; +static msg_class* l_msg; + +enum { + ACT_HUNT, + ACT_ARRIVAL, + ACT_WAIT, + ACT_READY, + ACT_EVENT, + ACT_TACT, +}; + +enum { + EVENT_WAIT, + EVENT_SPEAK, + EVENT_TACT_BF, + EVENT_TACT_MD, + EVENT_TACT_AF, +}; + /* 00000078-00000084 .text getEventNo__14daTag_Island_cFv */ -void daTag_Island_c::getEventNo() { - /* Nonmatching */ +u8 daTag_Island_c::getEventNo() { + return (fopAcM_GetParam(this) >> 24) & 0xFF; } /* 00000084-00000090 .text getSwbit__14daTag_Island_cFv */ -void daTag_Island_c::getSwbit() { - /* Nonmatching */ +u8 daTag_Island_c::getSwbit() { + return (fopAcM_GetParam(this) >> 8) & 0xFF; } /* 00000090-0000009C .text getType__14daTag_Island_cFv */ -void daTag_Island_c::getType() { - /* Nonmatching */ +u8 daTag_Island_c::getType() { + return (fopAcM_GetParam(this) >> 0) & 0xFF; } /* 0000009C-000001D8 .text checkArea__14daTag_Island_cFv */ -void daTag_Island_c::checkArea() { - /* Nonmatching */ +BOOL daTag_Island_c::checkArea() { + fopAc_ac_c* player = dComIfGp_getLinkPlayer(); + cXyz delta = player->current.pos - current.pos; + if (delta.y < 0.0f) + delta.y = -delta.y; + f32 distXZ = delta.absXZ(); + if (distXZ < scale.x * 10000.0f && delta.y <= scale.y * 10000.0f) + return TRUE; + return FALSE; } /* 000001D8-00000354 .text makeEvId__14daTag_Island_cFv */ void daTag_Island_c::makeEvId() { - /* Nonmatching */ + mEventId = dComIfGp_evmng_getEventIdx(NULL, getEventNo()); + + if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) { + s16 idx; + + switch (getType()) { + case 1: idx = dComIfGp_evmng_getEventIdx("ARRIVAL_DRG2"); break; + case 2: idx = dComIfGp_evmng_getEventIdx("ARRIVAL_GND2"); break; + case 3: idx = dComIfGp_evmng_getEventIdx("ARRIVAL_WND2"); break; + case 4: idx = dComIfGp_evmng_getEventIdx("ARRIVAL_TWN2"); break; + case 5: idx = dComIfGp_evmng_getEventIdx("ARRIVAL_FST2"); break; + case 6: idx = dComIfGp_evmng_getEventIdx("ARRIVAL_BRK2"); break; + case 7: idx = dComIfGp_evmng_getEventIdx("PUROLO_RETURN2"); break; + } + + if (idx != -1) + mEventId = idx; + } } /* 00000354-000003D4 .text getArrivalFlag__14daTag_Island_cFv */ -void daTag_Island_c::getArrivalFlag() { - /* Nonmatching */ +u16 daTag_Island_c::getArrivalFlag() { + switch (getType()) { + case 1: return 0x0902; + case 2: return 0x0A20; + case 3: return 0x0A02; + case 4: return 0x1F04; + case 5: return 0x2E04; + case 6: return 0x2E02; + case 7: return 0x3E10; + default: return 0; + } } /* 000003D4-0000045C .text otherCheck__14daTag_Island_cFv */ -void daTag_Island_c::otherCheck() { - /* Nonmatching */ +BOOL daTag_Island_c::otherCheck() { + switch (getType()) { + case 5: + if (!dComIfGs_isEventBit(0x1608)) + return FALSE; + break; + case 6: + if (!dComIfGs_isEventBit(0x1604)) + return FALSE; + break; + } + + return TRUE; } /* 0000045C-00000514 .text arrivalTerms__14daTag_Island_cFv */ -void daTag_Island_c::arrivalTerms() { - /* Nonmatching */ +BOOL daTag_Island_c::arrivalTerms() { + if (dComIfGs_isEventBit(getArrivalFlag())) + return FALSE; + + switch (getType()) { + case 4: + if (!dKy_checkEventNightStop()) + return FALSE; + break; + case 7: + if (!dKy_checkEventNightStop()) + return FALSE; + if (!dComIfGs_checkGetItem(dItem_BOMB_BAG_e)) + return FALSE; + break; + } + + return TRUE; } /* 00000514-00000550 .text demoInitProc__14daTag_Island_cFv */ void daTag_Island_c::demoInitProc() { - /* Nonmatching */ + m290 = 0; + dComIfGs_onEventBit(getArrivalFlag()); } /* 00000550-00000558 .text next_msgStatus__14daTag_Island_cFPUl */ -void daTag_Island_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +int daTag_Island_c::next_msgStatus(unsigned long*) { + return fopMsgStts_MSG_ENDS_e; } /* 00000558-00000560 .text getMsg__14daTag_Island_cFv */ -void daTag_Island_c::getMsg() { - /* Nonmatching */ +u32 daTag_Island_c::getMsg() { + return m2AC; } /* 00000560-0000056C .text talkInit__14daTag_Island_cFv */ void daTag_Island_c::talkInit() { - /* Nonmatching */ + mTalkState = 0; } /* 0000056C-000006AC .text talk__14daTag_Island_cFv */ -void daTag_Island_c::talk() { +u16 daTag_Island_c::talk() { /* Nonmatching */ + u16 ret = 0xFF; + switch (mTalkState) { + case 0: + l_msgId = fpcM_ERROR_PROCESS_ID_e; + mMsg = getMsg(); + mTalkState = 1; + break; + case 1: + l_msg = fopMsgM_SearchByID(l_msgId); + if (l_msg != NULL) + mTalkState = 2; + break; + case 2: + if (l_msgId == fpcM_ERROR_PROCESS_ID_e) + l_msgId = fopMsgM_messageSet(mMsg, this); + + ret = l_msg->mStatus; + if (ret == fopMsgStts_MSG_DISPLAYED_e) { + l_msg->mStatus = next_msgStatus(&mMsg); + if (l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) { + fopMsgM_messageSet(mMsg); + } + } else if (ret == fopMsgStts_BOX_CLOSED_e) { + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + mTalkState = -1; + } + break; + } + + return ret; } /* 000006AC-00000778 .text demoInitTact_Bf__14daTag_Island_cFv */ void daTag_Island_c::demoInitTact_Bf() { - /* Nonmatching */ + talkInit(); + + s32* a_intP = (s32*)dComIfGp_evmng_getMyIntegerP(mStaffId, "prm0"); + JUT_ASSERT(0x167, a_intP); + + if (a_intP != NULL) { + dComIfGp_setMelodyNum(*a_intP); + if (*a_intP == 6) { + m2AC = 0x05B4; + } else { + m2AC = 0x05B3; + } + } } /* 00000778-000007C8 .text demoProcTact_Bf__14daTag_Island_cFv */ -void daTag_Island_c::demoProcTact_Bf() { - /* Nonmatching */ +BOOL daTag_Island_c::demoProcTact_Bf() { + if (talk() == fopMsgStts_UNK15_e) + dComIfGp_evmng_cutEnd(mStaffId); + return TRUE; } /* 000007C8-00000854 .text demoInitTact_Af__14daTag_Island_cFv */ void daTag_Island_c::demoInitTact_Af() { - /* Nonmatching */ + daPy_lk_c* player = daPy_getPlayerLinkActorClass(); + l_msg->mStatus = fopMsgStts_MSG_ENDS_e; + fopMsgM_messageSendOn(); + if (player->getTactTimerCancel() > 0) + setFlag(0x04); + else + clrFlag(0x04); } /* 00000854-00000A00 .text demoProcTact_Af__14daTag_Island_cFv */ -void daTag_Island_c::demoProcTact_Af() { +BOOL daTag_Island_c::demoProcTact_Af() { /* Nonmatching */ + u16 rt = talk(); + if (rt == fopMsgStts_BOX_CLOSED_e || rt == 0xFE) { + if (chkFlag(0x01)) { + clrFlag(0x01); + if (chkFlag(0x04)) { + if (m2A0 == 1) { + mEventId = dComIfGp_evmng_getEventIdx("TACT_TEARCH4"); + } else { + mEventId = dComIfGp_evmng_getEventIdx("TACT_TEARCH1"); + } + } else { + if (m2A0 == 0) { + m2A0 = 1; + mEventId = dComIfGp_evmng_getEventIdx("TACT_TEARCH2"); + } else { + mEventId = dComIfGp_evmng_getEventIdx("TACT_TEARCH3"); + } + } + setFlag(0x02); + fopAcM_orderChangeEventId(this, daPy_getPlayerLinkActorClass(), mEventId, 0, 0xFFFF); + } else { + JUT_ASSERT(0x1b3, 0); + dComIfGp_evmng_cutEnd(mStaffId); + } + } + + return TRUE; } /* 00000A00-00000AC4 .text demoInitSpeak__14daTag_Island_cFv */ void daTag_Island_c::demoInitSpeak() { /* Nonmatching */ + talkInit(); + s32* a_intP = (s32*)dComIfGp_evmng_getMyIntegerP(mStaffId, "MsgNo"); + JUT_ASSERT(0x1C2, a_intP); + + m2AC = *a_intP; + if (m2AC == 0x0638 && m2A0 != 0) + m2AC = 0x063A; } /* 00000AC4-00000B1C .text demoProcSpeak__14daTag_Island_cFv */ -void daTag_Island_c::demoProcSpeak() { - /* Nonmatching */ +BOOL daTag_Island_c::demoProcSpeak() { + u16 rt = talk(); + if (rt == fopMsgStts_BOX_CLOSED_e || rt == 0xFE) + dComIfGp_evmng_cutEnd(mStaffId); + return FALSE; } /* 00000B1C-00000B84 .text demoInitWait__14daTag_Island_cFv */ void daTag_Island_c::demoInitWait() { /* Nonmatching */ + s32* a_intP = (s32*)dComIfGp_evmng_getMyIntegerP(mStaffId, "Timer"); + if (a_intP != NULL) + mTimer = *a_intP; + else + mTimer = 0; } /* 00000B84-00000BD4 .text demoProcWait__14daTag_Island_cFv */ -void daTag_Island_c::demoProcWait() { - /* Nonmatching */ +BOOL daTag_Island_c::demoProcWait() { + if (mTimer > 0) + mTimer--; + else + dComIfGp_evmng_cutEnd(mStaffId); + return FALSE; } /* 00000BD4-00000BE4 .text demoInitCom__14daTag_Island_cFv */ void daTag_Island_c::demoInitCom() { - /* Nonmatching */ + setFlag(0x01); } /* 00000BE4-00000BE8 .text demoProcCom__14daTag_Island_cFv */ -void daTag_Island_c::demoProcCom() { - /* Nonmatching */ +BOOL daTag_Island_c::demoProcCom() { } /* 00000BE8-00000CFC .text demoProcCom_ikada__14daTag_Island_cFv */ -void daTag_Island_c::demoProcCom_ikada() { +BOOL daTag_Island_c::demoProcCom_ikada() { /* Nonmatching */ + daObj_Ikada_c* ikada = (daObj_Ikada_c*)fopAcM_searchFromName("ikada_h", 0, 0); + if (ikada != NULL) { + ikada->mCurPathP0 = ikada->mInitPos; + ikada->current.pos = ikada->mCurPathP0; + ikada->mCurPathPoint = 0; + ikada->m02CC = ikada->mpPath->mpPnt[ikada->mCurPathPoint].mPos; + ikada->mCurPathP1 = ikada->mpPath->mpPnt[ikada->mCurPathPoint + 1].mPos; + ikada->mPathPosTarget = ikada->mpPath->mpPnt[ikada->mCurPathPoint].mPos; + } } /* 00000CFC-00000D44 .text getNowEventAction__14daTag_Island_cFv */ -void daTag_Island_c::getNowEventAction() { - /* Nonmatching */ +int daTag_Island_c::getNowEventAction() { + static const char *action_table[] = { + "WAIT", + "SPEAK", + "TACT_BF", + "TACT_MD", + "TACT_AF", + }; + + return dComIfGp_evmng_getMyActIdx(mStaffId, (char**)action_table, ARRAY_SIZE(action_table), FALSE, 1); } /* 00000D44-00000EDC .text demoProc__14daTag_Island_cFv */ -void daTag_Island_c::demoProc() { - /* Nonmatching */ +BOOL daTag_Island_c::demoProc() { + BOOL ret = FALSE; + + if (chkFlag(0x02)) { + mStaffId = dComIfGp_evmng_getMyStaffId("TagIsl"); + clrFlag(0x02); + dComIfGp_event_setTalkPartner(dComIfGp_getShipActor()); + } + + int action = getNowEventAction(); + if (dComIfGp_evmng_getIsAddvance(mStaffId)) { + demoInitCom(); + switch (action) { + case EVENT_SPEAK: demoInitSpeak(); break; + case EVENT_WAIT: demoInitWait(); break; + case EVENT_TACT_BF: demoInitTact_Bf(); break; + case EVENT_TACT_AF: demoInitTact_Af(); break; + } + } + + switch (action) { + case EVENT_SPEAK: ret = demoProcSpeak(); break; + case EVENT_WAIT: demoProcWait(); break; + case EVENT_TACT_BF: ret = demoProcTact_Bf(); break; + case EVENT_TACT_AF: ret = demoProcTact_Af(); break; + default: dComIfGp_evmng_cutEnd(mStaffId); break; + } + + demoProcCom(); + return ret; } /* 00000EDC-00000F4C .text actionTact__14daTag_Island_cFv */ -void daTag_Island_c::actionTact() { - /* Nonmatching */ +BOOL daTag_Island_c::actionTact() { + if (dComIfGp_evmng_endCheck(mEventId)) { + setActio(ACT_HUNT); + dComIfGp_event_reset(); + } else { + demoProc(); + } + return TRUE; } /* 00000F4C-00001034 .text actionEvent__14daTag_Island_cFv */ -void daTag_Island_c::actionEvent() { +BOOL daTag_Island_c::actionEvent() { /* Nonmatching */ + if (dComIfGp_evmng_endCheck(mEventId)) { + if (getType() == 1) { + setFlag(0x02); + setActio(ACT_TACT); + mEventId = dComIfGp_evmng_getEventIdx("TACT_TEARCH0"); + fopAcM_orderChangeEventId(this, daPy_getPlayerLinkActorClass(), mEventId, 0, 0xFFFF); + m2A0 = 0; + } else { + setActio(ACT_HUNT); + dComIfGp_event_reset(); + } + } else { + demoProcCom_ikada(); + } + return TRUE; } /* 00001034-00001130 .text actionReady__14daTag_Island_cFv */ -void daTag_Island_c::actionReady() { - /* Nonmatching */ +BOOL daTag_Island_c::actionReady() { + s32 swbit = getSwbit(); + if (eventInfo.checkCommandDemoAccrpt()) { + demoInitProc(); + dComIfGp_event_setTalkPartner(dComIfGp_getShipActor()); + setActio(ACT_EVENT); + actionEvent(); + if (swbit != 0xFF) + dComIfGs_onSwitch(swbit, current.roomNo); + } else if (swbit != 0xFF && dComIfGs_isSwitch(swbit, current.roomNo)) { + setActio(ACT_HUNT); + } else { + makeEvId(); + fopAcM_orderOtherEventId(this, mEventId); + } + return TRUE; } /* 00001130-000011E4 .text actionHunt__14daTag_Island_cFv */ -void daTag_Island_c::actionHunt() { - /* Nonmatching */ +BOOL daTag_Island_c::actionHunt() { + s32 swbit = getSwbit(); + if (swbit != 0xFF && dComIfGs_isSwitch(swbit, current.roomNo)) { + setActio(ACT_HUNT); + } else { + if (otherCheck() && checkArea()) { + makeEvId(); + setActio(ACT_READY); + fopAcM_orderOtherEventId(this, mEventId); + } + } + return TRUE; } /* 000011E4-00001238 .text actionArrival__14daTag_Island_cFv */ -void daTag_Island_c::actionArrival() { - /* Nonmatching */ +BOOL daTag_Island_c::actionArrival() { + if (arrivalTerms()) { + setActio(ACT_WAIT); + actionHunt(); + } else { + setActio(ACT_HUNT); + } + return TRUE; } /* 00001238-00001240 .text actionWait__14daTag_Island_cFv */ -void daTag_Island_c::actionWait() { +BOOL daTag_Island_c::actionWait() { + return TRUE; +} + +s32 daTag_Island_c::create() { + fopAcM_SetupActor(this, daTag_Island_c); + s32 swbit = getSwbit(); + makeEvId(); + eventInfo.setEventId(mEventId); + eventInfo.mMapToolId = getEventNo(); + + if (mEventId != -1 && swbit != 0xFF && !dComIfGs_isSwitch(swbit, current.roomNo)) { + setActio(ACT_ARRIVAL); + } else { + setActio(ACT_HUNT); + } + shape_angle.x = shape_angle.z = 0; + current.angle.x = current.angle.z = 0; + return cPhs_COMPLEATE_e; +} + +BOOL daTag_Island_c::draw() { + return TRUE; +} + +BOOL daTag_Island_c::execute() { /* Nonmatching */ + switch (mAction) { + case ACT_ARRIVAL: + actionArrival(); + break; + case ACT_HUNT: + default: + actionHunt(); + break; + case ACT_READY: + actionReady(); + break; + case ACT_EVENT: + actionEvent(); + break; + case ACT_TACT: + actionTact(); + break; + case ACT_WAIT: + actionWait(); + break; + } + + return TRUE; } /* 00001240-00001248 .text daTag_Island_Draw__FP14daTag_Island_c */ -static BOOL daTag_Island_Draw(daTag_Island_c*) { - /* Nonmatching */ +static BOOL daTag_Island_Draw(daTag_Island_c* i_this) { + return i_this->draw(); } /* 00001248-000012C4 .text daTag_Island_Execute__FP14daTag_Island_c */ -static BOOL daTag_Island_Execute(daTag_Island_c*) { - /* Nonmatching */ +static BOOL daTag_Island_Execute(daTag_Island_c* i_this) { + return i_this->execute(); } /* 000012C4-000012CC .text daTag_Island_IsDelete__FP14daTag_Island_c */ -static BOOL daTag_Island_IsDelete(daTag_Island_c*) { - /* Nonmatching */ +static BOOL daTag_Island_IsDelete(daTag_Island_c* i_this) { + return TRUE; } /* 000012CC-000012FC .text daTag_Island_Delete__FP14daTag_Island_c */ -static BOOL daTag_Island_Delete(daTag_Island_c*) { - /* Nonmatching */ +static BOOL daTag_Island_Delete(daTag_Island_c* i_this) { + i_this->~daTag_Island_c(); + return TRUE; } /* 000012FC-000013D8 .text daTag_Island_Create__FP10fopAc_ac_c */ -static s32 daTag_Island_Create(fopAc_ac_c*) { - /* Nonmatching */ +static s32 daTag_Island_Create(fopAc_ac_c* i_ac) { + return ((daTag_Island_c*)i_ac)->create(); } static actor_method_class l_daTag_Island_Method = {