diff --git a/configure.py b/configure.py index 85d9054aa..a3279641c 100644 --- a/configure.py +++ b/configure.py @@ -1393,7 +1393,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_wind_tag"), ActorRel(NonMatching, "d_a_acorn_leaf"), ActorRel(NonMatching, "d_a_atdoor"), - ActorRel(NonMatching, "d_a_auction"), + ActorRel(NonMatching, "d_a_auction", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_bb"), ActorRel(NonMatching, "d_a_bdk"), ActorRel(NonMatching, "d_a_bdkobj"), diff --git a/include/d/actor/d_a_auction.h b/include/d/actor/d_a_auction.h index 10a0d1572..6095c3baa 100644 --- a/include/d/actor/d_a_auction.h +++ b/include/d/actor/d_a_auction.h @@ -3,15 +3,26 @@ #include "f_op/f_op_actor.h" #include "SSystem/SComponent/c_phase.h" +#include "d/d_com_inf_game.h" #include "d/d_npc.h" +#include "m_Do/m_Do_hostIO.h" -class daAuction_c : public fopAc_ac_c { +class daAuction_c : public fopNpc_npc_c { public: + typedef void(daAuction_c::*ProcFunc_t)(); + + struct ItemData { + /* 0x00 */ s16 mItemID; + /* 0x02 */ s16 mNameMsgID; + /* 0x04 */ s16 mStartingBid; + /* 0x06 */ u16 mObtainedEventBit; + }; // Size: 0x08 + daAuction_c(); void chkNpcExec(int) {} void getAnmNpcNo() {} - void getAucMdlNo(unsigned char) {} + u8 getAucMdlNo(u8 idx) { return mAucMdlNo[idx]; } void getAucNpcNo(unsigned char) {} void getBetNpcNo() {} void getKind(unsigned char) {} @@ -21,18 +32,21 @@ public: void isAucBetA() {} void isAucGet() {} void isAucJikkyou() {} - void offCamera() {} + void offCamera() { // Might be incorrect + m835 |= 2; + m835 &= 0xFE; + } void onCamera(unsigned char) {} void onCameraOld(unsigned char) {} - void setAucMdlNo(unsigned char, unsigned char) {} + void setAucMdlNo(u8 idx, u8 mdlNo) { mAucMdlNo[idx] = mdlNo; } void setItemNo(unsigned char) {} void setKind(unsigned char, unsigned char) {} void setNpcID(int, uint) {} void setStart(unsigned char) {} s32 _create(); - void createHeap(); - void createInit(); + BOOL createHeap(); + s32 createInit(); BOOL _delete(); BOOL _draw(); BOOL _execute(); @@ -44,12 +58,12 @@ public: void eventMove(); void privateCut(); void eventTalkInit(int); - void eventMesSet(); - void eventMesEnd(); + bool eventMesSet(); + bool eventMesEnd(); void eventStartInit(); - void eventStart(); + bool eventStart(); void eventMainInit(); - void eventMain(); + bool eventMain(); void eventMainKai(); void eventMainUri(); void eventMainMsgSet(); @@ -57,65 +71,113 @@ public: void eventMainMsgBikonC(); void eventMainMsgBikonW(); void eventGetItemInit(); - void eventGetItem(); + bool eventGetItem(); void eventCameraOffInit(); - void eventGetItemNpcInit(int); + void eventGetItemNpcInit(int staffIdx); void eventGetItemMesInit(); - void eventCameraOffNpc(); + bool eventCameraOffNpc(); void eventEndInit(); - void eventEnd(); + bool eventEnd(); void eventCameraTestInit(); - void eventCameraTest(); - void next_msgStatus(unsigned long*); - void setMessage(unsigned long); - void setMessage2(unsigned long); + bool eventCameraTest(); + u16 next_msgStatus(u32* pMsgNo); + void setMessage(u32); + void setMessage2(u32); void setMtx(); - void getItemNo(); - void getNpcActorP(int); - void setCameraNpc(int, short); - void setLinkAnm(unsigned char); - void getPiconDispOfs(unsigned char); + u8 getItemNo(); + fopAc_ac_c* getNpcActorP(int idx); + void setCameraNpc(int, s16); + void setLinkAnm(u8 linkAnm); + f32 getPiconDispOfs(u8 param); void nextBet(); - void getRand(int); + int getRand(int); public: - /* 0x290 */ u8 m290[0x6C4 - 0x290]; /* 0x6C4 */ request_of_phase_process_class mPhs; /* 0x6CC */ dNpc_EventCut_c mNpcEvtInfo; - /* 0x730 */ u8 m730[0x788 - 0x730]; + /* 0x738 */ u32 m738[8]; + /* 0x758 */ uint mCurrAuctionItemPID; + /* 0x75C */ uint mTimerID; + /* 0x760 */ uint mGaugeID; + /* 0x764 */ dTimer_c* mpTimer; + /* 0x768 */ LIGHT_INFLUENCE mLight; /* 0x788 */ J3DModel* mpModel; - /* 0x78C */ u8 m78C[0x7A4 - 0x78C]; - /* 0x7A4 */ int m7A4; - /* 0x7A8 */ u8 m7A8[0x7EC - 0x7A8]; + /* 0x78C */ cXyz m78C; + /* 0x798 */ cXyz m798; + /* 0x7A4 */ JPABaseEmitter* mpEmitter; + /* 0x7A8 */ cXyz m7A8; + /* 0x7B4 */ u8 m7B4[0x7BC - 0x7B4]; + /* 0x7BC */ f32 mAlpha; + /* 0x7C0 */ f32 mBlend; + /* 0x7C4 */ f32 m7C4[7]; // Npc wait timer? + /* 0x7E0 */ f32 m7E0; + /* 0x7E4 */ f32 m7E4; + /* 0x7E8 */ u8 m7E8[0x7EC - 0x7E8]; /* 0x7EC */ int m7EC; /* 0x7F0 */ int m7F0; - /* 0x7F4 */ u16 mEvtStartIdx; - /* 0x7F6 */ u16 mEvtGetItemIdx; - /* 0x7F8 */ u16 mEvtNoItemIdx; - /* 0x7FA */ u16 mEvtStart2Idx; - /* 0x7FC */ u16 mEvtEnd2Idx; - /* 0x7FE */ u16 mCurrItemNameMsgNo; - /* 0x800 */ u8 m800[0x81C - 0x800]; + /* 0x7F4 */ s16 mEvtStartIdx; + /* 0x7F6 */ s16 mEvtGetItemIdx; + /* 0x7F8 */ s16 mEvtNoItemIdx; + /* 0x7FA */ s16 mEvtStart2Idx; + /* 0x7FC */ s16 mEvtEnd2Idx; + /* 0x7FE */ s16 mCurrBid; + /* 0x800 */ s16 m800; + /* 0x802 */ s16 mTimer; + /* 0x804 */ u16 m804; + /* 0x806 */ s16 m806; + /* 0x808 */ s16 m808; + /* 0x80A */ s16 m80A; + /* 0x80C */ u8 m80C[8]; + /* 0x814 */ u8 mAucMdlNo[8]; /* 0x81C */ u8 m81C; /* 0x81D */ u8 m81D; - /* 0x81E */ u8 m81E; - /* 0x81F */ u8 m81F[0x820 - 0x81F]; + /* 0x81E */ u8 mMoveState; + /* 0x81F */ u8 m81F; /* 0x820 */ u8 m820; /* 0x821 */ u8 m821; /* 0x822 */ u8 m822; /* 0x823 */ u8 mCurrAuctionItemIndex; /* 0x824 */ u8 m824; - /* 0x825 */ u8 m825[0x826 - 0x825]; + /* 0x825 */ u8 m825; /* 0x826 */ u8 m826; - /* 0x827 */ u8 m827[0x82D - 0x827]; + /* 0x827 */ u8 m827; + /* 0x828 */ u8 m828; + /* 0x829 */ u8 m829; + /* 0x82A */ u8 m82A; + /* 0x82B */ u8 m82B; + /* 0x82C */ u8 m82C; /* 0x82D */ u8 mCurLinkAnm; - /* 0x82E */ u8 m82E[0x832 - 0x82E]; + /* 0x82E */ u8 m82E; + /* 0x82F */ u8 m82F; + /* 0x830 */ u8 m830; + /* 0x831 */ u8 m831; /* 0x832 */ u8 m832; - /* 0x833 */ u8 m833[0x836 - 0x833]; + /* 0x833 */ u8 mFace; + /* 0x834 */ u8 m834; + /* 0x835 */ u8 m835; /* 0x836 */ u8 m836; - /* 0x837 */ u8 m837[0x838 - 0x837]; - /* 0x838 */ u8 m838; - /* 0x839 */ u8 m839[0x83C - 0x839]; + /* 0x837 */ u8 mFlags; /* Just a guess */ + /* 0x838 */ s8 m838; + /* 0x839 */ s8 mAction; + /* 0x83A */ u8 field_83A[0x83C - 0x83A]; +}; + +/* Inferred from debug map */ +class daAuction_HIO_c : public JORReflexible { +public: + daAuction_HIO_c() {} + +public: + /* Place member variables here */ +}; + +/* Inferred from debug map */ +class daAuction_Npc_HIO_c { +public: + daAuction_Npc_HIO_c() {} + +public: + /* Place member variables here */ }; #endif /* D_A_AUCTION_H */ diff --git a/include/d/actor/d_a_npc_auction.h b/include/d/actor/d_a_npc_auction.h index 2da81e73e..e8edbf32c 100644 --- a/include/d/actor/d_a_npc_auction.h +++ b/include/d/actor/d_a_npc_auction.h @@ -2,12 +2,13 @@ #define D_A_NPC_AUCTION_H #include "f_op/f_op_actor.h" +#include "d/d_npc.h" struct sAnmDat { }; -class daNpcAuction_c : public fopAc_ac_c { +class daNpcAuction_c : public fopNpc_npc_c { public: daNpcAuction_c(); @@ -17,7 +18,7 @@ public: inline BOOL _execute(); void getMdlNo() {} void getPhaseP() {} - void getPiconOfsY() {} + f32 getPiconOfsY() { return mPiconOfsY; } void setAction(void (daNpcAuction_c::*)()) {} void setBmtNo(int) {} void setBtpNo(int) {} @@ -38,8 +39,8 @@ public: void eventMesSet(); void XyCheckCB(int); void XyEventCB(int); - void next_msgStatus(unsigned long*); - void getMsg(); + u16 next_msgStatus(u32*); + u32 getMsg(); void setAnmFromMsgTag(); void getPrmNpcNo(); void setMtx(); @@ -55,19 +56,19 @@ public: void clrEmitter(); public: - /* 0x290 */ u8 m290[0x6B0 - 0x290]; - /* 0x6B0 */ u8 m6B0; - /* 0x6B1 */ u8 m6B1[0x73C - 0x6B1]; + /* 0x6C4 */ u8 m6C4[0x724 - 0x6C4]; + /* 0x724 */ f32 mPiconOfsY; + /* 0x728 */ u8 m728[0x73B - 0x728]; + /* 0x73B */ u8 m73B; /* 0x73C */ u8 m73C; /* 0x73D */ u8 m73D; - /* 0x73E */ u8 m73E; - /* 0x73F */ u8 m73F[0x740 - 0x73F]; - /* 0x740 */ u8 m740; - /* 0x741 */ u8 m741[0x743 - 0x741]; - /* 0x743 */ u8 m743; - /* 0x744 */ u8 m744[0x745 - 0x744]; - /* 0x745 */ u8 m745; - /* 0x746 */ u8 m746[0x74C - 0x746]; + /* 0x73E */ u8 m73E[0x73F - 0x73E]; + /* 0x73F */ u8 m73F; + /* 0x740 */ u8 m740[0x742 - 0x740]; + /* 0x742 */ u8 m742; + /* 0x743 */ u8 m743[0x744 - 0x743]; + /* 0x744 */ u8 m744; + /* 0x745 */ u8 field_745[0x74B - 0x745]; }; #endif /* D_A_NPC_AUCTION_H */ diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index f3e5d3b5d..0e4ec97cf 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -374,14 +374,17 @@ public: cXyz getRopePos() const { return mRopePos; } void getYPos() const {} - void changeDemoMode(u32) {} + void changeDemoMode(u32 mode) { mDemo.setDemoMode(mode); } void changeDemoMoveAngle(s16 angle) { mDemo.setMoveAngle(angle); } - void changeDemoParam0(int) {} + void changeDemoParam0(int param0) { mDemo.setParam0(param0); } void changeOriginalDemo() { mDemo.setOriginalDemoType(); mDemo.setParam0(0); } - void cancelOriginalDemo() {} + void cancelOriginalDemo() { + mDemo.setSystemDemoType(); + mDemo.setDemoMode(1); + } void onNoResetFlg0(daPy_FLG0 flag) { mNoResetFlg0 |= flag; } void offNoResetFlg0(daPy_FLG0 flag) { mNoResetFlg0 &= ~flag; } diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 2bb4943de..532af9f4a 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -282,6 +282,9 @@ public: int getMessageRupee() { return mMessageRupee; } + void setAuctionRupee(s16 count) { mAuctionRupee = count; } + void setAuctionGauge(s16 gauge) { mAuctionGauge = gauge; } + int getItemRupeeCount() { return mItemRupeeCount; } void setItemRupeeCount(s32 count) { mItemRupeeCount += count; } void setMessageCountNumber(s16 num) { mMsgCountNumber = num; } @@ -354,6 +357,9 @@ public: s16 getItemArrowNumCount() { return mItemArrowNumCount; } void setItemArrowNumCount(s16 num) { mItemArrowNumCount += num; } + void setNpcNameMessageID(u32 id) { mNpcNameMessageID = id; } + void setItemNameMessageID(u32 id) { mItemNameMessageID = id; } + void setItemKeyNumCount(s16 num) { mItemKeyNumCount += num; } void setItemBeastNumCount(int i_idx, s16 num) { mItemBeastNumCounts[i_idx] += num; } @@ -580,8 +586,8 @@ public: /* 0x48C0 */ int mItemRupeeCount; /* 0x48C4 */ int mAirMeter; /* 0x48C8 */ int field_0x48c8; - /* 0x48CC */ int mNpcNameMessageID; - /* 0x48D0 */ int mItemNameMessageID; + /* 0x48CC */ u32 mNpcNameMessageID; + /* 0x48D0 */ u32 mItemNameMessageID; /* 0x48D4 */ s16 mItemKeyNumCount; /* 0x48D6 */ s16 mItemMaxLifeCount; /* 0x48D8 */ s16 mItemMagicCount; @@ -597,8 +603,8 @@ public: /* 0x4918 */ u16 mMsgCountNumber; /* 0x491A */ s16 mMsgSetNumber; /* 0x491C */ s16 mMessageRupee; - /* 0x491E */ s16 field_0x491e; - /* 0x4920 */ s16 field_0x4920; + /* 0x491E */ s16 mAuctionRupee; + /* 0x4920 */ s16 mAuctionGauge; /* 0x4922 */ s16 field_0x4922; /* 0x4924 */ s16 mCurrHP; /* 0x4926 */ s16 mRupyCountDisplay; @@ -763,6 +769,14 @@ inline int dComIfGp_getMessageRupee() { return g_dComIfG_gameInfo.play.getMessageRupee(); } +inline void dComIfGp_setAuctionRupee(s16 count) { + g_dComIfG_gameInfo.play.setAuctionRupee(count); +} + +inline void dComIfGp_setAuctionGauge(s16 gauge) { + g_dComIfG_gameInfo.play.setAuctionGauge(gauge); +} + inline void dComIfGs_setRupee(u16 rupee) { g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusA().setRupee(rupee); } @@ -2187,6 +2201,14 @@ inline void dComIfGp_setItemMaxLifeCount(s16 num) { g_dComIfG_gameInfo.play.setItemMaxLifeCount(num); } +inline void dComIfGp_setNpcNameMessageID(u32 id) { + g_dComIfG_gameInfo.play.setNpcNameMessageID(id); +} + +inline void dComIfGp_setItemNameMessageID(u32 id) { + g_dComIfG_gameInfo.play.setItemNameMessageID(id); +} + inline void dComIfGp_setItemKeyNumCount(s16 num) { g_dComIfG_gameInfo.play.setItemKeyNumCount(num); } diff --git a/src/d/actor/d_a_auction.cpp b/src/d/actor/d_a_auction.cpp index 048b0a7be..451a4f9ac 100644 --- a/src/d/actor/d_a_auction.cpp +++ b/src/d/actor/d_a_auction.cpp @@ -4,276 +4,1627 @@ // #include "d/actor/d_a_auction.h" +#include "d/actor/d_a_npc_auction.h" +#include "d/actor/d_a_player.h" +#include "d/actor/d_a_player_main.h" +#include "d/d_camera.h" #include "d/d_procname.h" +#include "d/res/res_auction.h" +#include "m_Do/m_Do_controller_pad.h" + +struct NpcDatStruct { + /* 0x00 */ f32 field_0x00; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ s16 mBidIncMin; // Minimum bid increment + /* 0x0A */ s16 mBidIncMax; // Maximum bid increment + /* 0x0C */ s16 mSpendingLimit; +}; + +struct NpcMsgDatStruct { + /* 0x00 */ s16 field_0x00; + /* 0x02 */ s16 field_0x02; + /* 0x04 */ s16 field_0x04; + /* 0x06 */ s16 field_0x06; + /* 0x08 */ s16 field_0x08; +}; + +struct NpcCameraDatStruct { + /* 0x00 */ f32 field_0x00; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ s16 field_0x08; + /* 0x0A */ s16 field_0x0A; +}; + +static u8 dummy_bss[0x4C]; + +static cXyz l_camera_pos[3][2] = { + cXyz(-265.0f, 48.0f, -631.0f), + cXyz(332.0f, 232.0f, 286.0f), + + cXyz(-50.0f, 202.0f, 137.0f), + cXyz(-87.0f, 239.0f, 330.0f), + + cXyz(-216.0f, 205.0f, 5.0f), + cXyz(-379.0f, 238.0f, 115.0f), +}; + +#ifdef DEBUG +static daAuction_HIO_c l_HIO; +#endif + +// Needed for the .data section to match. +static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; +static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; +static u8 dummy3[4] = {0x02, 0x00, 0x02, 0x01}; +static f64 dummy4[2] = {3.0f, 0.5f}; + + +static daAuction_c::ItemData l_item_dat[] = { + {dItem_JOY_PENDANT_e, 0x1D10, 40, 0x0F01}, + {COLLECT_MAP_27, 0x1D11, 5, 0x1080}, + {COLLECT_MAP_18, 0x1D12, 60, 0x1040}, + {KAKERA_HEART, 0x1D13, 80, 0x1020}, +}; + +static daAuction_c::ItemData l_item_dat2[] = { + {POSTMAN_STATUE, 0x1D14, 30, 0x1008}, + {PRESIDENT_STATUE, 0x1D15, 40, 0x1004}, +}; + +static s16 l_item_dat22[] = {0x002A, 0x00F9}; + +static NpcDatStruct l_npc_dat[7] = { + {2.0f, 2.1f, 0x0, 0x0, 1000}, + {0.3f, 0.5f, 0x4, 0x6, 450 }, + {0.3f, 0.6f, 0x3, 0x7, 500 }, + {0.4f, 0.7f, 0x2, 0x4, 250 }, + {0.5f, 1.0f, 0x2, 0x3, 990 }, + {0.4f, 0.5f, 0x3, 0x4, 990 }, + {0.7f, 1.2f, 0x2, 0x2, 150 }, +}; + +static NpcMsgDatStruct l_npc_msg_dat[12] = { + {0x33AC, 0x1D3A, 0x1D3B, 0x1D3C, 0x33B6}, + {0x33AD, 0x1D3D, 0x1D3E, 0x1D3F, 0x33B7}, + {0x33AE, 0x1D40, 0x1D41, 0x1D42, 0x33B8}, + {0x33AF, 0x1D43, 0x1D44, 0x1D45, 0x33B9}, + {0x33B0, 0x1D46, 0x1D47, 0x1D48, 0x33BA}, + {0x33B1, 0x1D49, 0x1D4A, 0x1D4B, 0x33BB}, + + {0x33B2, 0x339D, 0x339E, 0x339F, 0x33BC}, + {0x33B3, 0x33A0, 0x33A1, 0x33A2, 0x33BD}, + {0x33B4, 0x33A3, 0x33A4, 0x33A5, 0x33BE}, + {0x33B5, 0x33A6, 0x33A7, 0x33A8, 0x33BF}, + + {0x1CE9, 0x0000, 0x0000, 0x0000, 0x0000}, + {0x1CE9, 0x0000, 0x0000, 0x0000, 0x0000}, +}; + +static NpcCameraDatStruct l_npc_camera_dat[7] = { + { 150.0f, 70.0f, -500 }, + { 200.0f, 100.0f, 0 }, + { 200.0f, 100.0f, 0 }, + { 200.0f, 100.0f, 0 }, + { 200.0f, 100.0f, 0 }, + { 200.0f, 100.0f, 0 }, + { 200.0f, 150.0f, 0 }, +}; + +static f32 l_npc_emitter_ofsy[8] = { + 120.0f, + 180.0f, + 180.0f, + 180.0f, + 180.0f, + 180.0f, + 210.0f, + 180.0f, +}; + +static f32 l_npc_camera_ofsy[8] = { + 150.0f, + 210.0f, + 210.0f, + 210.0f, + 210.0f, + 210.0f, + 240.0f, + 210.0f, +}; + +static s16 l_rest_msg_time1[4] = { + 30000, + 10000, + 5000, + -1000, +}; + +static s16 l_rest_msg_time2[4] = { + 15000, + 10000, + 5000, + -1000, +}; + +static u32 l_rest_msg_no[3] = { + 0x1D01, + 0x1D02, + 0x1D03, +}; + +static u32 l_rest_se_no[3] = { + JA_SE_AUC_LAST_SPURT, + JA_SE_AUC_FEW_TIME, + JA_SE_AUC_5_SEC, +}; + +static f32 l_after_bet_rate[4] = {2.0f, 1.5f, 1.2f, 1.1f}; + +static s16 l_after_bet_chk[4] = { + 0x0014, + 0x0014, + 0x0028, + 0x0028, +}; + +static u32 l_after_bet_msg_no[4] = { + 0x1D23, + 0x1D22, + 0x1D21, + 0x1D20, +}; + +static s16 l_after_bet_wait[4][2] = { + {8, 10}, + {7, 10}, + {6, 9}, + {5, 8}, +}; + +static daPy_py_c::daPy_FACE l_link_face[8] = { + daPy_py_c::daPyFace_TMABAA, + daPy_py_c::daPyFace_TMABAC, + daPy_py_c::daPyFace_TMABACB, + daPy_py_c::daPyFace_TMABAE, + daPy_py_c::daPyFace_TMABAF, + daPy_py_c::daPyFace_TMABAG, + daPy_py_c::daPyFace_TMABAH, + daPy_py_c::daPyFace_TMABAJ_TEYORIME, +}; + +static daAuction_c::ProcFunc_t moveProc[] = { + daAuction_c::executeWait, + daAuction_c::executeNormal, + daAuction_c::executeStart, +}; + +extern void dAuction_screen_delete(); +extern void dAuction_screen_slotShow(); +extern void dAuction_screen_slotHide(); +extern void dAuction_screen_gaugeHide(); +extern void dAuction_screen_gaugeShow(); +extern void dAuction_screen_gaugeUp(); +extern void dAuction_screen_gaugeDown(); +extern void dAuction_screen_talkStart(); +extern void dAuction_screen_talkEnd(); +extern uint dAuction_screen_create(); /* 000000EC-000002FC .text __ct__11daAuction_cFv */ daAuction_c::daAuction_c() { - /* Nonmatching */ + for (int i = 0; i < 8; i++) { + m738[i] = -1; + m80C[i] = i; + mAucMdlNo[i] = 0xFF; + } + + for (int i = 0; i < 100; i++) { + int rnd1 = getRand(6); + int rnd2 = getRand(6); + + u8 tmp = m80C[rnd1 + 1]; + m80C[rnd1 + 1] = m80C[rnd2 + 1]; + m80C[rnd2 + 1] = tmp; + } + + mMoveState = 0; + m820 = 1; + m821 = 0; + m7EC = 0; + m7F0 = 0; + m81C = 0xFF; + m81D = 0xFF; + mpEmitter = NULL; + m836 = 0; + + eyePos = current.pos; + m832 = 0; } /* 00000644-00000664 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->createHeap(); } /* 00000664-000006F4 .text _create__11daAuction_cFv */ s32 daAuction_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daAuction_c); + + s32 phase_state = dComIfG_resLoad(&mPhs, "Pspl"); + + if (phase_state == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x2400)) { + return cPhs_ERROR_e; + } + + return createInit(); + } + + return phase_state; } /* 000006F4-00000770 .text createHeap__11daAuction_cFv */ -void daAuction_c::createHeap() { - /* Nonmatching */ +BOOL daAuction_c::createHeap() { + J3DModelData* modelData = static_cast(dComIfG_getObjectIDRes("Pspl", 0)); + + if (modelData == NULL) { + return FALSE; + } + + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + + if (mpModel == NULL) { + return FALSE; + } + + return TRUE; } /* 00000770-000008C4 .text createInit__11daAuction_cFv */ -void daAuction_c::createInit() { - /* Nonmatching */ +s32 daAuction_c::createInit() { + mEvtStartIdx = dComIfGp_evmng_getEventIdx("AUCTION_START"); + mEvtGetItemIdx = dComIfGp_evmng_getEventIdx("AUCTION_GET_ITEM"); + mEvtNoItemIdx = dComIfGp_evmng_getEventIdx("AUCTION_NO_ITEM"); + mEvtStart2Idx = dComIfGp_evmng_getEventIdx("AUCTION_START2"); + mEvtEnd2Idx = dComIfGp_evmng_getEventIdx("AUCTION_END2"); + + mNpcEvtInfo.setActorInfo("Auction", this); + m824 = 0; + m826 = 0xFF; + dComIfGp_setNpcNameMessageID(l_npc_msg_dat[getAucMdlNo(m824)].field_0x00); + + mCurrAuctionItemIndex = 0; + + s16 nameMsgID = l_item_dat[mCurrAuctionItemIndex].mNameMsgID; + mCurrBid = l_item_dat[mCurrAuctionItemIndex].mStartingBid; + + dComIfGp_setItemNameMessageID(nameMsgID); + dComIfGp_setMessageCountNumber(mCurrBid); + + setMtx(); + + return cPhs_COMPLEATE_e; } /* 000008C4-0000092C .text _delete__11daAuction_cFv */ BOOL daAuction_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, "Pspl"); + + if (heap != NULL && mpEmitter != NULL) { + mpEmitter->becomeInvalidEmitter(); + } + + return TRUE; } /* 0000092C-00000998 .text _draw__11daAuction_cFv */ BOOL daAuction_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG2, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + + if (mFlags & 4) { + mDoExt_modelUpdateDL(mpModel); + } + + return TRUE; } /* 00000998-00000B10 .text _execute__11daAuction_cFv */ BOOL daAuction_c::_execute() { - /* Nonmatching */ + checkOrder(); + + if (!dComIfGp_event_runCheck() || eventInfo.checkCommandTalk()) { + (this->*moveProc[mMoveState])(); + } else { + eventMove(); + } + + eventOrder(); + + if (mpEmitter != NULL) { + if (m836 & 1) { // Increase alpha + if (m80A != 0) { + m80A -= 1; + } else { + mAlpha += 4.0f; + + if (mAlpha > 255.0f) { + mAlpha = 255.0f; + m836 &= ~1; + } + + mpEmitter->setGlobalAlpha(mAlpha); + } + } else if (m836 & 2) { // Decrease alpha + mAlpha -= 4.0f; + + if (mAlpha < 0.0f) { + mpEmitter->becomeInvalidEmitter(); + mpEmitter = NULL; + } else { + mpEmitter->setGlobalAlpha(mAlpha); + } + } + } + + setMtx(); + return TRUE; } /* 00000B10-00000B44 .text executeWait__11daAuction_cFv */ void daAuction_c::executeWait() { - /* Nonmatching */ + for (int i = 0; i < 8; i++) { + if (m738[i] == -1) { + return; + } + } + + mMoveState = 1; } /* 00000B44-00000B48 .text executeNormal__11daAuction_cFv */ -void daAuction_c::executeNormal() { - /* Nonmatching */ -} +void daAuction_c::executeNormal() {} /* 00000B48-00000B4C .text executeStart__11daAuction_cFv */ -void daAuction_c::executeStart() { - /* Nonmatching */ -} +void daAuction_c::executeStart() {} /* 00000B4C-00000C68 .text checkOrder__11daAuction_cFv */ void daAuction_c::checkOrder() { - /* Nonmatching */ + if (eventInfo.checkCommandDemoAccrpt()) { + if (dComIfGp_evmng_startCheck(mEvtStartIdx) && m838 == 3) { + m838 = 0; + } else if (dComIfGp_evmng_startCheck(mEvtGetItemIdx) && m838 == 4) { + m838 = 0; + } else if (dComIfGp_evmng_startCheck(mEvtNoItemIdx) && m838 == 5) { + m838 = 0; + } + + if (dComIfGp_evmng_startCheck(mEvtStart2Idx) && m838 == 6) { + m838 = 0; + } else if (dComIfGp_evmng_startCheck(mEvtEnd2Idx) && m838 == 7) { + m838 = 0; + } + } } /* 00000C68-00000EF8 .text eventOrder__11daAuction_cFv */ void daAuction_c::eventOrder() { - /* Nonmatching */ + if (m821 == 1) { + mMoveState = 2; + m838 = 3; + m822 = m821; + m821 = 0; + } else if (m821 == 2) { + mMoveState = 2; + m838 = 6; + m822 = m821; + m821 = 0; + } + + if (m838 == 1 || m838 == 2) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + if (m838 == 1) { + fopAcM_orderSpeakEvent(this); + } + } else if (m838 == 3) { + if (dComIfGs_isEventBit(0x4008)) { + mCurrAuctionItemIndex = dComIfGs_getEventReg(0xCD03); + mCurrBid += 10; + } else { + mCurrAuctionItemIndex = getItemNo(); + } + + dComIfGp_setItemNameMessageID(l_item_dat[mCurrAuctionItemIndex].mNameMsgID); + mCurrBid = l_item_dat[mCurrAuctionItemIndex].mStartingBid; + dComIfGp_setMessageCountNumber(mCurrBid); + + fopAcM_orderChangeEventId(dComIfGp_getPlayer(0), this, mEvtStartIdx, 0, 0xFF7F); + dComIfGp_startMiniGame(5); + } else if (m838 == 4) { + fopAcM_orderOtherEventId(this, mEvtGetItemIdx, 0xFF, 0xFF7F); + } else if (m838 == 5) { + fopAcM_orderOtherEventId(this, mEvtNoItemIdx, 0xFF, 0xFF7F); + } else if (m838 == 6) { + mCurrAuctionItemIndex &= 1; + + s16 nameMsgID = l_item_dat2[mCurrAuctionItemIndex].mNameMsgID; + mCurrBid = l_item_dat2[mCurrAuctionItemIndex].mStartingBid; + + dComIfGp_setItemNameMessageID(nameMsgID); + dComIfGp_setMessageCountNumber(mCurrBid); + fopAcM_orderChangeEventId(dComIfGp_getPlayer(0), this, mEvtStart2Idx, 0, 0xFF7F); + dComIfGp_startMiniGame(5); + } else if (m838 == 7) { + fopAcM_orderOtherEventId(this, mEvtEnd2Idx, 0xFF, 0xFF7F); + } } /* 00000EF8-0000104C .text eventMove__11daAuction_cFv */ void daAuction_c::eventMove() { - /* Nonmatching */ + if (dComIfGp_evmng_endCheck(mEvtStartIdx)) { + dComIfGp_event_reset(); + + if (m824 != 0) { + m838 = 5; + } else { + m838 = 4; + } + } else if (dComIfGp_evmng_endCheck(mEvtGetItemIdx) || dComIfGp_evmng_endCheck(mEvtNoItemIdx) || dComIfGp_evmng_endCheck(mEvtEnd2Idx)) { + dComIfGp_event_reset(); + dComIfGp_endMiniGame(5); + fopAcM_delete((fopAc_ac_c*)mpTimer); + dAuction_screen_delete(); + } else if (dComIfGp_evmng_endCheck(mEvtStart2Idx)) { + dComIfGp_event_reset(); + m838 = 7; + } else { + bool attn = mNpcEvtInfo.getAttnFlag(); + if (mNpcEvtInfo.cutProc()) { + if (!mNpcEvtInfo.getAttnFlag()) { + mNpcEvtInfo.setAttnFlag(attn); + } + } else { + privateCut(); + } + } } /* 0000104C-00001300 .text privateCut__11daAuction_cFv */ void daAuction_c::privateCut() { - /* Nonmatching */ + static char* cut_name_tbl[] = { + "MES_SET", + "MES_END", + "START", + "MAIN", + "GET_ITEM", + "CAMERA_OFF", + "GET_ITEM_NPC", + "GET_ITEM_MES", + "CAMERA_OFF_NPC", + "END", + "CAMERA_TEST", + }; + + int staffIdx = dComIfGp_evmng_getMyStaffId("Auction"); + + if (staffIdx == -1) { + return; + } + + mAction = dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), TRUE, 0); + + if (mAction == -1) { + dComIfGp_evmng_cutEnd(staffIdx); + return; + } + + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch (mAction) { + case 0: + eventTalkInit(staffIdx); + break; + case 2: + eventStartInit(); + break; + case 3: + eventMainInit(); + break; + case 4: + eventGetItemInit(); + break; + case 5: + eventCameraOffInit(); + break; + case 6: + eventGetItemNpcInit(staffIdx); + break; + case 7: + eventGetItemMesInit(); + break; + case 9: + eventEndInit(); + break; + case 10: + eventCameraTestInit(); + break; + } + } + + bool evtRes; + switch (mAction) { + case 0: + evtRes = eventMesSet(); + break; + case 1: + evtRes = eventMesEnd(); + break; + case 2: + evtRes = eventStart(); + break; + case 3: + evtRes = eventMain(); + break; + case 4: + evtRes = eventGetItem(); + break; + case 7: + evtRes = &eventMesSet != NULL; + break; + case 8: + evtRes = eventCameraOffNpc(); + break; + case 9: + evtRes = eventEnd(); + break; + case 10: + evtRes = eventCameraTest(); + break; + default: + evtRes = true; + } + + if (evtRes) { + dComIfGp_evmng_cutEnd(staffIdx); + } + + dCamera_c* pCam = dCam_getBody(); + + // This could probably be simplified + if (m835 & 1) { + pCam->Stop(); + m835 &= ~1; + m835 |= 4; + } + + if (m835 & 2) { + pCam->Start(); + m835 &= ~0xE; + } + + if (m835 & 4 && m835 & 8) { + pCam->Set(m78C, m798); + } + } /* 00001300-000013C0 .text eventTalkInit__11daAuction_cFi */ -void daAuction_c::eventTalkInit(int) { - /* Nonmatching */ +void daAuction_c::eventTalkInit(int staffIdx) { + s32* pMsg = (s32*)dComIfGp_evmng_getMyIntegerP(staffIdx, "MsgNo"); + + if (pMsg != NULL) { + switch (*pMsg) { + case 0x1CF4: + mDoAud_seStart(JA_SE_AUC_ITEM_SHOW); + default: + setMessage(*pMsg); + } + } else { + setMessage(0); + } } /* 000013C0-00001400 .text eventMesSet__11daAuction_cFv */ -void daAuction_c::eventMesSet() { - /* Nonmatching */ +bool daAuction_c::eventMesSet() { + talk(0); + + return mCurrMsgBsPcId != fpcM_ERROR_PROCESS_ID_e; } /* 00001400-00001434 .text eventMesEnd__11daAuction_cFv */ -void daAuction_c::eventMesEnd() { - /* Nonmatching */ +bool daAuction_c::eventMesEnd() { + return talk(0) == fopMsgStts_BOX_CLOSED_e; } /* 00001434-00001634 .text eventStartInit__11daAuction_cFv */ void daAuction_c::eventStartInit() { - /* Nonmatching */ + m820 = ~1; + + if (m822 == 2) { + mTimerID = dTimer_createTimer(4, 30, 1, 0, 221.0f, 439.0f, 32.0f, 419.0f); + } else { + mTimerID = dTimer_createTimer(4, 60, 1, 0, 221.0f, 439.0f, 32.0f, 419.0f); + } + + JUT_ASSERT(0x861, mTimerID != fpcM_ERROR_PROCESS_ID_e); + + mGaugeID = dAuction_screen_create(); + + JUT_ASSERT(0x863, mGaugeID != fpcM_ERROR_PROCESS_ID_e); + + mpTimer = NULL; + m830 = 1; + + dComIfGp_setMiniGameRupee(0); + dComIfGp_setAuctionRupee(0); + + dAuction_screen_slotHide(); + dAuction_screen_gaugeHide(); + dAuction_screen_talkEnd(); + + mCurrAuctionItemPID = fopAcM_create(PROC_ShopItem, l_item_dat[mCurrAuctionItemIndex].mItemID, ¤t.pos); + dKy_custom_colset(0, 4, 1.0f); + + mLight.mPos.x = 0.0f; + mLight.mPos.y = 50.0f; + mLight.mPos.z = -200.0f; + mLight.mColor.r = 0x96; + mLight.mColor.g = 0x64; + mLight.mColor.b = 0x3C; + mLight.mPower = 450.0f; + mLight.mFluctuation = 0.0f; + + dKy_efplight_set(&mLight); + mFlags |= 4; + + dAuction_screen_talkEnd(); } /* 00001634-000016AC .text eventStart__11daAuction_cFv */ -void daAuction_c::eventStart() { - /* Nonmatching */ +bool daAuction_c::eventStart() { + if (mpTimer == NULL) { + mpTimer = (dTimer_c*)fopMsgM_SearchByID(mTimerID); + + if (mpTimer != NULL) { + mpTimer->mpScrnDraw->setShowType(0); + } + } + + dComIfGp_setDoStatusForce(0x3E); + dComIfGp_setAStatusForce(0x3E); + + return mpTimer != NULL; } /* 000016AC-0000188C .text eventMainInit__11daAuction_cFv */ void daAuction_c::eventMainInit() { - /* Nonmatching */ + m804 = 3600; + + for (int i = 0; i < 7; i++) { + m7C4[i] = 0.0f; + } + + if (m822 == 2) { + m81F = 1; + } else { + m81F = 0; + } + + m7E0 = 0.0f; + m7E4 = 1.0f; + m82A = 0; + + for (int i = 0; i < 3; i++) { + s16 restMsgTime; + if (m822 == 2) { + restMsgTime = l_rest_msg_time2[i]; + } else { + restMsgTime = l_rest_msg_time1[i]; + } + + if (60000 > restMsgTime) break; + + m82A += 1; + } + + m82B = 0; + m835 = 0; + m834 = 0; + m82E = 0; + + dComIfG_TimerStart(0, 4); + + if (m822 == 1) { + dAuction_screen_gaugeShow(); + } + + m836 |= 1; + + daPy_py_c* pLink = (daPy_py_c*)dComIfGp_getLinkPlayer(); + + pLink->changeOriginalDemo(); + mCurLinkAnm = 1; + dComIfGp_event_setTalkPartner(this); + m82F = 0; + + m78C = l_camera_pos[m82F][0]; + m798 = l_camera_pos[m82F][1]; + + dAuction_screen_talkEnd(); } +static daAuction_c::ProcFunc_t eventProc[] = { + daAuction_c::eventMainKai, + daAuction_c::eventMainUri, + daAuction_c::eventMainMsgSet, + daAuction_c::eventMainMsgEnd, + daAuction_c::eventMainMsgBikonC, + daAuction_c::eventMainMsgBikonW, +}; + /* 0000188C-00001A98 .text eventMain__11daAuction_cFv */ -void daAuction_c::eventMain() { - /* Nonmatching */ +bool daAuction_c::eventMain() { + daPy_lk_c* pLink = (daPy_lk_c*)dComIfGp_getLinkPlayer(); + + if (pLink->getBaseAnimeFrameRate() == 0.0f && mCurLinkAnm != 1 && mCurLinkAnm != 0x1D && mCurLinkAnm != 0x25) { + setLinkAnm(1); + } + + mFlags &= 4; + + if (dComIfG_getTimerMode() == 4) { + dComIfG_TimerStop(2); + } + + (this->*eventProc[m81F])(); + + if (m832 != 0) { + pLink->setFace((daPy_py_c::daPy_FACE)mFace); + } + + if (m822 == 1) { + dComIfGp_setAuctionGauge((s16)m7C4[0]); + } + + if (m81F <= 1 && m82B != 0) { + dComIfGp_setNpcNameMessageID(l_npc_msg_dat[getAucMdlNo(m824)].field_0x00); + + if (dComIfG_getTimerMode() == 4) { + dComIfG_TimerStop(2); + } + + dAuction_screen_slotHide(); + dAuction_screen_gaugeHide(); + + m82B = 1; + m834 = 0; + m836 |= 2; + + // Might be incorrect + pLink->cancelOriginalDemo(); + + if (m835 & 4) { + m835 |= 2; + m835 &= ~1; + } + + mDoAud_seStart(JA_SE_AUC_END); + + return true; + } + + return false; } /* 00001A98-000022A8 .text eventMainKai__11daAuction_cFv */ void daAuction_c::eventMainKai() { - /* Nonmatching */ + if (dComIfG_getTimerMode() == 4) { + dComIfG_TimerReStart(2); + } + + if (dComIfG_getTimerRestTimeMs() <= 0) { + m82B = 1; + } else { + if (g_mDoCPd_cpadInfo[0].mButtonTrig.b) { + setMessage2(0x1CFC); + mDoAud_seStart(JA_SE_AUC_QUIT); + } else { + // I think this uses std::abs in kiosk build? + m7E0 = m7E0 + m7E4; + if (m7E0 >= 1.0f) { + m7E0 = 1.0f; + m7E4 = -1.0f; + } else if (m7E0 <= -1.0f) { + m7E0 = -1.0f; + m7E4 = 1.0f; + } + + if (m7C4[0] < 100.0f) { + m7C4[0] += 0.02f; + } + + if (g_mDoCPd_cpadInfo[0].mButtonTrig.a) { + m7C4[0] += l_npc_dat[0].field_0x00 + cM_rndF(l_npc_dat[0].field_0x04 - l_npc_dat[0].field_0x00); + + mDoAud_seStart(JA_SE_AUC_BID_GAUGE, NULL, m7C4[0]); + } + + if (m7C4[0] > 100.0f) { + m7C4[0] = 100.0f; + } + + if (m806 != 0) { + m806 -= 1; + + if (m806 == 0) { + if (m834 & 2) { + m82F = getRand(3); + m78C = l_camera_pos[m82F][0]; + m798 = l_camera_pos[m82F][1]; + } + + m834 &= ~6; + } + } else { + for (int i = 1; i < 7; i++) { + m7C4[i] += cM_rndF(l_npc_dat[i].field_0x04 - l_npc_dat[i].field_0x00) + l_npc_dat[i].field_0x00; + } + } + + int idx; + int end = 7; + + if ((m834 & 2)) { + end = 1; + } + + for (idx = 0; idx < end; idx++) { + if (m7C4[idx] >= 100.0f && mCurrBid < l_npc_dat[idx].mSpendingLimit) { + break; + } + } + + if (idx < end) { + m828 = idx; + + s16 prevItemNameMsgNo = mCurrBid; + + if (idx != 0) { + f32 f = 1.0f; + if (dComIfG_getTimerRestTimeMs() < 30000) { + f = 2.0f; + } else if (dComIfG_getTimerRestTimeMs() < 60000) { + f = 1.5f; + } + + mCurrBid += (s16)(f * (s16)(l_npc_dat[idx].mBidIncMin + cM_rndF(l_npc_dat[idx].mBidIncMax - l_npc_dat[idx].mBidIncMin))); + m800 = mCurrBid; + + end = 0x1CF9; + + m82C = 4; + m7C4[idx] = 0.0f; + + nextBet(); + } else { + m800 = mCurrBid + 1; + dComIfGp_setMessageSetNumber(mCurrBid + 1); + end = 0x1CFA; + setLinkAnm(0x48); + mpTimer->mpScrnDraw->setShowType(1); + + dAuction_screen_gaugeUp(); + dComIfGp_getVibration().StartShock(5, 1, cXyz(0.0f, 1.0f, 0.0f)); + dComIfGp_getVibration().StartShock(4, 0x3E, cXyz(0.0f, 1.0f, 0.0f)); + } + + m806 = (cM_rndF(0.0f) + 1.0f) * 60.0f; + m7F0 = end; + m81F = 4; + + if (m830 != 0) { + m830 = 0; + } else if (m826 != 0xFF && idx != 0 && dComIfG_getTimerRestTimeMs() > l_rest_msg_time1[0] && getRand(3) == 0) { + u32 msgParam; + + if (mCurrBid <= 100) { + msgParam = 0x1CFD; + } else if (mCurrBid <= 150) { + msgParam = 0x1CFE; + } else if (mCurrBid <= 200) { + msgParam = 0x1CFF; + } else { + msgParam = 0x1D00; + } + + // onCameraOld might be used somewhere here? + dComIfGp_setMessageCountNumber(prevItemNameMsgNo); + dComIfGp_setNpcNameMessageID(l_npc_msg_dat[getAucMdlNo(m824)].field_0x00); + setMessage2(msgParam); + setCameraNpc(m824, 0); + if (m824 == 0 && mCurLinkAnm != 0x1D) { + setLinkAnm(0x14); + } + + m834 |= 0x20; + m829 = m827; + m830 = 1; + } + + if (m81F == 4) { + u8 tmp = m828; + m829 = tmp; + m827 = tmp; + dComIfGp_setMessageCountNumber(m800); + dComIfGp_setNpcNameMessageID(l_npc_msg_dat[getAucMdlNo(m827)].field_0x00); + } + + m835 |= 9; + m835 &= ~2; + } else if (dComIfG_getTimerRestTimeMs() < l_rest_msg_time1[m82A]) { + setMessage2(l_rest_msg_no[m82A]); + mDoAud_seStart(l_rest_se_no[m82A]); + m82A += 1; + } + } + if (m834 & 2) { + m834 |= 4; + m798.set(0.0f, 50.0f, -210.0f); + m78C.set(getNpcActorP(0)->current.pos); + + m78C.x += cM_ssin(m808) * 256.0f; + m78C.y += 100.0f; + m808 += 200; + mDoAud_seStart(JA_SE_CM_AUC_PARALYZED); + } + } + + dComIfGp_setDoStatusForce(0x25); + dComIfGp_setAStatusForce(0x27); } /* 000022A8-00002760 .text eventMainUri__11daAuction_cFv */ void daAuction_c::eventMainUri() { - /* Nonmatching */ + if (dComIfG_getTimerMode() == 4) { + dComIfG_TimerReStart(2); + } + + if (dComIfG_getTimerRestTimeMs() <= 0) { + m82B = 1; + } else if (m82E != 0 && g_mDoCPd_cpadInfo[0].mButtonTrig.a) { + setMessage2(0x1D1A); + } else { + if (m806 != 0) { + m806 -= 1; + } else { + for (int i = 1; i < 7; i++) { + m7C4[i] += 2.0f * (l_npc_dat[i].field_0x00 + cM_rndF(l_npc_dat[i].field_0x04 - l_npc_dat[i].field_0x00)); + } + } + + int idx; + for (idx = 1; idx < 7; idx++) { + if (m7C4[idx] >= 100.0f) { + m7C4[idx] = 0.0f; + if (mCurrBid < l_npc_dat[idx].mSpendingLimit) { + break; + } + } + } + + if (idx < 7) { + m828 = idx; + + if (idx != 0) { + float multiplier = 1.0f; + + if (dComIfG_getTimerRestTimeMs() < 30000) { + multiplier = 2.0f; + } else if (dComIfG_getTimerRestTimeMs() < 60000) { + multiplier = 1.5f; + } + + mCurrBid += (s16)(multiplier * (2 * (s16)(l_npc_dat[idx].mBidIncMin + cM_rndF(l_npc_dat[idx].mBidIncMax - l_npc_dat[idx].mBidIncMin)))); + m800 = mCurrBid; + m7F0 = 0x1CF9; + m82C = 4; + m82E = 1; + m806 = cM_rndF(1.0) * 60.0f; + m81F = 4; + + // onCameraOld might be used here + if (m830 != 0) { + m830 = 0; + } else if (dComIfG_getTimerRestTimeMs() > l_rest_msg_time1[0] && getRand(3) == 0) { + u32 msgParam; + + if (mCurrBid <= 100) { + msgParam = 0x1CFD; + } else if (mCurrBid <= 150) { + msgParam = 0x1CFE; + } else if (mCurrBid <= 200) { + msgParam = 0x1CFF; + } else { + msgParam = 0x1D00; + } + + dComIfGp_setNpcNameMessageID(l_npc_msg_dat[getAucMdlNo(m824)].field_0x00); + setMessage2(msgParam); + setCameraNpc(m824, 0); + + if (m824 == 0) { + setLinkAnm(0x14); + } + + m834 |= 0x20; + m829 = m827; + m830 = 1; + } + + if (m81F == 4) { + u8 m828_val = m828; + m829 = m828_val; + m827 = m828_val; + dComIfGp_setMessageCountNumber(m800); + dComIfGp_setNpcNameMessageID(l_npc_msg_dat[getAucMdlNo(m827)].field_0x00); + } + + m835 |= 9; + m835 &= ~2; + } + } else if (dComIfG_getTimerRestTimeMs() < l_rest_msg_time2[m82A]) { + setMessage2(l_rest_msg_no[m82A]); + mDoAud_seStart(l_rest_se_no[m82A]); + m82A += 1; + } + } + + if (m82E != 0) { + dComIfGp_setDoStatusForce(0x25); + } } /* 00002760-0000279C .text eventMainMsgSet__11daAuction_cFv */ void daAuction_c::eventMainMsgSet() { - /* Nonmatching */ + if (eventMesSet()) { + m81F = 3; + } } /* 0000279C-0000294C .text eventMainMsgEnd__11daAuction_cFv */ void daAuction_c::eventMainMsgEnd() { - /* Nonmatching */ + if (eventMesEnd()) { + if (mCurLinkAnm != 1 && mCurLinkAnm != 0x1D) { + setLinkAnm(1); + } + + if (m834 & 0x20) { + m81F = 4; + } else { + if (m822 == 2) { + m81F = 1; + } else { + m81F = 0; + } + + eyePos = current.pos; + m832 = 0; + } + + m7E0 = 0.0f; + + if ((m834 & 2) == 0) { + m82F = getRand(3); + m78C = l_camera_pos[m82F][0]; + m798 = l_camera_pos[m82F][1]; + } + + mpTimer->mpScrnDraw->setShowType(0); + dAuction_screen_gaugeDown(); + m834 &= ~0x29; + dAuction_screen_talkEnd(); + dAuction_screen_gaugeShow(); + + return; + } + + if (dComIfGp_checkMesgSendButton() && ((m7EC >= 0x1D3AU && m7EC <= 0x1D4BU) || (m7EC >= 0x339DU && m7EC <= 0x33A8U))) { + setCameraNpc(m825, 0); + m834 |= 8; + m829 = m825; + } } /* 0000294C-00002B90 .text eventMainMsgBikonC__11daAuction_cFv */ void daAuction_c::eventMainMsgBikonC() { - /* Nonmatching */ + u8 tmp = m828; + m829 = tmp; + m827 = tmp; + + dComIfGp_setMessageCountNumber(m800); + dComIfGp_setNpcNameMessageID(l_npc_msg_dat[getAucMdlNo(m827)].field_0x00); + + cXyz npcPos = getNpcActorP(m827)->current.pos; + npcPos.y += getPiconDispOfs(m827) + 30.0f; + + if (cLib_addCalcPos(&m78C, npcPos, 0.4f, 700.0f, 0.1f) == 0.0f) { + m81F = 5; + m7A8 = getNpcActorP(m827)->current.pos; + m7A8.y += getPiconDispOfs(m827); + + dComIfGp_particle_set(0x8153, &m7A8, NULL, NULL, 0xFF, NULL, fopAcM_GetRoomNo(this)); + mTimer = 0x1E; + + if (m827 == 0) { + mDoAud_seStart(JA_SE_AUC_BID_GAUGE_MAX); + } else { + mDoAud_seStart(JA_SE_CM_AUC_CALL_BID); + m832 = 1; + mFace = l_link_face[getRand(8)]; + } + + eyePos = getNpcActorP(m827)->eyePos; + } + + dComIfGp_setDoStatusForce(0); + dComIfGp_setAStatusForce(0x3E); } /* 00002B90-00002C1C .text eventMainMsgBikonW__11daAuction_cFv */ void daAuction_c::eventMainMsgBikonW() { - /* Nonmatching */ + if (mTimer != 0) { + mTimer -= 1; + } else { + setMessage2(m7F0); + setCameraNpc(m827, 0); + dAuction_screen_talkStart(); + + if (m827 != 0) { + m834 |= 1; + } + } + + dComIfGp_setDoStatusForce(0); + dComIfGp_setAStatusForce(0x3E); } /* 00002C1C-00002D4C .text eventGetItemInit__11daAuction_cFv */ void daAuction_c::eventGetItemInit() { - /* Nonmatching */ + if (m822 == 2) { + uint itemID = fopAcM_createItemForPresentDemo(¤t.pos, l_item_dat22[mCurrAuctionItemIndex] & 0xFF); + + if (itemID != fpcM_ERROR_PROCESS_ID_e) { + dComIfGp_event_setItemPartnerId(itemID); + } + + dComIfGs_onEventBit(l_item_dat2[mCurrAuctionItemIndex].mObtainedEventBit); + } else { + uint itemID = fopAcM_createItemForPresentDemo(¤t.pos, l_item_dat[mCurrAuctionItemIndex].mItemID & 0xFF); + + if (itemID != fpcM_ERROR_PROCESS_ID_e) { + dComIfGp_event_setItemPartnerId(itemID); + } + + dComIfGs_onEventBit(l_item_dat[mCurrAuctionItemIndex].mObtainedEventBit); + } + + setCameraNpc(0, 0); } /* 00002D4C-00002D54 .text eventGetItem__11daAuction_cFv */ -void daAuction_c::eventGetItem() { - /* Nonmatching */ +bool daAuction_c::eventGetItem() { + return true; } /* 00002D54-00002D70 .text eventCameraOffInit__11daAuction_cFv */ void daAuction_c::eventCameraOffInit() { - /* Nonmatching */ + offCamera(); } /* 00002D70-00002E00 .text eventGetItemNpcInit__11daAuction_cFi */ -void daAuction_c::eventGetItemNpcInit(int) { - /* Nonmatching */ +void daAuction_c::eventGetItemNpcInit(int staffIdx) { + setCameraNpc(m824, 0); + + u32* pTimerData = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer"); + + if (pTimerData != NULL) { + mTimer = *pTimerData; + } else { + mTimer = 0; + } + + m834 = 0x10; + m829 = m824; } /* 00002E00-00002E40 .text eventGetItemMesInit__11daAuction_cFv */ void daAuction_c::eventGetItemMesInit() { - /* Nonmatching */ + setMessage(l_npc_msg_dat[getAucMdlNo(m824)].field_0x08); } /* 00002E40-00002EA0 .text eventCameraOffNpc__11daAuction_cFv */ -void daAuction_c::eventCameraOffNpc() { - /* Nonmatching */ +bool daAuction_c::eventCameraOffNpc() { + if (eventMesEnd()) { + m834 = 0; + offCamera(); + return true; + } + + return false; } /* 00002EA0-00002EDC .text eventEndInit__11daAuction_cFv */ void daAuction_c::eventEndInit() { - /* Nonmatching */ + mBlend = 0.0f; + mFlags &= ~4; + + dKy_efplight_cut(&mLight); } /* 00002EDC-00002F60 .text eventEnd__11daAuction_cFv */ -void daAuction_c::eventEnd() { - /* Nonmatching */ +bool daAuction_c::eventEnd() { + mBlend += 0.05f; + if (mBlend > 1.0f) { + mBlend = 1.0f; + } + + dKy_custom_colset(4, 0, mBlend); + + // "return mBlend == 1.0f" doesn't match for some reason + return mBlend == 1.0f ? true : false; } /* 00002F60-00002F64 .text eventCameraTestInit__11daAuction_cFv */ -void daAuction_c::eventCameraTestInit() { - /* Nonmatching */ -} +void daAuction_c::eventCameraTestInit() {} /* 00002F64-00002F6C .text eventCameraTest__11daAuction_cFv */ -void daAuction_c::eventCameraTest() { - /* Nonmatching */ +bool daAuction_c::eventCameraTest() { + return true; } /* 00002F6C-0000369C .text next_msgStatus__11daAuction_cFPUl */ -void daAuction_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daAuction_c::next_msgStatus(u32* pMsgNo) { + u16 ret = 0xF; + + switch (*pMsgNo) { + case 0x1CF2: + *pMsgNo = 0x1CF3; + break; + case 0x1CF4: + if (m822 == 2) { + *pMsgNo = 0x1D1B; + break; + } + + if (dComIfGs_isEventBit(0x4008)) { + dComIfGp_setNpcNameMessageID(l_npc_msg_dat[dComIfGs_getEventReg(0x790F)].field_0x00); + *pMsgNo = 0x1CF6; + } else { + *pMsgNo = 0x1CF5; + } + break; + case 0x1CF7: + dComIfGp_setMiniGameRupee(mCurrBid); + dComIfGp_setAuctionRupee(mCurrBid); + dAuction_screen_slotShow(); + *pMsgNo = 0x1CF8; + break; + case 0x1CF9: + dComIfGp_setMiniGameRupee(mCurrBid); + dComIfGp_setAuctionRupee(mCurrBid); + if (m82C < 4) { + *pMsgNo = l_after_bet_msg_no[m82C]; + } else if (m827 == 0 && l_npc_msg_dat[getAucMdlNo(m824)].field_0x02 != 0) { + if (dComIfG_getTimerRestTimeMs() < 60000) { + *pMsgNo = l_npc_msg_dat[getAucMdlNo(m824)].field_0x04; + } else { + *pMsgNo = l_npc_msg_dat[getAucMdlNo(m824)].field_0x02; + } + } else { + ret = 0x10; + } + + m825 = m824; + u8 tmp = m827; + m826 = tmp; + m824 = tmp; + if (m826 != 0) { + setLinkAnm(1); + } + break; + case 0x1CFA: + s16 msgSetNo = dComIfGp_getMessageSetNumber(); + + if (dComIfGs_getRupee() < msgSetNo) { + mDoAud_seStart(JA_SE_AUC_BID_NG); + setLinkAnm(0x4A); + *pMsgNo = 0x1CFB; + m7C4[0] = 50.0f; + } else if (msgSetNo <= mCurrBid) { + mDoAud_seStart(JA_SE_AUC_BID_NG); + setLinkAnm(0x4A); + *pMsgNo = 0x1D1E; + m7C4[0] = 50.0f; + } else { + mDoAud_seStart(JA_SE_AUC_BID_OK); + + m7C4[0] = 0.0f; + if (msgSetNo == 999) { + *pMsgNo = 0x1D24; + m825 = m824; + u8 tmp = m827; + m826 = tmp; + m824 = tmp; + } else { + *pMsgNo = 0x1CF9; + m82C = 4; // ? + + for (m82C = 0; m82C < 4; m82C++) { + if (msgSetNo >= (s16)(mCurrBid * l_after_bet_rate[m82C]) && + mCurrBid >= l_after_bet_chk[m82C]) + { + m806 = (s16)(60.0f * (l_after_bet_wait[m82C][0] + cM_rndF(l_after_bet_wait[m82C][1] - l_after_bet_wait[m82C][0]))); + break; + } + } + } + + mCurrBid = msgSetNo; + dComIfGp_setMessageCountNumber(mCurrBid); + } + break; + case 0x1CFC: + if (mpCurrMsg->mSelectNum == 0) { + *pMsgNo = 0x1D1F; + } else { + ret = 0x10; + } + break; + case 0x1D1A: + if (mpCurrMsg->mSelectNum == 0) { + m82B = 1; + } + + ret = 0x10; + break; + + case 0x1D1F: + dComIfGp_setNextStage("sea", 3, 11); + case 0x1D24: + m82B = 1; + ret = 0x10; + break; + + case 0x1D20: + case 0x1D21: + case 0x1D22: + case 0x1D23: + setLinkAnm(0x14); + int rnd = getRand(6) + 1; + *pMsgNo = l_npc_msg_dat[getAucMdlNo(rnd)].field_0x06; + m825 = rnd; + break; + + case 0x1D48: + case 0x33A2: + case 0x33A8: + case 0x33A5: + case 0x339F: + case 0x1D4B: + case 0x1D3F: + case 0x1D45: + case 0x1D42: + case 0x1D3C: + this->m834 |= 2; + this->m808 = 0; + ret = 0x10; + break; + + case 0x1D05: + if (m822 == 2) { + *pMsgNo = 0x1D1C; + } else { + if (m824 != 0) { + dComIfGs_onEventBit(0x4008); + dComIfGs_setEventReg(0x790F, getAucMdlNo(m824)); + dComIfGs_setEventReg(0xCD03, mCurrAuctionItemIndex); + } else { + dComIfGs_offEventBit(0x4008); + } + + fopAcM_delete(mCurrAuctionItemPID); + ret = 0x10; + } + break; + case 0x1D1C: + dComIfGp_setItemRupeeCount(mCurrBid); + ret = 0x10; + break; + case 0x1D07: + dComIfGp_setItemRupeeCount(-mCurrBid); + *pMsgNo = 0x1D08; + break; + case 0x1D1D: + case 0x1D08: + *pMsgNo = 0x1D09; + break; + + default: + ret = 0x10; + break; + } + + if (ret == 0xF) { + m7EC = *pMsgNo; + } else { + m7EC = 0; + } + + return ret; } /* 0000369C-000036AC .text setMessage__11daAuction_cFUl */ -void daAuction_c::setMessage(unsigned long) { - /* Nonmatching */ +void daAuction_c::setMessage(u32 msg) { + mCurrMsgBsPcId = fpcM_ERROR_PROCESS_ID_e; + mCurrMsgNo = msg; } /* 000036AC-000036E4 .text setMessage2__11daAuction_cFUl */ -void daAuction_c::setMessage2(unsigned long) { - /* Nonmatching */ +void daAuction_c::setMessage2(u32 msg) { + setMessage(msg); + m81F = 2; + dAuction_screen_gaugeHide(); } /* 000036E4-00003754 .text setMtx__11daAuction_cFv */ void daAuction_c::setMtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00003754-00003828 .text getItemNo__11daAuction_cFv */ -void daAuction_c::getItemNo() { - /* Nonmatching */ +u8 daAuction_c::getItemNo() { + int i; + int rand_max = 0; + + for (i = 0; i < 4; i++) { + if (!dComIfGs_isEventBit(l_item_dat[i].mObtainedEventBit)) { + rand_max += 1; + } + } + + int rand = getRand(rand_max); + + for (i = 0; i < 3; i++) { + if (!dComIfGs_isEventBit(l_item_dat[i].mObtainedEventBit)) { + if (rand == 0) break; + + rand -= 1; + } + } + + return i; } /* 00003828-0000387C .text getNpcActorP__11daAuction_cFi */ -void daAuction_c::getNpcActorP(int) { - /* Nonmatching */ +fopAc_ac_c* daAuction_c::getNpcActorP(int idx) { + if (idx != 0) { + return fopAcM_SearchByID(m738[idx]); + } + + return dComIfGp_getPlayer(0); } /* 0000387C-000039FC .text setCameraNpc__11daAuction_cFis */ -void daAuction_c::setCameraNpc(int, short) { - /* Nonmatching */ +void daAuction_c::setCameraNpc(int idx, s16 param_2) { + fopAc_ac_c* pActor = getNpcActorP(idx); + + m78C = pActor->current.pos; + m78C.y += l_npc_camera_dat[idx].field_0x04; + + m798.x = l_npc_camera_dat[idx].field_0x00 * cM_ssin(pActor->current.angle.y); + m798.y = 0.0f; + m798.z = l_npc_camera_dat[idx].field_0x00 * cM_scos(pActor->current.angle.y); + + s16 yRot = l_npc_camera_dat[idx].field_0x0A; + if (param_2 != 0) { + yRot += param_2; + } else { + s16 rnd = (s16)cM_rndFX(8000.0f); + yRot += rnd; + } + + mDoMtx_stack_c::YrotS(yRot); + mDoMtx_stack_c::XrotM(l_npc_camera_dat[idx].field_0x08); + + cMtx_multVec(mDoMtx_stack_c::get(), &m798, &m798); + m798 += m78C; + + // onCamera inline + m835 |= 9; + m835 &= ~2; } /* 000039FC-00003A3C .text setLinkAnm__11daAuction_cFUc */ -void daAuction_c::setLinkAnm(unsigned char) { - /* Nonmatching */ +void daAuction_c::setLinkAnm(u8 linkAnm) { + if (linkAnm == 1 && m826 == 0) { + linkAnm = 0x1D; + } + + daPy_lk_c* pLink = (daPy_lk_c*)dComIfGp_getLinkPlayer(); + + pLink->changeDemoMode(linkAnm); + pLink->changeDemoParam0(3); + mCurLinkAnm = linkAnm; } /* 00003A3C-00003A74 .text getPiconDispOfs__11daAuction_cFUc */ -void daAuction_c::getPiconDispOfs(unsigned char) { - /* Nonmatching */ +f32 daAuction_c::getPiconDispOfs(u8 param) { + if (param == 0) { + return l_npc_emitter_ofsy[0]; + } + + daNpcAuction_c* pNpcActor = (daNpcAuction_c*)getNpcActorP(param); + return pNpcActor->getPiconOfsY(); } /* 00003A74-00003BA4 .text nextBet__11daAuction_cFv */ void daAuction_c::nextBet() { - /* Nonmatching */ + if (m831 != 0) { + m831 -= 1; + return; + } + + for (int i = 1; i < 7; i++) { + f32 rnd = getRand(60 - (dComIfG_getTimerRestTimeMs() / 1000)); + if (rnd > 50.0f) { + rnd = 50.0f; + } + + m7C4[i] += rnd; + + if (m7C4[i] >= 100.0f) { + m831 += 1; + } + } + + m831 += 2; } /* 00003BA4-00003C08 .text getRand__11daAuction_cFi */ -void daAuction_c::getRand(int) { - /* Nonmatching */ +int daAuction_c::getRand(int max) { + int rnd = (int)cM_rndF(max); + + if (rnd == max) { + rnd = 0; + } + + return rnd; } /* 00003C08-00003C28 .text daAuctionCreate__FPv */ -static s32 daAuctionCreate(void*) { - /* Nonmatching */ +static s32 daAuctionCreate(void* i_this) { + return static_cast(i_this)->_create(); } /* 00003C28-00003C48 .text daAuctionDelete__FPv */ -static BOOL daAuctionDelete(void*) { - /* Nonmatching */ +static BOOL daAuctionDelete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 00003C48-00003C68 .text daAuctionExecute__FPv */ -static BOOL daAuctionExecute(void*) { - /* Nonmatching */ +static BOOL daAuctionExecute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00003C68-00003C88 .text daAuctionDraw__FPv */ -static BOOL daAuctionDraw(void*) { - /* Nonmatching */ +static BOOL daAuctionDraw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 00003C88-00003C90 .text daAuctionIsDelete__FPv */ static BOOL daAuctionIsDelete(void*) { - /* Nonmatching */ + return TRUE; } static actor_method_class daAuctionMethodTable = { @@ -300,3 +1651,5 @@ actor_process_profile_definition g_profile_AUCTION = { /* Group */ fopAc_ACTOR_e, /* CullType */ fopAc_CULLBOX_CUSTOM_e, }; + +#undef RAND_RANGE diff --git a/src/d/actor/d_a_npc_auction.cpp b/src/d/actor/d_a_npc_auction.cpp index 63e08d9ae..800559eef 100644 --- a/src/d/actor/d_a_npc_auction.cpp +++ b/src/d/actor/d_a_npc_auction.cpp @@ -118,12 +118,12 @@ void daNpcAuction_c::XyEventCB(int) { } /* 000019F8-00001CD4 .text next_msgStatus__14daNpcAuction_cFPUl */ -void daNpcAuction_c::next_msgStatus(unsigned long*) { +u16 daNpcAuction_c::next_msgStatus(u32*) { /* Nonmatching */ } /* 00001CD4-00001F04 .text getMsg__14daNpcAuction_cFv */ -void daNpcAuction_c::getMsg() { +u32 daNpcAuction_c::getMsg() { /* Nonmatching */ } diff --git a/src/d/d_auction_screen.cpp b/src/d/d_auction_screen.cpp index db457f610..73e2c646a 100644 --- a/src/d/d_auction_screen.cpp +++ b/src/d/d_auction_screen.cpp @@ -142,7 +142,7 @@ static void dAs_Create(msg_class*) { } /* 80160D20-80160D70 .text dAuction_screen_create__Fv */ -void dAuction_screen_create() { +uint dAuction_screen_create() { /* Nonmatching */ } diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index a3148d213..cd99eb94f 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -93,8 +93,8 @@ void dComIfG_play_c::itemInit() { mMsgCountNumber = 0; mMsgSetNumber = 0; mMessageRupee = 0; - field_0x491e = 0; - field_0x4920 = 0; + mAuctionRupee = 0; + mAuctionGauge = 0; field_0x4922 = 0; mCurrHP = 0; mRupyCountDisplay = 0;