Merge pull request #512 from LagoLunatic/player

d_a_player_npc 98%, f_op_actor OK
This commit is contained in:
Jasper St. Pierre
2023-10-08 17:47:27 -07:00
committed by GitHub
14 changed files with 435 additions and 89 deletions
+1 -1
View File
@@ -276,7 +276,7 @@ config.libs = [
Object(NonMatching, "f_ap/f_ap_game.cpp"),
# f_op
Object(NonMatching, "f_op/f_op_actor.cpp"),
Object(Matching, "f_op/f_op_actor.cpp", extra_cflags=["-sym off"]),
Object(Matching, "f_op/f_op_actor_iter.cpp"),
Object(Matching, "f_op/f_op_actor_tag.cpp"),
Object(NonMatching, "f_op/f_op_actor_mng.cpp"),
+7 -1
View File
@@ -8,7 +8,13 @@
class J3DLightInfo {
public:
void operator=(J3DLightInfo const&);
void operator=(J3DLightInfo const& other) {
mLightPosition = other.mLightPosition;
mLightDirection = other.mLightDirection;
mColor = other.mColor;
mCosAtten = other.mCosAtten;
mDistAtten = other.mDistAtten;
}
/* 0x00 */ Vec mLightPosition;
/* 0x0C */ Vec mLightDirection;
+1
View File
@@ -137,6 +137,7 @@ struct TVec3<f32> {
x = b.x;
y = b.y;
z = b.z;
return *this;
}
f32 squared() const {
+46
View File
@@ -0,0 +1,46 @@
#ifndef D_A_PLAYER_NPC_H
#define D_A_PLAYER_NPC_H
#include "d/actor/d_a_player.h"
#include "d/d_bg_s_acch.h"
class daPy_npc_c : public daPy_py_c {
public:
/* 0x320 */ dBgS_Acch mAcch;
/* 0x4E4 */ u32 m4E4;
/* 0x4E8 */ u8 m4E8;
/* 0x4E9 */ u8 mDamageFogTimer;
/* 0x4EA */ u8 field_4EA[0x4EC - 0x4EA];
void returnLink() { m4E4 |= 1; }
void offReturnLink() { m4E4 &= ~1; }
bool isReturnLink() { return m4E4 & 1; }
void onEventAccept() { m4E4 |= 2; }
void offEventAccept() { m4E4 &= ~2; }
bool isEventAccept() { return m4E4 & 2; }
u8 getDamageFogTimer() { return mDamageFogTimer; }
void setDamageFogTimer(u8 timer) { mDamageFogTimer = timer; }
void executeDamageFog() { cLib_calcTimer(&mDamageFogTimer); }
virtual void restartPoint(s16) {}
virtual void isTagCheckOK() {}
virtual void setMessageAnimation(u8) {}
int check_initialRoom();
BOOL check_moveStop();
void setRestart(s8);
void unconditionalSetRestart(s8);
void setOffsetHomePos();
void setPointRestart(s16, s8);
BOOL checkRestart(s8);
BOOL initialRestartOption(s8, int);
BOOL checkNowPosMove(const char*);
void drawDamageFog();
int chkMoveBlock(cXyz*);
};
void* daPy_npc_JudgeForPNameAndDistance(void* i_actor, void* i_prm);
fopAc_ac_c* daPy_npc_SearchAreaByName(fopAc_ac_c* i_this, s16 procName, f32 areaRadius, cXyz* outActorOffset);
#endif /* D_A_PLAYER_NPC_H */
+1 -1
View File
@@ -106,7 +106,7 @@ public:
int GetSpecialCode(cBgS_PolyInfo&);
s32 GetAttributeCodeDirect(cBgS_PolyInfo&);
s32 GetAttributeCode(cBgS_PolyInfo&);
void GetGroundCode(cBgS_PolyInfo&);
int GetGroundCode(cBgS_PolyInfo&);
void GetPolyId2(int, int, int, u32, u32);
int GetCamMoveBG(cBgS_PolyInfo&);
int GetRoomCamId(cBgS_PolyInfo&);
+89 -40
View File
@@ -39,7 +39,7 @@ class camera_class;
class J2DOrthoGraph;
class dDemo_actor_c;
enum ALWAYS_RES_FILE_IDS {
enum ALWAYS_RES_FILE_ID { // IDs and indexes are synced
/* BCK */
ALWAYS_BCK_FA=0xC,
ALWAYS_BCK_OBM_SYOUGEKISW=0xD,
@@ -331,6 +331,7 @@ public:
fopAc_ac_c* getPlayerPtr(int idx) { return (fopAc_ac_c*)mpPlayerPtr[idx]; }
fopAc_ac_c* getPlayer(int idx) { return (fopAc_ac_c*)mpPlayer[idx]; }
void setPlayer(int idx, fopAc_ac_c* player) { mpPlayer[idx] = (daPy_py_c*)player; }
void setPlayerPtr(int idx, fopAc_ac_c* playerPtr) { mpPlayerPtr[idx] = playerPtr; }
s8 getPlayerCameraID(int idx) { return mCurCamera[idx]; }
int getItemRupeeCount() { return mItemRupeeCount; }
@@ -703,14 +704,82 @@ inline s8 dComIfGs_getRestartRoomNo() {
return g_dComIfG_gameInfo.save.getRestart().getRoomNo();
}
inline s8 dComIfGs_getTurnRestartRoomNo() {
return g_dComIfG_gameInfo.save.getTurnRestart().getRoomNo();
inline s8 dComIfGs_getRestartOption() {
return g_dComIfG_gameInfo.save.getRestart().getRestartOption();
}
inline s16 dComIfGs_getRestartOptionPoint() {
return g_dComIfG_gameInfo.save.getRestart().getRestartOptionPoint();
}
inline s8 dComIfGs_getRestartOptionRoomNo() {
return g_dComIfG_gameInfo.save.getRestart().getRestartOptionRoomNo();
}
inline cXyz& dComIfGs_getRestartOptionPos() {
return g_dComIfG_gameInfo.save.getRestart().getRestartOptionPos();
}
inline s16 dComIfGs_getRestartOptionAngleY() {
return g_dComIfG_gameInfo.save.getRestart().getRestartOptionAngleY();
}
inline void dComIfGs_setRestartOption(s8 i_option) {
g_dComIfG_gameInfo.save.getRestart().setRestartOption(i_option);
}
inline void dComIfGs_setRestartOption(cXyz* i_pos, s16 i_angle, s8 i_roomNo, s8 i_option) {
g_dComIfG_gameInfo.save.getRestart().setRestartOption(i_option, i_pos, i_angle, i_roomNo);
}
inline u32 dComIfGs_getRestartRoomParam() {
return g_dComIfG_gameInfo.save.getRestart().getRoomParam();
}
inline cXyz& dComIfGs_getRestartRoomPos() {
return g_dComIfG_gameInfo.save.getRestart().getRoomPos();
}
inline s16 dComIfGs_getRestartRoomAngleY() {
return g_dComIfG_gameInfo.save.getRestart().getRoomAngleY();
}
inline void dComIfGs_setStartPoint(s16 i_point) {
g_dComIfG_gameInfo.save.getRestart().setStartPoint(i_point);
}
inline s8 dComIfGs_getTurnRestartRoomNo() {
return g_dComIfG_gameInfo.save.getTurnRestart().getRoomNo();
}
inline u32 dComIfGs_getTurnRestartParam() {
return g_dComIfG_gameInfo.save.getTurnRestart().getParam();
}
inline cXyz& dComIfGs_getTurnRestartPos() {
return g_dComIfG_gameInfo.save.getTurnRestart().getPos();
}
inline cXyz& dComIfGs_getTurnRestartShipPos() {
return g_dComIfG_gameInfo.save.getTurnRestart().getShipPos();
}
inline s16 dComIfGs_getTurnRestartAngleY() {
return g_dComIfG_gameInfo.save.getTurnRestart().getAngleY();
}
inline s16 dComIfGs_getTurnRestartShipAngleY() {
return g_dComIfG_gameInfo.save.getTurnRestart().getShipAngleY();
}
inline void dComIfGs_setTurnRestart(const cXyz& i_pos, s16 i_angle, s8 i_roomNo, u32 i_param) {
g_dComIfG_gameInfo.save.getTurnRestart().set(i_pos, i_angle, i_roomNo, i_param, i_pos, i_angle, 0);
}
inline void dComIfGs_setPlayerPriest(u8 i_option, cXyz& i_pos, s16 i_angle, s8 i_roomNo) {
g_dComIfG_gameInfo.save.getPlayer().getPriest().set(i_option, i_pos, i_angle, i_roomNo);
}
inline int dComIfGs_getTriforceNum() {
return g_dComIfG_gameInfo.save.getPlayer().getCollect().getTriforceNum();
}
@@ -812,38 +881,6 @@ inline void dComIfGs_removeZone(int i_zoneNo) {
g_dComIfG_gameInfo.save.removeZone(i_zoneNo);
}
inline u32 dComIfGs_getTurnRestartParam() {
return g_dComIfG_gameInfo.save.getTurnRestart().getParam();
}
inline cXyz& dComIfGs_getTurnRestartPos() {
return g_dComIfG_gameInfo.save.getTurnRestart().getPos();
}
inline cXyz& dComIfGs_getTurnRestartShipPos() {
return g_dComIfG_gameInfo.save.getTurnRestart().getShipPos();
}
inline s16 dComIfGs_getTurnRestartAngleY() {
return g_dComIfG_gameInfo.save.getTurnRestart().getAngleY();
}
inline s16 dComIfGs_getTurnRestartShipAngleY() {
return g_dComIfG_gameInfo.save.getTurnRestart().getShipAngleY();
}
inline u32 dComIfGs_getRestartRoomParam() {
return g_dComIfG_gameInfo.save.getRestart().getRoomParam();
}
inline cXyz& dComIfGs_getRestartRoomPos() {
return g_dComIfG_gameInfo.save.getRestart().getRoomPos();
}
inline s16 dComIfGs_getRestartRoomAngleY() {
return g_dComIfG_gameInfo.save.getRestart().getRoomAngleY();
}
inline void dComIfGs_putSave(int i_stageNo) {
g_dComIfG_gameInfo.save.putSave(i_stageNo);
}
@@ -864,10 +901,6 @@ inline BOOL dComIfGs_isActor(int i_no, int i_roomNo) {
return g_dComIfG_gameInfo.save.isActor(i_no, i_roomNo);
}
inline void dComIfGs_setTurnRestart(const cXyz& i_pos, s16 i_angle, s8 i_roomNo, u32 i_param) {
g_dComIfG_gameInfo.save.getTurnRestart().set(i_pos, i_angle, i_roomNo, i_param, i_pos, i_angle, 0);
}
inline u16 dComIfGs_getDate() {
return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusB().getDate();
}
@@ -1050,6 +1083,10 @@ inline fopAc_ac_c* dComIfGp_getCb1Player() {
return g_dComIfG_gameInfo.play.getPlayerPtr(1);
}
inline void dComIfGp_setCb1Player(fopAc_ac_c* player) {
g_dComIfG_gameInfo.play.setPlayerPtr(1, player);
}
inline roomRead_class* dComIfGp_getStageRoom() {
return g_dComIfG_gameInfo.play.getStage().getRoom();
}
@@ -1086,6 +1123,14 @@ inline int dComIfGp_getStagePlightNumInfo() {
return g_dComIfG_gameInfo.play.getStage().getPlightNumInfo();
}
inline stage_actor_class* dComIfGp_getStagePlayer() {
return g_dComIfG_gameInfo.play.getStage().getPlayer();
}
inline u16 dComIfGp_getStagePlayerNum() {
return g_dComIfG_gameInfo.play.getStage().getPlayerNum();
}
inline s32 dComIfGp_roomControl_getTimePass() {
return g_dComIfG_gameInfo.play.getRoomControl()->GetTimePass();
}
@@ -1114,6 +1159,10 @@ inline void dComIfGp_roomControl_setStatusFlag(int i_roomNo, u8 i_flag) {
g_dComIfG_gameInfo.play.getRoomControl()->setStatusFlag(i_roomNo, i_flag);
}
inline BOOL dComIfGp_roomControl_checkStatusFlag(int i_roomNo, u8 i_flag) {
return g_dComIfG_gameInfo.play.getRoomControl()->checkStatusFlag(i_roomNo, i_flag);
}
inline void dComIfGp_roomControl_zoneCountCheck(int i_roomNo) {
g_dComIfG_gameInfo.play.getRoomControl()->zoneCountCheck(i_roomNo);
}
@@ -1473,7 +1522,7 @@ inline s16 dComIfGp_evmng_getEventIdx(const char* pName, u8 evNo) {
return dComIfGp_getEventManager().getEventIdx(pName, evNo);
}
inline int dComIfGp_evmng_getMyStaffId(char* pName, fopAc_ac_c* pActor, s32 param_3) {
inline int dComIfGp_evmng_getMyStaffId(const char* pName, fopAc_ac_c* pActor, s32 param_3) {
return dComIfGp_getEventManager().getMyStaffId(pName, pActor, param_3);
}
+1
View File
@@ -94,6 +94,7 @@ public:
/* 0xDC */ int mState;
};
class mDoExt_McaMorf;
void dDemo_setDemoData(fopAc_ac_c*, u8, mDoExt_McaMorf*, const char*, int, u16*, u32, s8);
#endif /* D_DEMO_H */
+16 -10
View File
@@ -566,19 +566,25 @@ public:
mLastMode = mode;
}
s16 getStartPoint() const { return mStartCode; }
u32 getLastMode() const { return mLastMode; }
s8 getRoomNo() const { return mRestartRoom; }
u32 getRoomParam() const { return mRestartParam; }
s16 getStartPoint() { return mStartCode; }
u32 getLastMode() { return mLastMode; }
f32 getLastSpeedF() { return mLastSpeedF; }
s8 getRoomNo() { return mRestartRoom; }
u32 getRoomParam() { return mRestartParam; }
cXyz& getRoomPos() { return mRestartPos; }
s16 getRoomAngleY() const { return mRestartAngle; }
s16 getRoomAngleY() { return mRestartAngle; }
s8 getRestartOption() { return mOption; }
s8 getRestartOptionRoomNo() { return mOptionRoomNo; }
s16 getRestartOptionPoint() { return mOptionPoint; }
s16 getRestartOptionAngleY() { return mOptionRoomAngleY; }
cXyz& getRestartOptionPos() { return mOptionRoomPos; }
/* 0x00 */ s8 mRestartRoom;
/* 0x01 */ u8 field_0x1;
/* 0x02 */ s8 mRoomNo;
/* 0x04 */ s16 field_0x4;
/* 0x06 */ s16 mRoomAngleY;
/* 0x08 */ cXyz mRoomPos;
/* 0x01 */ u8 mOption;
/* 0x02 */ s8 mOptionRoomNo;
/* 0x04 */ s16 mOptionPoint;
/* 0x06 */ s16 mOptionRoomAngleY;
/* 0x08 */ cXyz mOptionRoomPos;
/* 0x14 */ s16 mStartCode;
/* 0x16 */ s16 mRestartAngle;
/* 0x18 */ cXyz mRestartPos;
+1 -1
View File
@@ -832,7 +832,7 @@ public:
static void setBgW(int param_0, dBgW_base* i_bgw) { mStatus[param_0].mpBgW = i_bgw; }
bool checkStatusFlag(int i_roomNo, u8 flag) const {
BOOL checkStatusFlag(int i_roomNo, u8 flag) const {
return cLib_checkBit(mStatus[i_roomNo].mFlags, flag);
}
+8 -5
View File
@@ -94,6 +94,7 @@ enum dEvt_Command_e {
dEvtCmd_INDEMO_e,
dEvtCmd_INDOOR_e,
dEvtCmd_INGETITEM_e,
dEvtCmd_INCATCH_e = 6,
dEvtCmd_DUMMY = 0xFFFF,
};
@@ -129,11 +130,11 @@ public:
void onCondition(u16 cond) { mCondition |= cond; }
void offCondition(u16 cond) { mCondition &= ~cond; }
bool checkCommandTalk() { return mCommand == 1; }
bool checkCommandItem() { return mCommand == 4; }
BOOL checkCommandDoor() { return mCommand == 3; }
bool checkCommandDemoAccrpt() { return mCommand == 2; }
bool checkCommandCatch() { return mCommand == 6; }
bool checkCommandTalk() { return mCommand == dEvtCmd_INTALK_e; }
bool checkCommandItem() { return mCommand == dEvtCmd_INGETITEM_e; }
BOOL checkCommandDoor() { return mCommand == dEvtCmd_INDOOR_e; }
bool checkCommandDemoAccrpt() { return mCommand == dEvtCmd_INDEMO_e; }
bool checkCommandCatch() { return mCommand == dEvtCmd_INCATCH_e; }
/* 0x04 */ u16 mCommand;
/* 0x06 */ u16 mCondition;
@@ -169,6 +170,7 @@ public:
#ifndef __INTELLISENSE__
fopAc_cullSizeSphere() {}
fopAc_cullSizeSphere(cXyz, float);
~fopAc_cullSizeSphere() {}
#endif
/* 0x0 */ Vec mCenter;
@@ -181,6 +183,7 @@ public:
fopAc_cullSizeBox() {}
fopAc_cullSizeBox(const fopAc_cullSizeBox&);
fopAc_cullSizeBox(cXyz, cXyz);
~fopAc_cullSizeBox() {}
#endif
/* 0x0 */ Vec mMin;
+1 -1
View File
@@ -82,7 +82,7 @@ inline MtxP fopAcM_GetMtx(fopAc_ac_c* pActor) {
return pActor->mCullMtx;
}
inline u32 fopAcM_checkStatus(fopAc_ac_c* pActor, u32 status) {
inline bool fopAcM_checkStatus(fopAc_ac_c* pActor, u32 status) {
return pActor->mStatus & status;
}
+1 -1
View File
@@ -82,7 +82,7 @@ enum Action {
ACTION_ITAI_MOVE = 0x3,
};
enum AM_RES_FILE_IDS {
enum AM_RES_FILE_ID { // IDs and indexes are synced
/* BAS */
AM_BAS_BOM_NOMI=0x5,
AM_BAS_BOM_NOMI2=0x6,
+232 -26
View File
@@ -3,71 +3,277 @@
// Translation Unit: d_a_player_npc.cpp
//
#include "d_a_player_npc.h"
#include "d/actor/d_a_player_npc.h"
#include "dolphin/types.h"
#include "m_Do/m_Do_lib.h"
#include "SSystem/SComponent/c_counter.h"
#include "d/d_procname.h"
/* 8015A37C-8015A448 .text check_initialRoom__10daPy_npc_cFv */
void daPy_npc_c::check_initialRoom() {
/* Nonmatching */
int daPy_npc_c::check_initialRoom() {
if (orig.roomNo < 0) {
mAcch.CrrPos(*dComIfG_Bgsp());
if (mAcch.GetGroundH() == -1000000000.0f || dComIfG_Bgsp()->GetGroundCode(mAcch.m_gnd) == 4) {
return 0;
} else {
int roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd);
if (roomNo < 0 || !dComIfGp_roomControl_checkStatusFlag(roomNo, 0x10)) {
return 0;
} else {
orig.roomNo = roomNo;
current.roomNo = roomNo;
return -1;
}
}
}
return 1;
}
/* 8015A448-8015A524 .text check_moveStop__10daPy_npc_cFv */
void daPy_npc_c::check_moveStop() {
/* Nonmatching */
BOOL daPy_npc_c::check_moveStop() {
int roomNo = current.roomNo;
BOOL hasBgW = dComIfGp_roomControl_checkStatusFlag(roomNo, 0x10);
if ((roomNo < 0 || !hasBgW)) {
if (!hasBgW || m4E8 >= 30) {
current = orig;
shape_angle = orig.angle;
speedF = 0.0f;
m4E8 = 0;
}
if (dComIfGp_getPlayer(0)->mEvtInfo.mCommand != dEvtCmd_INDOOR_e) {
offNpcCallCommand();
}
return TRUE;
}
return FALSE;
}
/* 8015A524-8015A590 .text setRestart__10daPy_npc_cFSc */
void daPy_npc_c::setRestart(signed char) {
/* Nonmatching */
void daPy_npc_c::setRestart(s8 option) {
if (option == dComIfGs_getRestartOption()) {
bool playerInDoor = dComIfGp_getPlayer(0)->mEvtInfo.checkCommandDoor();
s8 roomNo = current.roomNo;
s8 optionRoomNo = dComIfGs_getRestartOptionRoomNo();
if (!playerInDoor && roomNo != optionRoomNo) {
unconditionalSetRestart(option);
}
}
}
/* 8015A590-8015A624 .text unconditionalSetRestart__10daPy_npc_cFSc */
void daPy_npc_c::unconditionalSetRestart(signed char) {
/* Nonmatching */
void daPy_npc_c::unconditionalSetRestart(s8 option) {
dComIfGs_setRestartOption(option);
dComIfGs_setPlayerPriest(option, dComIfGs_getRestartOptionPos(), dComIfGs_getRestartOptionAngleY(), dComIfGs_getRestartOptionRoomNo());
orig.pos = dComIfGs_getRestartOptionPos();
orig.angle.y = dComIfGs_getRestartOptionAngleY();
orig.roomNo = dComIfGs_getRestartOptionRoomNo();
}
/* 8015A624-8015A6A4 .text setOffsetHomePos__10daPy_npc_cFv */
void daPy_npc_c::setOffsetHomePos() {
/* Nonmatching */
static cXyz l_offsetPos(100.0f, 0.0f, 0.0f);
cLib_offsetPos(&orig.pos, &orig.pos, orig.angle.y, &l_offsetPos);
}
/* 8015A6A4-8015AA0C .text setPointRestart__10daPy_npc_cFsSc */
void daPy_npc_c::setPointRestart(short, signed char) {
/* Nonmatching */
void daPy_npc_c::setPointRestart(s16 i_point, s8 option) {
/* Nonmatching (regswaps) */
JUT_ASSERT(157, dComIfGp_getStagePlayer() != 0);
stage_scls_info_dummy_class* sclsinfo = dComIfGp_getStageSclsInfo();
JUT_ASSERT(159, sclsinfo != 0);
JUT_ASSERT(161, 0 <= i_point && i_point < sclsinfo->num);
stage_scls_info_class* scls_data = sclsinfo->m_entries;
JUT_ASSERT(163, scls_data != 0);
stage_actor_data_class* player_data = dComIfGp_getStagePlayer()->m_entries;
int scls_start_code = scls_data[i_point].mStart;
int i;
for (i = 0; i < dComIfGp_getStagePlayerNum(); i++) {
u8 plyr_start_code = player_data->mAngle.z & 0xFF;
if (plyr_start_code == scls_start_code) {
break;
}
player_data++;
}
JUT_ASSERT(174, i != dComIfGp_getStagePlayerNum());
orig.pos = player_data->mSpawnPos;
orig.angle.y = player_data->mAngle.y;
orig.roomNo = -1;
setOffsetHomePos();
current = orig;
next = orig;
shape_angle = orig.angle;
s16 rotY = orig.angle.y;
s8 roomNo = -1;
dComIfGs_setRestartOption(&orig.pos, rotY, roomNo, option);
dComIfGs_setPlayerPriest(option, orig.pos, rotY, roomNo);
dComIfGs_setPlayerPriest(option, dComIfGs_getRestartOptionPos(), dComIfGs_getRestartOptionAngleY(), dComIfGs_getRestartOptionRoomNo());
fopAcM_setStageLayer(this);
}
/* 8015AA0C-8015AB28 .text checkRestart__10daPy_npc_cFSc */
void daPy_npc_c::checkRestart(signed char) {
/* Nonmatching */
BOOL daPy_npc_c::checkRestart(s8 option) {
if (option == dComIfGs_getRestartOption()) {
s16 option_point = dComIfGs_getRestartOptionPoint();
if (option_point < 0) {
orig.pos = dComIfGs_getRestartOptionPos();
orig.angle.y = dComIfGs_getRestartOptionAngleY();
orig.roomNo = dComIfGs_getRestartOptionRoomNo();
current = orig;
next = orig;
shape_angle = orig.angle;
} else {
setPointRestart(option_point, 1);
}
return TRUE;
}
return FALSE;
}
/* 8015AB28-8015ABD8 .text initialRestartOption__10daPy_npc_cFSci */
void daPy_npc_c::initialRestartOption(signed char, int) {
/* Nonmatching */
BOOL daPy_npc_c::initialRestartOption(s8 option, int save) {
fopAc_ac_c* partner = dComIfGp_getCb1Player();
if (!partner) {
dComIfGp_setCb1Player(this);
if (save && option != dComIfGs_getRestartOption()) {
s16 rotY;
s8 roomNo = current.roomNo;
rotY = orig.angle.y;
dComIfGs_setRestartOption(&orig.pos, rotY, roomNo, option);
dComIfGs_setPlayerPriest(option, orig.pos, rotY, roomNo);
}
return TRUE;
}
return FALSE;
}
/* 8015ABD8-8015AC74 .text checkNowPosMove__10daPy_npc_cFPCc */
void daPy_npc_c::checkNowPosMove(const char*) {
/* Nonmatching */
BOOL daPy_npc_c::checkNowPosMove(const char* pName) {
/* Nonmatching (regalloc) */
if (!dComIfGp_event_runCheck()) {
return TRUE;
}
if (mEvtInfo.checkCommandTalk()) {
return TRUE;
}
if (isEventAccept() && !isReturnLink()) {
return TRUE;
}
int evtStaffId = dComIfGp_evmng_getMyStaffId(pName, NULL, 0);
if (evtStaffId != -1) {
return TRUE;
}
return fopAcM_checkStatus(this, fopAcStts_UNK800_e);
}
/* 8015AC74-8015AD20 .text drawDamageFog__10daPy_npc_cFv */
void daPy_npc_c::drawDamageFog() {
/* Nonmatching */
if (mDamageFogTimer == 0) {
return;
}
cXyz temp;
f32 temp_f1;
f32 temp_f2;
mDoLib_pos2camera(&current.pos, &temp);
temp_f2 = fabs(cM_ssin(g_Counter.mTimer * 0x800));
mTevStr.mFogColor.r = 255;
mTevStr.mFogColor.g = 60;
mTevStr.mFogColor.b = 60;
temp_f1 = -temp.z;
temp_f1 -= 200.0f;
temp_f2 = 200.0f * temp_f2;
mTevStr.mFogStartZ = temp_f1 + temp_f2;
mTevStr.mFogEndZ = mTevStr.mFogStartZ + 300.0f;
}
/* 8015AD20-8015AEF8 .text chkMoveBlock__10daPy_npc_cFP4cXyz */
void daPy_npc_c::chkMoveBlock(cXyz*) {
/* Nonmatching */
int daPy_npc_c::chkMoveBlock(cXyz* outBlockVel) {
cXyz blockRelPos;
fopAc_ac_c* block = daPy_npc_SearchAreaByName(this, PROC_Obj_Movebox, 300.0f, &blockRelPos);
if (block) {
cXyz blockVel = block->current.pos - block->next.pos;
if (blockVel.abs() > 0.001f) {
if (outBlockVel) {
*outBlockVel = blockVel;
}
blockRelPos.normalizeZP();
blockVel.normalizeZP();
f32 dot = blockRelPos.getDotProduct(blockVel);
blockVel.y = 0.0f;
blockRelPos.y = 0.0f;
cXyz cross = blockRelPos.outprod(blockVel);
if (dot < -0.707099974155426f) {
if (cross.y < 0.0f) {
return -1;
} else {
return 1;
}
}
if (block->current.pos.y > current.pos.y + 100.0f) {
if (cross.y < 0.0f) {
return -1;
} else {
return 1;
}
}
}
}
return 0;
}
struct judge_parm_c {
/* 0x00 */ s16 mProcName;
/* 0x04 */ cXyz mAreaCenter;
/* 0x10 */ cXyz mActorRelPos;
/* 0x1C */ f32 mAreaRadius;
/* 0x20 */ f32 mMinDist;
/* 0x24 */ fopAc_ac_c* mpActor;
};
/* 8015AEF8-8015B00C .text daPy_npc_JudgeForPNameAndDistance__FPvPv */
void daPy_npc_JudgeForPNameAndDistance(void*, void*) {
/* Nonmatching */
void* daPy_npc_JudgeForPNameAndDistance(void* i_actor, void* i_prm) {
fopAc_ac_c* actor = (fopAc_ac_c*)i_actor;
judge_parm_c* prm = (judge_parm_c*)i_prm;
if (fopAcM_GetName(actor) == prm->mProcName) {
cXyz actorOffset = actor->current.pos - prm->mAreaCenter;
f32 dist = actorOffset.abs();
if (dist < prm->mAreaRadius && dist < prm->mMinDist) {
prm->mMinDist = dist;
prm->mpActor = actor;
prm->mActorRelPos = actorOffset;
}
}
return NULL;
}
/* 8015B00C-8015B0A4 .text daPy_npc_SearchAreaByName__FP10fopAc_ac_csfP4cXyz */
void daPy_npc_SearchAreaByName(fopAc_ac_c*, short, float, cXyz*) {
/* Nonmatching */
fopAc_ac_c* daPy_npc_SearchAreaByName(fopAc_ac_c* i_this, s16 procName, f32 areaRadius, cXyz* outActorRelPos) {
judge_parm_c prm;
prm.mProcName = procName;
prm.mAreaCenter = i_this->current.pos;
prm.mAreaRadius = areaRadius;
prm.mMinDist = areaRadius;
prm.mpActor = NULL;
prm.mActorRelPos.x = 0.0f;
prm.mActorRelPos.y = 0.0f;
prm.mActorRelPos.z = 0.0f;
fopAcIt_Judge(daPy_npc_JudgeForPNameAndDistance, &prm);
if (outActorRelPos) {
*outActorRelPos = prm.mActorRelPos;
}
return prm.mpActor;
}
+30 -2
View File
@@ -18,6 +18,9 @@
fopAc_ac_c::fopAc_ac_c() {
}
fopAc_ac_c::~fopAc_ac_c() {
}
int g_fopAc_type;
u32 fopAc_ac_c::stopStatus;
@@ -34,7 +37,18 @@ s32 fopAc_Draw(void* pProc) {
if (!dMenu_flag()) {
s32 moveApproval = dComIfGp_event_moveApproval(actor);
if ((moveApproval == 2 || !fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus)) && (!(fopAcM_checkStatus(actor, fopAcStts_CULL_e) && !fopAcM_cullingCheck(actor)) || !fopAcM_checkStatus(actor, fopAcStts_NODRAW_e))) {
if (
(
moveApproval == 2
|| (
!fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus)
&& !(
fopAcM_checkStatus(actor, fopAcStts_CULL_e)
&& fopAcM_cullingCheck(actor)
)
)
) && !fopAcM_checkStatus(actor, fopAcStts_NODRAW_e)
) {
fopAcM_OffCondition(actor, fopAcCnd_NODRAW_e);
ret = fpcLf_DrawMethod((leafdraw_method_class*)actor->mSubMtd, actor);
} else {
@@ -68,7 +82,21 @@ s32 fopAc_Execute(void* pProc) {
s32 moveApproval = dComIfGp_event_moveApproval(actor);
if ((moveApproval == 2 || moveApproval != 0 || !fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus)) && (!fopAcM_checkStatus(actor, fopAcStts_NOCULLEXEC_e) || !fopAcM_CheckCondition(actor, fopAcCnd_NODRAW_e))) {
if (
(
moveApproval == 2
|| (
(
moveApproval != 0
&& !fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus)
)
&& (
!fopAcM_checkStatus(actor, fopAcStts_NOCULLEXEC_e)
|| !fopAcM_CheckCondition(actor, fopAcCnd_NODRAW_e)
)
)
)
) {
fopAcM_OffCondition(actor, fopAcCnd_NOEXEC_e);
actor->next = actor->current;
ret = fpcMtd_Execute((process_method_class*)actor->mSubMtd, actor);