Link obj_gra2, obj_gm (#2781)

* obj_gra2 almost linkable

* Link obj_gra2

* Link obj_gm
This commit is contained in:
YunataSavior 2025-11-08 15:58:02 -08:00 committed by GitHub
parent b5092b9578
commit c9bc11d470
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 1057 additions and 927 deletions

View File

@ -2016,10 +2016,10 @@ config.libs = [
ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_gb"),
ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_geyser"),
ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_glowSphere"),
ActorRel(NonMatching, "d_a_obj_gm"),
ActorRel(MatchingFor("GZ2E01"), "d_a_obj_gm"),
ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_goGate"),
ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_gomikabe"),
ActorRel(Equivalent, "d_a_obj_gra2"), # weak function order
ActorRel(MatchingFor("GZ2E01"), "d_a_obj_gra2"),
ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_graWall"),
ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_gra_rock"),
ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_grave_stone"),

View File

@ -972,6 +972,10 @@ public:
/* 8014F60C */ int MoveBGCreate(char const*, int, MoveBGActor_SetFunc, u32);
/* 8014F6FC */ int MoveBGDelete();
/* 8014F770 */ int MoveBGExecute();
int MoveBGDraw() {
int ret = Draw();
return ret;
}
/* 80155FB0 */ virtual ~daBaseNpc_moveBgActor_c() {}
/* 801503BC */ virtual int CreateHeap() { return 1; }

View File

@ -58,7 +58,7 @@ public:
/* 0x94C */ dCcD_Stts mStts;
/* 0x988 */ dCcD_Sph mSph;
/* 0xAC0 */ dCcU_AtInfo mAtInfo;
/* 0xAE4 */ u8 field_0xae4;
/* 0xAE4 */ s8 field_0xae4;
/* 0xAE8 */ u32 field_0xae8;
/* 0xAEC */ u32 field_0xaec;
/* 0xAF0 */ bool mIsFirstSpawn;

View File

@ -4,6 +4,74 @@
#include "d/actor/d_a_npc.h"
#include "f_op/f_op_actor_mng.h"
struct daObj_GrA_HIO_Param_c {
/* 0x00 */ f32 field_0x00;
/* 0x04 */ f32 mGravity;
/* 0x08 */ f32 field_0x08;
/* 0x0C */ f32 field_0x0c;
/* 0x10 */ s16 field_0x10;
/* 0x14 */ f32 field_0x14;
/* 0x18 */ f32 mWallR;
/* 0x1C */ f32 mWallH;
/* 0x20 */ f32 mWeight;
/* 0x24 */ f32 field_0x24;
/* 0x28 */ f32 field_0x28;
/* 0x2C */ f32 field_0x2c;
/* 0x30 */ f32 field_0x30;
/* 0x34 */ f32 field_0x34;
/* 0x38 */ f32 field_0x38;
/* 0x3C */ f32 field_0x3c;
/* 0x40 */ f32 field_0x40;
/* 0x44 */ f32 field_0x44;
/* 0x48 */ f32 field_0x48;
/* 0x4C */ f32 field_0x4c;
/* 0x50 */ f32 field_0x50;
/* 0x54 */ s16 field_0x54;
/* 0x56 */ s16 field_0x56;
/* 0x58 */ s16 field_0x58;
/* 0x5A */ s16 field_0x5a;
/* 0x5C */ s16 field_0x5c;
/* 0x60 */ f32 field_0x60;
/* 0x64 */ f32 field_0x64;
/* 0x68 */ s16 field_0x68;
/* 0x6C */ f32 field_0x6c;
/* 0x70 */ f32 field_0x70;
/* 0x74 */ f32 field_0x74;
/* 0x78 */ f32 field_0x78;
/* 0x7C */ f32 field_0x7c;
/* 0x80 */ f32 field_0x80;
/* 0x84 */ f32 field_0x84;
/* 0x88 */ s16 field_0x88;
/* 0x8A */ u8 field_0x8a;
/* 0x8C */ f32 field_0x8c;
/* 0x90 */ f32 field_0x90;
/* 0x94 */ f32 field_0x94;
/* 0x98 */ s16 field_0x98;
/* 0x9A */ s16 field_0x9a;
/* 0x9C */ s16 field_0x9c;
/* 0xA0 */ f32 field_0xa0;
/* 0xA4 */ s16 field_0xa4;
/* 0xA8 */ f32 field_0xa8;
/* 0xAC */ s16 field_0xac;
/* 0xAE */ s16 field_0xae;
/* 0xB0 */ s16 field_0xb0;
/* 0xB2 */ s16 field_0xb2;
/* 0xB4 */ s16 field_0xb4;
/* 0xB8 */ f32 field_0xb8;
/* 0xBC */ f32 field_0xbc;
};
#if DEBUG
class daObj_GrA_HIO_c;
#define OBJ_GRA_HIO_CLASS daObj_GrA_HIO_c
#else
class daObj_GrA_Param_c;
#define OBJ_GRA_HIO_CLASS daObj_GrA_Param_c
#endif
/**
* @ingroup actors-objects
* @class daObj_GrA_c
@ -12,75 +80,6 @@
* @details
*
*/
class daObj_GrA_Param_c {
public:
/* 80C04B1C */ virtual ~daObj_GrA_Param_c() {}
struct Data {
/* 0x00 */ f32 field_0x00;
/* 0x04 */ f32 mGravity;
/* 0x08 */ f32 field_0x08;
/* 0x0C */ f32 field_0x0c;
/* 0x10 */ s16 field_0x10;
/* 0x12 */ s16 field_0x12;
/* 0x14 */ f32 field_0x14;
/* 0x18 */ f32 mWallR;
/* 0x1C */ f32 mWallH;
/* 0x20 */ f32 mWeight;
/* 0x24 */ f32 field_0x24;
/* 0x28 */ f32 field_0x28;
/* 0x2C */ f32 field_0x2c;
/* 0x30 */ f32 field_0x30;
/* 0x34 */ f32 field_0x34;
/* 0x38 */ f32 field_0x38;
/* 0x3C */ f32 field_0x3c;
/* 0x40 */ f32 field_0x40;
/* 0x44 */ f32 field_0x44;
/* 0x48 */ f32 field_0x48;
/* 0x4C */ f32 field_0x4c;
/* 0x50 */ f32 field_0x50;
/* 0x54 */ s16 field_0x54;
/* 0x56 */ s16 field_0x56;
/* 0x58 */ s16 field_0x58;
/* 0x5A */ s16 field_0x5a;
/* 0x5C */ s16 field_0x5c;
/* 0x5E */ s16 field_0x5e;
/* 0x60 */ f32 field_0x60;
/* 0x64 */ f32 field_0x64;
/* 0x68 */ s16 field_0x68;
/* 0x6A */ s16 field_0x6a;
/* 0x6C */ f32 field_0x6c;
/* 0x70 */ f32 field_0x70;
/* 0x74 */ f32 field_0x74;
/* 0x78 */ f32 field_0x78;
/* 0x7C */ f32 field_0x7c;
/* 0x80 */ f32 field_0x80;
/* 0x84 */ f32 field_0x84;
/* 0x88 */ s16 field_0x88;
/* 0x8A */ s16 field_0x8a;
/* 0x8C */ f32 field_0x8c;
/* 0x90 */ f32 field_0x90;
/* 0x94 */ f32 field_0x94;
/* 0x98 */ s16 field_0x98;
/* 0x9A */ s16 field_0x9a;
/* 0x9C */ f32 field_0x9c;
/* 0xA0 */ f32 field_0xa0;
/* 0xA4 */ s16 field_0xa4;
/* 0xA6 */ s16 field_0xa6;
/* 0xA8 */ f32 field_0xa8;
/* 0xAC */ s16 field_0xac;
/* 0xAE */ s16 field_0xae;
/* 0xB0 */ s16 field_0xb0;
/* 0xB2 */ s16 field_0xb2;
/* 0xB4 */ s16 field_0xb4;
/* 0xB6 */ s16 field_0xb6;
/* 0xB8 */ f32 field_0xb8;
/* 0xBC */ f32 field_0xbc;
};
static const Data m;
};
class daObj_GrA_c : public daBaseNpc_moveBgActor_c {
public:
typedef int (daObj_GrA_c::*MotionFunc)(int);
@ -237,14 +236,15 @@ public:
static MotionFunc mBaseMotionList[22];
static MotionFunc mFaceMotionList[14];
bool isFirstGra() { return field_0x1fe8 == 0; }
bool isFirstGra() { return isFisrtGra(); }
bool isFisrtGra() { return field_0x1fe8 == 0; }
void setDemoMode(s16 mDemoMode) { mDemoCamMode = mDemoMode; }
s16 getDemoMode() { return mDemoCamMode; }
private:
/* 0x0A48 */ u16 field_0xa48;
/* 0x0A4C */ daObj_GrA_Param_c* field_0xa4c;
/* 0x0A4C */ OBJ_GRA_HIO_CLASS* mpHIO;
/* 0x0A50 */ Process field_0xa50;
/* 0x0A5C */ request_of_phase_process_class mPhases[4];
/* 0x0A7C */ u16 field_0xa7c;

View File

@ -241,7 +241,7 @@ static void bg_fix(obj_gm_class* i_this) {
}
if ((i_this->field_0xae4 & 4) != 0) {
i_this->field_0xae4 &= -5;
i_this->field_0xae4 &= (s8) -5;
i_this->field_0x630 = TREG_F(14) + 10.0f;
i_this->field_0x648 = TREG_F(16) + 5000.0f;
}
@ -255,7 +255,7 @@ static void bg_fix(obj_gm_class* i_this) {
}
if ((i_this->field_0xae4 & 1) != 0) {
i_this->field_0xae4 &= ~1;
i_this->field_0xae4 &= (s8) ~1;
i_this->mAction = 1;
i_this->mActionMode = 0;
}
@ -264,7 +264,7 @@ static void bg_fix(obj_gm_class* i_this) {
if (i_this->mType >= 5) {
fopAcM_delete(a_this);
} else {
i_this->field_0xae4 &= ~2;
i_this->field_0xae4 &= (s8) ~2;
i_this->mAction = 2;
i_this->mActionMode = 0;

View File

@ -15,31 +15,113 @@
#ifdef DEBUG
#include "d/d_debug_viewer.h"
#endif
#include "dol2asm.h"
#include "d/d_msg_object.h"
#include "d/d_attention.h"
#include "f_op/f_op_camera_mng.h"
#include <cmath.h>
/* 80BFFF0C-80BFFF58 0000EC 004C+00 2/2 0/0 0/0 .text jointCtrlCallBack__FP8J3DJointi */
static int jointCtrlCallBack(J3DJoint* i_joint, int param_2) {
if (param_2 == 0) {
J3DModel* model = j3dSys.getModel();
daObj_GrA_c* i_this = (daObj_GrA_c*)model->getUserArea();
if (i_this != NULL) {
i_this->jointCtrl(i_joint, model);
}
class daObj_GrA_Param_c {
public:
/* 80C04B1C */ virtual ~daObj_GrA_Param_c() {}
static const daObj_GrA_HIO_Param_c m;
};
#if DEBUG
class daObj_GrA_HIO_c : public fOpAcm_HIO_entry_c {
public:
daObj_GrA_HIO_c() {
m = daObj_GrA_Param_c::m;
}
return 1;
}
void genMessage(JORMContext* ctext) {
// featured offset
ctext->genSlider("注目オフセット ", &m.field_0x00, 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// gravity
ctext->genSlider("重力 ", &m.mGravity, -99.0f, 99.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// scale
ctext->genSlider("スケ-ル ", &m.field_0x08, 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// interpolated frames
ctext->genSlider("補間フレ-ム ", &m.field_0x0c, 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// height
ctext->genSlider("高さ ", &m.field_0x14, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// knee-length
ctext->genSlider("ひざ丈 ", &m.mWallR, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// width
ctext->genSlider("", &m.mWallH, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// weight
ctext->genSlider("体重 ", &m.mWeight, 0.0f, 255.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// back upper x angle
ctext->genSlider("背のX角上限 ", &m.field_0x24, -90.0f, 90.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// back lower x angle
ctext->genSlider("背のX角下限 ", &m.field_0x28, -90.0f, 90.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// back upper y angle
ctext->genSlider("背のY角上限 ", &m.field_0x2c, -180.0f, 179.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// --- TODO ---
ctext->genSlider("", &m.field_0x30, -180.0f, 179.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x34, -90.0f, 90.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x38, -90.0f, 90.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x3c, -180.0f, 179.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x40, -180.0f, 179.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x44, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x48, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x4c, 0.0f, 180.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x50, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x54, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x56, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x58, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x5a, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x5c, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x60, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x64, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x68, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// Goron Soldier Guard
ctext->genLabel("\n-----------------------【見張りゴロン兵】", 0, 0, NULL, -1, -1, 0x200, 0x18);
ctext->genSlider("", &m.field_0x70, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x74, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x84, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0xa8, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x78, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x9c, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0x9a, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// Rolling attack start demo parameters
ctext->genLabel("\n○転がり攻撃開始デモ用パラメータ", 0, 0, NULL, -1, -1, 0x200, 0x18);
ctext->genSlider("", &m.field_0xac, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0xae, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0xb0, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0xb2, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0xb4, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0xb8, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genSlider("", &m.field_0xbc, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// Goron Regular Soldier
ctext->genLabel("\n-----------------------【ゴロン一般兵】", 0, 0, NULL, -1, -1, 0x200, 0x18);
// search radius (10)
ctext->genSlider("サ-チ半径(10) ", &m.field_0x6c, 0.0f, 9999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// turning speed
ctext->genSlider("旋回速度 ", &m.field_0x88, 0, 0x4000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// walking speed
ctext->genSlider("歩く速度 ", &m.field_0x90, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// punch start distance
ctext->genSlider("パンチ開始距離 ", &m.field_0x94, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// post attack wait time
ctext->genSlider("攻撃後待ち時間 ", &m.field_0x98, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// attack hand radius
ctext->genSlider("攻撃時の手の半径", &m.field_0x8c, 0.0f, 999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
// return speed
ctext->genSlider("戻る速度 ", &m.field_0xa0, 0.0f, 9999.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24);
ctext->genLabel("\n", 0, 0, NULL, -1, -1, 0x200, 0x18);
// debug draw ON
ctext->genCheckBox("デバグ描画ON ", &m.field_0x8a, true, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
// Export File
ctext->genButton("ファイル書き出し", 0x40000002, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
}
/* 80BFFF58-80BFFF70 000138 0018+00 1/1 0/0 0/0 .text rideCallBack__11daObj_GrA_cFP4dBgWP10fopAc_ac_cP10fopAc_ac_c */
void daObj_GrA_c::rideCallBack(dBgW* param_1, fopAc_ac_c* aActor_p, fopAc_ac_c* param_3) {
((daObj_GrA_c*)aActor_p)->field_0x10c4 = fopAcM_GetProfName(param_3) == PROC_ALINK;
}
void listenPropertyEvent(const JORPropertyEvent*) {
// TODO
}
#if VERSION != VERSION_SHIELD_DEBUG
daObj_GrA_HIO_Param_c m;
};
#endif
/* 80C0FE88-80C0FE98 -00001 0010+00 1/1 0/0 0/0 .data l_resFileNameList */
@ -138,6 +220,26 @@ static u16 l_entryJntNoList[4] = {
5, 6, 7, -1,
};
/* 80BFFF0C-80BFFF58 0000EC 004C+00 2/2 0/0 0/0 .text jointCtrlCallBack__FP8J3DJointi */
static int jointCtrlCallBack(J3DJoint* i_joint, int param_2) {
if (param_2 == 0) {
J3DModel* model = j3dSys.getModel();
daObj_GrA_c* i_this = (daObj_GrA_c*)model->getUserArea();
if (i_this != NULL) {
i_this->jointCtrl(i_joint, model);
}
}
return 1;
}
/* 80BFFF58-80BFFF70 000138 0018+00 1/1 0/0 0/0 .text rideCallBack__11daObj_GrA_cFP4dBgWP10fopAc_ac_cP10fopAc_ac_c */
void daObj_GrA_c::rideCallBack(dBgW* param_1, fopAc_ac_c* actor_p, fopAc_ac_c* param_3) {
daObj_GrA_c* aActor_p = (daObj_GrA_c*) actor_p;
JUT_ASSERT(684, NULL != aActor_p);
aActor_p->field_0x10c4 = fopAcM_GetProfName(param_3) == PROC_ALINK;
}
/* 80BFFF70-80C0011C 000150 01AC+00 1/1 0/0 0/0 .text __ct__11daObj_GrA_cFv */
daObj_GrA_c::daObj_GrA_c() {}
@ -153,10 +255,17 @@ daObj_GrA_c::~daObj_GrA_c() {
}
if (mpBgw != NULL && mpBgw->ChkUsed()) {
if (dComIfG_Bgsp().Release(mpBgw)) {
bool rel_ret = dComIfG_Bgsp().Release(mpBgw);
if (rel_ret) {
OS_REPORT("Release Error\n");
}
}
#if DEBUG
if (mpHIO != NULL) {
mpHIO->removeHIO(this);
}
#endif
}
/* 80C003CC-80C00614 0005AC 0248+00 1/1 0/0 0/0 .text create__11daObj_GrA_cFv */
@ -214,13 +323,12 @@ cPhs__Step daObj_GrA_c::create() {
}
/* 80C0FA7C-80C0FB3C 000000 00C0+00 54/54 0/0 0/0 .rodata m__17daObj_GrA_Param_c */
daObj_GrA_Param_c::Data const daObj_GrA_Param_c::m = {
daObj_GrA_HIO_Param_c const daObj_GrA_Param_c::m = {
85.0f,
-4.0f,
1.0f,
12.0f,
1,
0,
280.0f,
40.0f,
100.0f,
@ -242,11 +350,9 @@ daObj_GrA_Param_c::Data const daObj_GrA_Param_c::m = {
60,
4,
30,
0,
140.0f,
150.0f,
100,
0,
100.0f,
15.0f,
20.0f,
@ -261,50 +367,40 @@ daObj_GrA_Param_c::Data const daObj_GrA_Param_c::m = {
230.0f,
60,
1,
0.0f,
0,
25.0f,
100,
0,
0.5f,
10,
10,
30,
40,
20,
0,
60.0f,
30.0f,
};
/* 80C0FB3C-80C0FB8C 0000C0 0050+00 0/0 0/0 0/0 .rodata l_bgcParam */
#pragma push
#pragma force_active on
SECTION_RODATA static u8 const l_bgcParam[80] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xBF, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00,
0x3F, 0x00, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00,
0x3F, 0x00, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00,
0xBF, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00,
static const f32 l_bgcParam[20] = {
0.0f, 0.0f, 0.0f, 0.0f,
-0.5f, 1.0f, -0.5f, 1.0f,
0.5f, -1.0f, -0.5f, 1.0f,
0.5f, -1.0f, 0.5f, -1.0f,
-0.5f, 1.0f, 0.5f, -1.0f,
};
COMPILER_STRIP_GATE(0x80C0FB3C, &l_bgcParam);
#pragma pop
/* 80C0FB8C-80C0FB94 000110 0008+00 0/0 0/0 0/0 .rodata l_dirToAngleTBL */
#pragma push
#pragma force_active on
SECTION_RODATA static u8 const l_dirToAngleTBL[8] = {
0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0xC0, 0x00,
};
COMPILER_STRIP_GATE(0x80C0FB8C, &l_dirToAngleTBL);
#pragma pop
const s16 l_dirToAngleTBL[4] = {0, 0x4000, 0x8000, 0xC000};
/* 80C00614-80C00790 0007F4 017C+00 1/0 0/0 0/0 .text CreateHeap__11daObj_GrA_cFv */
int daObj_GrA_c::CreateHeap() {
J3DModelData* aMdlData_p = NULL;
field_0x844 = dKy_darkworld_check();
J3DModelData* aMdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNames[l_bmdGetParamList[1]], l_bmdGetParamList[0]);
aMdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNames[l_bmdGetParamList[1]], l_bmdGetParamList[0]);
JUT_ASSERT(854, NULL != aMdlData_p);
mpModelMorf = new mDoExt_McaMorfSO(aMdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, 0x80000, 0x11020284);
u32 reg_r25 = 0x11020284;
mpModelMorf = new mDoExt_McaMorfSO(aMdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, 0x80000, reg_r25);
if (mpModelMorf != NULL && mpModelMorf->getModel() == NULL) {
mpModelMorf->stopZelAnime();
mpModelMorf = NULL;
@ -329,6 +425,7 @@ int daObj_GrA_c::CreateHeap() {
/* 80C00790-80C00804 000970 0074+00 1/0 0/0 0/0 .text Delete__11daObj_GrA_cFv */
int daObj_GrA_c::Delete() {
fopAcM_RegisterDeleteID(this, "OBJ_GRA");
if (dComIfGp_getVibration().CheckQuake()) {
dComIfGp_getVibration().StopQuake(31);
}
@ -409,9 +506,9 @@ int daObj_GrA_c::jointCtrl(J3DJoint* i_joint, J3DModel* param_2) {
spb4.set(MStack_78[0][3], MStack_78[1][3], MStack_78[2][3]);
MStack_78[0][3] = MStack_78[1][3] = MStack_78[2][3] = 0.0f;
mDoMtx_stack_c::ZXYrotS(shape_angle);
field_0x9c2.x = field_0x9c8.x * daObj_GrA_Param_c::m.field_0x44;
field_0x9c2.y = field_0x9c8.y * daObj_GrA_Param_c::m.field_0x44;
field_0x9c2.z = field_0x9c8.z * daObj_GrA_Param_c::m.field_0x44;
field_0x9c2.x = field_0x9c8.x * mpHIO->m.field_0x44;
field_0x9c2.y = field_0x9c8.y * mpHIO->m.field_0x44;
field_0x9c2.z = field_0x9c8.z * mpHIO->m.field_0x44;
switch (jointNo) {
case 1:
@ -550,7 +647,7 @@ void daObj_GrA_c::restart() {
setProcess(&daObj_GrA_c::wait);
field_0xa94 = 0.0f;
field_0xa98 = 0.0f;
health = daObj_GrA_Param_c::m.field_0x10;
health = mpHIO->m.field_0x10;
ppMoveInit();
field_0x1fbc = ~field_0x109c;
field_0xaac = 0;
@ -581,7 +678,7 @@ void daObj_GrA_c::restart() {
field_0x2032 = 0;
mGraMode = 0;
setBaseMotion(0, daObj_GrA_Param_c::m.field_0x0c);
setBaseMotion(0, mpHIO->m.field_0x0c);
setFaceMotion(0, -1.0f);
field_0x204c.entry(NULL);
field_0x209c = 0;
@ -591,20 +688,24 @@ void daObj_GrA_c::restart() {
static cXyz l_centerOfst(0.0f, 67.0f, 26.0f);
/* 80C10904-80C10908 00006C 0004+00 1/2 0/0 0/0 .bss l_HIO */
static daObj_GrA_Param_c l_HIO;
static OBJ_GRA_HIO_CLASS l_HIO;
/* 80C010D4-80C013B0 0012B4 02DC+00 1/1 0/0 0/0 .text init__11daObj_GrA_cFv */
int daObj_GrA_c::init() {
fopAcM_SetMtx(this, mpModelMorf->getModel()->getBaseTRMtx());
mSound.init(&current.pos, &eyePos, 3, 1);
eventInfo.setArchiveName((char*)getResName());
field_0xa4c = &l_HIO;
attention_info.distances[4] = 40;
attention_info.distances[2] = 22;
mAcchCir.SetWall(daObj_GrA_Param_c::m.mWallH, daObj_GrA_Param_c::m.mWallR);
mpHIO = &l_HIO;
#if DEBUG
// "Goron"
mpHIO->entryHIO("ゴロン");
#endif
attention_info.distances[fopAc_attn_CARRY_e] = 40;
attention_info.distances[fopAc_attn_BATTLE_e] = 22;
mAcchCir.SetWall(mpHIO->m.mWallH, mpHIO->m.mWallR);
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir,
fopAcM_GetSpeed_p(this), fopAcM_GetAngle_p(this), fopAcM_GetShapeAngle_p(this));
mCcStts.Init(daObj_GrA_Param_c::m.mWeight, 0, this);
mCcStts.Init(mpHIO->m.mWeight, 0, this);
field_0xf50.Set(mCcDCyl);
field_0xf50.SetStts(&mCcStts);
field_0xce0[0].Set(mCcDSph);
@ -833,7 +934,7 @@ void daObj_GrA_c::setFaceMotion(int param_1, f32 param_2) {
field_0xa8e = 1;
if (param_2 < 0.0f) {
field_0xa98 = daObj_GrA_Param_c::m.field_0x0c;
field_0xa98 = mpHIO->m.field_0x0c;
return;
}
@ -919,28 +1020,33 @@ void daObj_GrA_c::setParam() {
}
}
scale.set(daObj_GrA_Param_c::m.field_0x08, daObj_GrA_Param_c::m.field_0x08, daObj_GrA_Param_c::m.field_0x08);
mCcStts.SetWeight(daObj_GrA_Param_c::m.mWeight);
gravity = daObj_GrA_Param_c::m.mGravity;
scale.set(mpHIO->m.field_0x08, mpHIO->m.field_0x08, mpHIO->m.field_0x08);
mCcStts.SetWeight(mpHIO->m.mWeight);
gravity = mpHIO->m.mGravity;
}
/* 80C01C18-80C01D7C 001DF8 0164+00 1/1 0/0 0/0 .text checkEvent__11daObj_GrA_cFv */
BOOL daObj_GrA_c::checkEvent() {
BOOL rv = TRUE;
// TODO: fake match to force reuse of pointer
#if VERSION != VERSION_SHIELD_DEBUG
// TODO: gameInfo fake match to force reuse of pointer
dComIfG_play_c* play = &g_dComIfG_gameInfo.play;
#endif
if (dComIfGp_event_runCheck()) {
rv = FALSE;
if (eventInfo.checkCommandTalk()) {
if (checkProcess(&daObj_GrA_c::talk)) {
rv = (this->*field_0xa50)(NULL);
} else if (!g_dComIfG_gameInfo.play.mEvent.chkTalkXY() || dComIfGp_evmng_ChkPresentEnd()) {
// FIXME: Condition uses fakematch to get GCN to match...
} else if (dComIfGp_event_chkTalkXY() == FALSE || dComIfGp_evmng_ChkPresentEnd()) {
setProcess(&daObj_GrA_c::talk);
}
} else if (eventInfo.checkCommandDemoAccrpt()) {
if (dComIfGp_getEventManager().endCheck(mEvtIdx) != 0) {
#if VERSION != VERSION_SHIELD_DEBUG
play->getEvent().reset();
#else
dComIfGp_event_reset();
#endif
field_0x1520 = 0;
mEvtIdx = -1;
rv = TRUE;
@ -1021,7 +1127,7 @@ void daObj_GrA_c::setMtx(int param_1) {
}
if (field_0x109c != 0) {
cXyz sp30(l_centerOfst);
cXyz sp30(l_centerOfst.x, l_centerOfst.y, l_centerOfst.z);
mDoMtx_stack_c::transS(0.0f, 0.0f, 0.0f);
mDoMtx_stack_c::ZXYrotM(field_0x91a);
sp30.x += aTrembleTrans[field_0x10a0 % 15].x;
@ -1059,7 +1165,7 @@ void daObj_GrA_c::setMtx(int param_1) {
model->setUserArea(0);
}
if (cLib_checkBit<u16>(field_0x840, 0x20) != 0) {
if (cLib_checkBit<u16>(u16(field_0x840), 0x20) != 0) {
mBck.getBckAnm()->setFrame(mBck.getFrame());
mpModelMorf->modelCalc();
} else {
@ -1108,13 +1214,13 @@ void daObj_GrA_c::setCollisions() {
if (field_0xa90 == 10 || field_0xa90 == 4) {
field_0xf50.SetH(200.0f);
} else {
field_0xf50.SetH(daObj_GrA_Param_c::m.field_0x14);
field_0xf50.SetH(mpHIO->m.field_0x14);
}
field_0xf50.SetR(daObj_GrA_Param_c::m.mWallH);
field_0xf50.SetR(mpHIO->m.mWallH);
if (field_0xf50.ChkAtSet()) {
field_0xf50.SetR(daObj_GrA_Param_c::m.mWallH + 40.0f);
field_0xf50.SetR(mpHIO->m.mWallH + 40.0f);
}
if (cLib_calcTimer(&field_0x1fd8) == 0) {
@ -1131,14 +1237,14 @@ void daObj_GrA_c::setCollisions() {
mDoMtx_stack_c::scaleM(scale);
mDoMtx_stack_c::multVecZero(&sp1c);
field_0xce0[1].SetC(sp1c);
field_0xce0[1].SetR(daObj_GrA_Param_c::m.field_0x8c);
field_0xce0[1].SetR(mpHIO->m.field_0x8c);
dComIfG_Ccsp()->Set(&field_0xce0[1]);
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(17));
mDoMtx_stack_c::scaleM(scale);
mDoMtx_stack_c::multVecZero(&sp1c);
field_0xce0[0].SetC(sp1c);
field_0xce0[0].SetR(daObj_GrA_Param_c::m.field_0x8c);
field_0xce0[0].SetR(mpHIO->m.field_0x8c);
dComIfG_Ccsp()->Set(&field_0xce0[0]);
}
}
@ -1154,9 +1260,21 @@ void daObj_GrA_c::setAttnPos() {
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(4));
mDoMtx_stack_c::multVec(&aEyeOfst, &eyePos);
mDoMtx_stack_c::multVecZero(&sp18);
attention_info.position.set(sp18.x, sp18.y + daObj_GrA_Param_c::m.field_0x00, sp18.z);
attention_info.position.set(sp18.x, sp18.y + mpHIO->m.field_0x00, sp18.z);
}
#if DEBUG
static s16 dummy_lit_124881(int sel) {
const s16 arr[2] = {0x00C8, 0x0040};
return arr[sel];
}
static s16 dummy_lit_124886(int sel) {
const s16 arr[2] = {0x8000, 0x00A0};
return arr[sel];
}
#endif
/* 80C02A5C-80C02A60 002C3C 0004+00 1/0 0/0 0/0 .text drawOtherMdls__11daObj_GrA_cFv */
void daObj_GrA_c::drawOtherMdls() {
/* empty function */
@ -1234,13 +1352,13 @@ int daObj_GrA_c::lookat() {
csXyz acStack_60[4];
csXyz acStack_78[4];
acStack_60[0].set(cM_deg2s(-daObj_GrA_Param_c::m.field_0x28) - 0x4000, cM_deg2s(daObj_GrA_Param_c::m.field_0x2c), 0);
acStack_60[0].set(cM_deg2s(-mpHIO->m.field_0x28) - 0x4000, cM_deg2s(mpHIO->m.field_0x2c), 0);
acStack_60[1].set(-0x4000, 0, 0);
acStack_60[2].set(cM_deg2s(-daObj_GrA_Param_c::m.field_0x38), cM_deg2s(daObj_GrA_Param_c::m.field_0x3c), 0);
acStack_60[2].set(cM_deg2s(-mpHIO->m.field_0x38), cM_deg2s(mpHIO->m.field_0x3c), 0);
acStack_60[3].set(0, 0, 0);
acStack_78[0].set(cM_deg2s(-daObj_GrA_Param_c::m.field_0x24) - 0x4000, cM_deg2s(daObj_GrA_Param_c::m.field_0x30), 0);
acStack_78[0].set(cM_deg2s(-mpHIO->m.field_0x24) - 0x4000, cM_deg2s(mpHIO->m.field_0x30), 0);
acStack_78[1].set(-0x4000, 0, 0);
acStack_78[2].set(cM_deg2s(-daObj_GrA_Param_c::m.field_0x34), cM_deg2s(daObj_GrA_Param_c::m.field_0x40), 0);
acStack_78[2].set(cM_deg2s(-mpHIO->m.field_0x34), cM_deg2s(mpHIO->m.field_0x40), 0);
acStack_78[3].set(0, 0, 0);
cXyz sp48[4];
@ -1322,7 +1440,7 @@ int daObj_GrA_c::hitChk() {
field_0xab0.entry(field_0xf50.GetTgHitAc());
if (field_0x1528.field_0xa18 != 0) {
field_0xaa4 = daObj_GrA_Param_c::m.field_0x54;
field_0xaa4 = mpHIO->m.field_0x54;
def_se_set(&mSound, field_0xf50.GetTgHitObj(), 0x2C, NULL);
setProcess(&daObj_GrA_c::rollReturn);
health = 0;
@ -1351,13 +1469,13 @@ int daObj_GrA_c::wait(void* param_1) {
switch (mMode) {
case 0:
setBaseMotion(0, daObj_GrA_Param_c::m.field_0x0c);
setBaseMotion(0, mpHIO->m.field_0x0c);
setFaceMotion(0, -1.0f);
setProcess(&daObj_GrA_c::standWait);
break;
case 1:
setBaseMotion(0, daObj_GrA_Param_c::m.field_0x0c);
setBaseMotion(0, mpHIO->m.field_0x0c);
setFaceMotion(0, -1.0f);
setProcess(&daObj_GrA_c::standWaitJump);
setLookMode(1);
@ -1400,7 +1518,7 @@ int daObj_GrA_c::talk(void* param_1) {
if (sVar1 != field_0x91a.y) {
if (field_0x1fcc < 2) {
if (turn_step(sVar1, 0, 19, 20)) {
setBaseMotion(0, daObj_GrA_Param_c::m.field_0x0c);
setBaseMotion(0, mpHIO->m.field_0x0c);
setFaceMotion(0, -1.0f);
}
@ -1434,7 +1552,7 @@ int daObj_GrA_c::talk(void* param_1) {
iVar3 = field_0xaa0;
if (ctrlMsgAnm(iVar1, iVar2, this) != 0) {
if (iVar2 != -1) {
setBaseMotion(l_eventMotionChangeTable[iVar2], daObj_GrA_Param_c::m.field_0x0c);
setBaseMotion(l_eventMotionChangeTable[iVar2], mpHIO->m.field_0x0c);
}
if (iVar1 != -1) {
@ -1617,6 +1735,7 @@ int daObj_GrA_c::setPrtcl() {
}
#include "d/actor/d_a_obj_gra2_soldier.inc"
#include "d/actor/d_a_obj_gra2_base.inc"
/* 80C03B14-80C03B48 003CF4 0034+00 1/0 0/0 0/0 .text base000__11daObj_GrA_cFi */
int daObj_GrA_c::base000(int param_1) {
@ -1641,7 +1760,7 @@ int daObj_GrA_c::base003(int param_1) {
if (param_1 != 0) {
setBaseAnm(4, field_0xa94);
} else if (mpModelMorf->isStop()) {
setBaseMotion(0, daObj_GrA_Param_c::m.field_0x0c);
setBaseMotion(0, mpHIO->m.field_0x0c);
setBaseAnm(0, field_0xa94);
}
@ -1653,7 +1772,7 @@ int daObj_GrA_c::base004(int param_1) {
if (param_1 != 0) {
setBaseAnm(5, field_0xa94);
} else if (mpModelMorf->isStop()) {
setBaseMotion(0, daObj_GrA_Param_c::m.field_0x0c);
setBaseMotion(0, mpHIO->m.field_0x0c);
setBaseAnm(0, field_0xa94);
}
@ -1994,7 +2113,8 @@ int daObj_GrA_c::face017(int param_1) {
/* 80C048B8-80C048F8 004A98 0040+00 1/0 0/0 0/0 .text face999__11daObj_GrA_cFi */
int daObj_GrA_c::face999(int param_1) {
if (param_1 != 0) {
cLib_offBit<u16>(field_0x840, 0x22);
int reg_r30 = 0x22;
cLib_offBit<u16>(field_0x840, reg_r30);
setFaceBtp(0);
}
@ -2017,7 +2137,7 @@ int daObj_GrA_c::evtcutTalk(int param_1, int param_2) {
int iVar3 = field_0xaa0;
if (ctrlMsgAnm(iVar1, iVar2, this) != 0) {
if (iVar2 != -1) {
setBaseMotion(l_eventMotionChangeTable[iVar2], daObj_GrA_Param_c::m.field_0x0c);
setBaseMotion(l_eventMotionChangeTable[iVar2], mpHIO->m.field_0x0c);
}
if (iVar1 != -1) {
@ -2036,44 +2156,40 @@ int daObj_GrA_c::evtcutTalk(int param_1, int param_2) {
void daObj_GrA_c::setFaceTalkAfter() {
switch (field_0xa92) {
case 6:
setFaceMotion(4, daObj_GrA_Param_c::m.field_0x0c);
setFaceMotion(4, mpHIO->m.field_0x0c);
break;
case 7:
setFaceMotion(5, daObj_GrA_Param_c::m.field_0x0c);
setFaceMotion(5, mpHIO->m.field_0x0c);
break;
default:
setFaceMotion(0, daObj_GrA_Param_c::m.field_0x0c);
setFaceMotion(0, mpHIO->m.field_0x0c);
}
}
/* 80C04A88-80C04AA8 004C68 0020+00 1/0 0/0 0/0 .text daObj_GrA_Create__FPv */
static int daObj_GrA_Create(void* param_1) {
daObj_GrA_c* i_this = (daObj_GrA_c*)param_1;
return i_this->create();
static int daObj_GrA_Create(void* i_this) {
return ((daObj_GrA_c*)i_this)->create();
}
/* 80C04AA8-80C04AC8 004C88 0020+00 1/0 0/0 0/0 .text daObj_GrA_Delete__FPv */
static int daObj_GrA_Delete(void* param_1) {
daObj_GrA_c* i_this = (daObj_GrA_c*)param_1;
return i_this->MoveBGDelete();
static int daObj_GrA_Delete(void* i_this) {
return ((daObj_GrA_c*)i_this)->MoveBGDelete();
}
/* 80C04AC8-80C04AE8 004CA8 0020+00 1/0 0/0 0/0 .text daObj_GrA_Execute__FPv */
static int daObj_GrA_Execute(void* param_1) {
daObj_GrA_c* i_this = (daObj_GrA_c*)param_1;
return i_this->MoveBGExecute();
static int daObj_GrA_Execute(void* i_this) {
return ((daObj_GrA_c*)i_this)->MoveBGExecute();
}
/* 80C04AE8-80C04B14 004CC8 002C+00 1/0 0/0 0/0 .text daObj_GrA_Draw__FPv */
static int daObj_GrA_Draw(void* param_1) {
daObj_GrA_c* i_this = (daObj_GrA_c*)param_1;
return i_this->Draw();
static int daObj_GrA_Draw(void* i_this) {
return ((daObj_GrA_c*)i_this)->MoveBGDraw();
}
/* 80C04B14-80C04B1C 004CF4 0008+00 1/0 0/0 0/0 .text daObj_GrA_IsDelete__FPv */
static int daObj_GrA_IsDelete(void* param_1) {
static int daObj_GrA_IsDelete(void* i_this) {
return 1;
}

View File

@ -0,0 +1,682 @@
// NOTE: This filename is a complete conjecture.
#include "d/actor/d_a_obj_gra2.h"
/* 80C0CF2C-80C0CF98 00D10C 006C+00 1/1 0/0 0/0 .text s_sub2__FPvPv */
static void* s_sub2(void* i_actor, void* i_data) {
daObj_GrA_c* i_this = (daObj_GrA_c*)i_data;
if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_OBJ_GRA && (u8)i_this->checkGraSub((fopAc_ac_c*)i_actor)) {
return i_actor;
}
return NULL;
}
/* 80C0CF98-80C0D000 00D178 0068+00 1/1 0/0 0/0 .text checkGraSub__11daObj_GrA_cFP10fopAc_ac_c */
BOOL daObj_GrA_c::checkGraSub(fopAc_ac_c* a_this) {
daObj_GrA_c* i_this = (daObj_GrA_c*)a_this;
if (i_this->mMode != 0) {
return FALSE;
}
if (getTagNo() == i_this->getTagNo()) {
return TRUE;
}
return FALSE;
}
/* 80C0D000-80C0D2FC 00D1E0 02FC+00 1/0 0/0 0/0 .text waitDemo__11daObj_GrA_cFPv */
int daObj_GrA_c::waitDemo(void* param_1) {
cXyz sp34;
daPy_py_c* player = daPy_getPlayerActorClass();
switch (field_0xa7c) {
case 0:
setBaseMotion(0, mpHIO->m.field_0x0c);
setFaceMotion(13, -1.0f);
setLookMode(0);
break;
case 1:
if (getTagNo() != 0) {
bool has_actor = field_0x204c.getActor() == NULL;
if (field_0x2032 == 0 || has_actor) {
if (field_0x2032 == 0) {
fopAc_ac_c* actor_p = (fopAc_ac_c*) fpcM_Search(s_sub, this);
if (actor_p != NULL) {
daTagGra_c* graTag_p = (daTagGra_c*) actor_p;
if (graTag_p->getMode() == 2) {
mGraPos = graTag_p->getGraPos();
mGraExtent = graTag_p->getGraExtent();
mGraHeight = graTag_p->getGraHeight();
mGraMode = graTag_p->getMode();
field_0x2032 = 1;
fopAcM_delete(actor_p);
}
}
}
if (has_actor) {
fopAc_ac_c* o_actor_p = (fopAc_ac_c*)fpcM_Search(s_sub2, this);
if (o_actor_p != NULL) {
field_0x204c.entry(o_actor_p);
}
}
} else {
#ifdef DEBUG
if (mpHIO->m.field_0x8a) {
fopAcM_OffStatus(this, fopAcM_STATUS_UNK_0x100);
} else {
fopAcM_OnStatus(this, fopAcM_STATUS_UNK_0x100);
}
#endif
sp34 = player->current.pos - mGraPos;
if (sp34.absXZ() < mGraExtent && sp34.z > -30.0f && sp34.z < mGraHeight) {
setProcess(&daObj_GrA_c::startDemo);
}
}
}
break;
case 2:
#ifdef DEBUG
fopAcM_OnStatus(this, fopAcM_STATUS_UNK_0x100);
#endif
break;
}
return 1;
}
/* 80C0D2FC-80C0D3A8 00D4DC 00AC+00 1/1 0/0 0/0 .text skipDemoGra__11daObj_GrA_cFv */
int daObj_GrA_c::skipDemoGra() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
daObj_GrA_c* gra_p = (daObj_GrA_c*)field_0x204c.getActor();
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
gra_p->soldierDemoSkip();
gra_p->field_0x204c.entry(NULL);
dComIfGs_onSwitch(field_0xa7f, fopAcM_GetRoomNo(this));
return 1;
}
/* 80C0D3A8-80C0D3E0 00D588 0038+00 1/1 0/0 0/0 .text skipCallBack__FPvi */
static int skipCallBack(void* param_1, int param_2) {
daObj_GrA_c* i_this = (daObj_GrA_c*)param_1;
i_this->skipDemoGra();
fopAcM_delete(i_this);
return 1;
}
/* 80C0D3E0-80C0EFC4 00D5C0 1BE4+00 2/0 0/0 0/0 .text startDemo__11daObj_GrA_cFPv */
int daObj_GrA_c::startDemo(void* param_1) {
daPy_py_c* player = daPy_getPlayerActorClass();
daObj_GrA_c* gra_p = (daObj_GrA_c *)field_0x204c.getActor();
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
dCamera_c* camBody = dCam_getBody();
switch (field_0xa7c) {
case 0:
setBaseMotion(0, mpHIO->m.field_0x0c);
setFaceMotion(13, -1.0f);
setLookMode(0);
mDemoCamMode = 1;
field_0x209c = 1;
break;
case 1: {
switch (mDemoCamMode) {
case 0:
break;
case 1: {
if (!eventInfo.checkCommandDemoAccrpt()) {
fopAcM_orderPotentialEvent(this, 2, 0xFFEF, 0);
eventInfo.onCondition(dEvtCnd_CANDEMO_e);
return 1;
}
camera->mCamera.Stop();
mDemoCamMode = 2;
field_0x2056 = 0;
mDemoCamFovy = field_0x208c = camBody->Fovy();
mDemoCamCenter = mGraPos;
mDemoCamCenter.y += 150.0f;
mDemoCamEye = mDemoCamCenter;
mDemoCamEye.z += 700.0f;
mDemoCamCenter.x += 50.0f;
field_0x2080 = mDemoCamCenter;
field_0x2074 = mDemoCamEye;
camera->mCamera.SetTrimSize(2);
player->changeOriginalDemo();
gra_p->field_0x204c.entry(this);
gra_p->setProcess(&daObj_GrA_c::soldierDemo);
fopAcM_OnStatus(gra_p, fopAcM_STATUS_UNK_0x8000);
field_0x2056 = 0;
dComIfGp_getEvent().setSkipProc(this, skipCallBack, 0);
dComIfGp_getEvent().onSkipFade();
}
// fallthrough
case 2: {
cXyz player_pos = player->current.pos;
if ((player_pos - mGraPos).abs() < 50.0f) {
if (field_0x2056 >= 60) {
mDemoCamMode = 3;
field_0x2056 = 0;
} else {
csXyz player_angle = player->current.angle;
s16 tgt_ang = cLib_targetAngleY(&player->current.pos, &current.pos) + 0x800;
cLib_addCalcAngleS2(&player_angle.y, tgt_ang, 2, field_0x1528.field_0xa14);
player->setPlayerPosAndAngle(&player->current.pos, &player_angle);
field_0x2056++;
break;
}
} else {
player->changeDemoMode(3, 0, 0, 0);
player->changeDemoPos0(&mGraPos);
break;
}
}
// fallthrough
case 3: {
if (field_0x2056 >= 180) {
mDemoCamMode = 4;
field_0x2056 = 0;
field_0x2080 = mDemoCamCenter;
field_0x2074 = mDemoCamEye;
} else {
csXyz player_angle = player->current.angle;
s16 sVar1 = cLib_targetAngleY(&player->current.pos, &current.pos) - 0x2800;
cLib_addCalcAngleS2(&player_angle.y, sVar1, 4, field_0x1528.field_0xa14);
player->setPlayerPosAndAngle(&player->current.pos, &player_angle);
mDoMtx_stack_c::YrotS(sVar1);
cXyz sp3c(0.0f, 150.0f, 100.0f);
mDoMtx_stack_c::multVec(&sp3c, &sp3c);
sp3c += player->current.pos;
cLib_addCalcPos2(&mDemoCamEye, sp3c, 0.05f, (field_0x2074 - sp3c).abs() / 40.0f);
mDoMtx_stack_c::YrotS(sVar1);
cXyz sp48(0.0f, 100.0f, 300.0f);
mDoMtx_stack_c::multVec(&sp48, &sp48);
sp48 += player->current.pos;
cLib_addCalcPos2(&mDemoCamCenter, sp48, 0.05f, (sp48 - field_0x2080).abs() / 25.0f);
field_0x2056++;
break;
}
}
// fallthrough
case 4: {
if (field_0x2056 >= 180) {
mDemoCamMode = 5;
field_0x2056 = 0;
field_0x2080 = mDemoCamCenter;
field_0x2074 = mDemoCamEye;
} else {
csXyz player_angle = player->current.angle;
s16 sVar1 = cLib_targetAngleY(&player->current.pos, &current.pos) + 0x800;
cLib_addCalcAngleS2(&player_angle.y, sVar1, 1, field_0x1528.field_0xa14);
player->setPlayerPosAndAngle(&player->current.pos, &player_angle);
mDoMtx_stack_c::YrotS(sVar1);
cXyz sp54(0.0f, 150.0f, 100.0f);
mDoMtx_stack_c::multVec(&sp54, &sp54);
sp54 += player->current.pos;
cLib_addCalcPos2(&mDemoCamEye, sp54, 0.06f, (field_0x2074 - sp54).abs() / 70.0f);
mDoMtx_stack_c::YrotS(sVar1);
cXyz sp60(0.0f, 230.0f, 300.0f);
mDoMtx_stack_c::multVec(&sp60, &sp60);
sp60 += player->current.pos;
cLib_addCalcPos2(&mDemoCamCenter, sp60, 0.06f, (sp60 - field_0x2080).abs() / 70.0f);
if (field_0x2056 == 150) {
setBaseMotion(16, 0.0f);
setFaceMotion(11, 0.0f);
setLookMode(0);
gra_p->setBaseMotion(17, mpHIO->m.field_0x0c);
gra_p->setFaceMotion(12, -1.0f);
gra_p->setLookMode(0);
current.angle.y += (s16) 0x4000;
field_0x91a.y = shape_angle.y = current.angle.y;
}
field_0x2056++;
break;
}
}
// fallthrough
case 5: {
if (field_0x2056 >= 40) {
mDemoCamMode = 6;
field_0x2056 = 0;
} else {
mDoMtx_stack_c::YrotS(cLib_targetAngleY(&player->current.pos, &current.pos));
cXyz sp6c(0.0f, 150.0f, 100.0f);
mDoMtx_stack_c::multVec(&sp6c, &sp6c);
sp6c += player->current.pos;
cLib_addCalcPos2(&mDemoCamEye, sp6c, 0.01f, (field_0x2074 - sp6c).abs() / 60.0f);
cXyz player_pos = current.pos;
player_pos.y += 280.0f;
cLib_addCalcPos2(&mDemoCamCenter, player_pos, 0.5f,
(player_pos - field_0x2080).abs() / (200.0f - field_0x2056 * 3));
field_0x2056++;
break;
}
}
// fallthrough
case 6: {
if (field_0x2056 >= 90) {
mDemoCamMode = 7;
field_0x2056 = 0;
} else {
mDoMtx_stack_c::YrotS(cLib_targetAngleY(&player->current.pos, &current.pos));
cXyz sp84(100.0f, -50.0f, -800.0f);
mDoMtx_stack_c::multVec(&sp84, &sp84);
sp84 += current.pos;
cLib_addCalcPos2(&mDemoCamEye, sp84, 0.5f, (field_0x2074 - sp84).abs() / 35.0f);
cXyz player_pos = current.pos;
player_pos.y += 280.0f;
cLib_addCalcPos2(&mDemoCamCenter, player_pos, 0.35f, (player_pos - field_0x2080).abs() / 20.0f);
field_0x2056++;
break;
}
}
// fallthrough
case 7: {
if (mpModelMorf->isStop()) {
gra_p->setDemoMode(1);
setDemoMode(8);
field_0x2056 = 0;
setBaseMotion(0, mpHIO->m.field_0x0c);
setFaceMotion(13, -1.0f);
setLookMode(2);
}
break;
}
case 8: {
if (gra_p->field_0xa90 != 20 || !gra_p->mpModelMorf->isStop()) break;
setDemoMode(9);
setBaseMotion(1, mpHIO->m.field_0x0c);
setFaceMotion(13, -1.0f);
field_0x2080 = mDemoCamCenter;
}
// fallthrough
case 9: {
cXyz sp9c(0.0f, 0.0f, 80.0f);
mDoMtx_stack_c::YrotS(gra_p->current.angle.y);
mDoMtx_stack_c::multVec(&sp9c, &sp9c);
sp9c += gra_p->current.pos;
if (field_0xa90 != 15) {
if (mAcchCir.ChkWallHit() && gra_p == dComIfG_Bgsp().GetActorPointer(mAcchCir)) {
if (field_0xa90 != 15) {
setBaseMotion(15, mpHIO->m.field_0x0c);
setFaceMotion(13, -1.0f);
setLookMode(0);
current.angle.y = cLib_targetAngleY(&current.pos, &sp9c);
shape_angle.y = current.angle.y;
field_0x91a.y = current.angle.y;
mAcch.SetGrndNone();
mAcch.SetWallNone();
gravity = 0.0f;
speed.setall(0.0f);
speedF = 0.0f;
}
} else {
s16 tgt_ang = cLib_targetAngleY(&current.pos, &sp9c);
cLib_addCalcAngleS2(&current.angle.y, tgt_ang, 4, mpHIO->m.field_0x88);
shape_angle.y = current.angle.y;
field_0x91a.y = current.angle.y;
cLib_chasePosXZ(&current.pos, sp9c, mpHIO->m.field_0x90);
}
} else {
if (!mpModelMorf->isStop()) {
mAcch.SetGrndNone();
mAcch.SetWallNone();
gravity = 0.0f;
} else {
cXyz spa8(0.0f, 146.09f, 161.97f);
mDoMtx_stack_c::YrotS(field_0x91a.y);
mDoMtx_stack_c::multVec(&spa8, &spa8);
current.pos += spa8;
old.pos = current.pos;
gravity = 0.0f;
setLookMode(0);
setDemoMode(10);
gra_p->setDemoMode(3);
setBaseMotion(18, 0.0f);
setFaceMotion(13, 0.0f);
}
cXyz player_pos = gra_p->current.pos;
cLib_addCalcPosXZ2(&mDemoCamCenter, player_pos, 0.1f, (player_pos - field_0x2080).abs() / 30.0f);
break;
}
}
// fallthrough
case 10: {
if (gra_p->getDemoMode() == 4) {
setBaseMotion(10, 6.0f);
setFaceMotion(13, 6.0f);
calcMotion();
mpModelMorf->setPlaySpeed(3.0f);
setDemoMode(11);
mAcch.ClrGrndNone();
mAcch.ClrWallNone();
gravity = mpHIO->m.mGravity;
speedF = 13.0f;
speed.y = 70.0f;
field_0x2056 = 0;
} else {
cLib_addCalcAngleS2(&current.angle.y, gra_p->home.angle.y + 0x8000, 16, mpHIO->m.field_0x88);
shape_angle.y = current.angle.y;
field_0x91a.y = current.angle.y;
cXyz player_pos = gra_p->current.pos;
cLib_addCalcPosXZ2(&mDemoCamCenter, player_pos, 0.1f, (player_pos - field_0x2080).abs() / 30.0f);
gravity = 0.0f;
}
break;
}
case 11: {
if (field_0x2056 >= 250) {
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
fopAcM_OffStatus(gra_p, 0x8000);
gra_p->setProcess(&daObj_GrA_c::wait);
dComIfGs_onSwitch(field_0xa7f, fopAcM_GetRoomNo(this));
fopAcM_delete(this);
break;
}
if (mAcch.ChkGroundLanding()) {
cXyz spcc(0.0f, 0.0f, 20.0f);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(field_0x91a.y);
mDoMtx_stack_c::multVec(&spcc, &field_0xab8[2].field_0x4);
field_0xab8[2].field_0x10 = field_0x91a;
field_0xab8[2].field_0x0 = 1;
mSound.startCreatureSound(Z2SE_GORON_ROLL_BOUND, 0, -1);
speedF = 20.0f;
} else if (mAcch.ChkGroundHit()) {
cXyz spd8(-1482.0f, 3650.0f, -4459.0f);
if ((current.pos - spd8).absXZ() > 50.0f) {
cLib_addCalcAngleS2(&current.angle.y, cLib_targetAngleY(&current.pos, &spd8),
24, mpHIO->m.field_0x88);
shape_angle.y = current.angle.y;
field_0x91a.y = current.angle.y;
} else {
speedF = 0.0f;
}
field_0x2056++;
}
if (speed.y > 0.0f) {
cXyz spe4 = mDemoCamCenter;
mDemoCamEye += (current.pos - spe4);
}
mDemoCamCenter = current.pos;
}
}
break;
}
case 2:
field_0x209c = 0;
break;
default:
break;
}
if (mDemoCamMode != 0) {
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamFovy, 0);
field_0x2056++;
}
return 1;
}
/* 80C0EFC4-80C0F17C 00F1A4 01B8+00 1/1 0/0 0/0 .text turn__11daObj_GrA_cFsfi */
BOOL daObj_GrA_c::turn(s16 param_1, f32 param_2, int param_3) {
int o_prm_1 = param_1;
if (field_0x1fc8 == 0) {
field_0x1fd0 = fabsf(cM_sht2d((s16)(current.angle.y - param_1)));
field_0x1fd0 = field_0x1fd0 / 180.0f * param_2;
field_0x1fd0 = (int)field_0x1fd0 + 1;
if (field_0x1fd0 < 8.0f) {
field_0x1fd0 = 8.0f;
}
field_0x1fd4 = current.angle.y;
}
s16 sVar1 = field_0x1fd4;
if (param_3 == 0) {
param_3 = ((s16) (param_1 - field_0x1fd4) >= 0) ? 1 : -1;
}
int var_r30 = (u16) (o_prm_1 - sVar1);
if (param_3 < 0) {
var_r30 = -(u16)(0xFFFF - var_r30);
}
var_r30 *= cM_ssin(field_0x1fc8);
field_0x1fc8 = field_0x1fc8 + 16384.0f / field_0x1fd0;
if ((u16)field_0x1fc8 >= 0x4000) {
current.angle.y = param_1;
field_0x1fc8 = 0x4000;
} else {
current.angle.y = field_0x1fd4 + var_r30;
}
return param_1 == current.angle.y;
}
/* 80C0F17C-80C0F330 00F35C 01B4+00 2/2 0/0 0/0 .text turn_step__11daObj_GrA_cFsiii */
BOOL daObj_GrA_c::turn_step(s16 param_1, int param_2, int param_3, int param_4) {
if (field_0x1fcc == 0) {
if ((int)fabsf(cM_sht2d((s16)(param_1 - field_0x91a.y))) > 20) {
if (param_2 >= 0 && field_0xa92 != param_2) {
setFaceMotion(param_2, 3.0f);
}
if (param_3 >= 0 && field_0xa90 != param_3) {
setBaseMotion(param_3, 3.0f);
}
}
field_0x1fd6 = param_1;
field_0x1fc8 = 0;
if (field_0x91a.y == field_0x1fd6) {
field_0x1fcc++;
}
current.angle.y = field_0x91a.y;
shape_angle.y = current.angle.y;
field_0x1fcc++;
} else if (field_0x1fcc == 1) {
if (turn(field_0x1fd6, param_4, 0) != 0) {
shape_angle.y = current.angle.y;
field_0x91a.y = current.angle.y;
field_0x1fcc++;
} else {
shape_angle.y = current.angle.y;
field_0x91a.y = current.angle.y;
}
}
return (field_0x1fcc > 1) ? 1 : 0;
}
/* 80C0F330-80C0F590 00F510 0260+00 1/1 0/0 0/0 .text chkFindPlayer2__11daObj_GrA_cFis */
BOOL daObj_GrA_c::chkFindPlayer2(int param_1, s16 param_2) {
cXyz sp80 = getAttentionPos(daPy_getPlayerActorClass());
s16 angle_diff = fopAcM_searchPlayerAngleY(this) - current.angle.y;
int dist_tbl_idx;
if (abs(angle_diff) < 0x3C00) {
dist_tbl_idx = (param_1 == 0) ? getDistTableIdx(10, 6) : getDistTableIdx(12, 6);
} else {
dist_tbl_idx = (param_1 == 0) ? getDistTableIdx(4, 6) : getDistTableIdx(6, 6);
}
f32 fVar1 = (param_1 == 0) ? dComIfGp_getAttention()->getDistTable(dist_tbl_idx).mDistMax
: dComIfGp_getAttention()->getDistTable(dist_tbl_idx).mDistMaxRelease;
f32 fVar2 = dComIfGp_getAttention()->getDistTable(dist_tbl_idx).mLowerY * -1.0f;
f32 fVar3 = dComIfGp_getAttention()->getDistTable(dist_tbl_idx).mUpperY * -1.0f;
u32 uVar2 = dComIfGp_getAttention()->getDistTable(dist_tbl_idx).mAngleSelect;
f32 fVar4 = 180.0f;
if ((uVar2 & 8) != 0) {
fVar4 = 30.0f;
} else if ((uVar2 & 16) != 0) {
fVar4 = 45.0f;
} else if ((uVar2 & 32) != 0) {
fVar4 = 60.0f;
} else if ((uVar2 & 64) != 0) {
fVar4 = 90.0f;
} else if ((uVar2 & 128) != 0) {
fVar4 = 110.0f;
} else if ((uVar2 & 256) != 0) {
fVar4 = 135.0f;
}
if (chkPointInArea(sp80, attention_info.position, fVar1, fVar2, fVar3, 0)) {
if (chkActorInSight2(daPy_getPlayerActorClass(), fVar4, param_2)) {
return TRUE;
}
}
return FALSE;
}
/* 80C0F5A4-80C0F668 00F784 00C4+00 1/1 0/0 0/0 .text chkPointInArea__11daObj_GrA_cF4cXyz4cXyzfffs */
BOOL daObj_GrA_c::chkPointInArea(cXyz param_1, cXyz param_2, f32 param_3, f32 param_4, f32 param_5, s16 param_6) {
cXyz sp68, sp74;
f32 var_f30 = param_4;
f32 var_f31 = param_5;
if (var_f30 < var_f31) {
var_f31 = param_4;
var_f30 = param_5;
}
sp68.set(param_3, fabsf(var_f30 - var_f31) / 2, param_3);
sp74 = param_2;
sp74.y += var_f31;
sp74.y += sp68.y;
return chkPointInArea(param_1, sp74, sp68, param_6);
}
/* 80C0F668-80C0F6E0 00F848 0078+00 1/1 0/0 0/0 .text chkPointInArea__11daObj_GrA_cF4cXyz4cXyz4cXyzs */
BOOL daObj_GrA_c::chkPointInArea(cXyz param_1, cXyz param_2, cXyz param_3, s16 param_4) {
return daNpcF_chkPointInArea(param_1, param_2, param_3, param_4);
}
/* 80C0F6E0-80C0F7EC 00F8C0 010C+00 1/1 0/0 0/0 .text chkActorInSight2__11daObj_GrA_cFP10fopAc_ac_cfs */
BOOL daObj_GrA_c::chkActorInSight2(fopAc_ac_c* actor, f32 param_2, s16 param_3) {
if (param_2 < 180.0f) {
s16 sVar1 = cM_deg2s(param_2);
cXyz sp34 = getAttentionPos(actor);
cSGlobe cStack_48(attention_info.position - sp34);
cSAngle acStack_4c(cSAngle(cStack_48.U().Inv()) - param_3);
s16 sVar2 = acStack_4c.Val();
if (sVar2 < 0) {
sVar2 = -sVar2;
}
return (sVar2 > sVar1) == 0;
}
return 1;
}
/* 80C0F7EC-80C0F860 00F9CC 0074+00 2/2 0/0 0/0 .text getAttentionPos__11daObj_GrA_cFP10fopAc_ac_c */
cXyz daObj_GrA_c::getAttentionPos(fopAc_ac_c* i_actor_p) {
cXyz pos = i_actor_p->attention_info.position;
if (fopAcM_GetName(i_actor_p) == PROC_ALINK) {
pos.y -= daPy_py_c::getAttentionOffsetY();
}
return pos;
}
/* 80C0F860-80C0FA68 00FA40 0208+00 2/0 0/0 0/0 .text standWaitJump__11daObj_GrA_cFPv */
int daObj_GrA_c::standWaitJump(void* param_1) {
switch (field_0xa7c) {
case 0:
field_0x1fcc = 0;
break;
case 1:
if (getJumpType() == 1) {
setLookMode(0);
if (home.angle.y != field_0x91a.y) {
if (turn_step(home.angle.y, 0, 19, 20) != 0) {
field_0x1fcc = 0;
setBaseMotion(21, mpHIO->m.field_0x0c);
setFaceMotion(0, -1.0f);
}
} else if (field_0xa90 != 21) {
setBaseMotion(21, mpHIO->m.field_0x0c);
setFaceMotion(0, -1.0f);
}
} else {
BOOL bVar1 = field_0x14f8.getActor() != NULL;
if (chkFindPlayer2(bVar1, shape_angle.y) != 0) {
if (!bVar1) {
field_0x14f8.entry(daPy_getPlayerActorClass());
}
} else if (bVar1) {
field_0x14f8.entry(NULL);
}
if (field_0x14f8.getActor() != NULL) {
setLookMode(1);
} else {
setLookMode(0);
if ((home.angle.y != field_0x91a.y) && (turn_step(home.angle.y, 0, 19, 20) != 0)) {
field_0x1fcc = 0;
setBaseMotion(0, mpHIO->m.field_0x0c);
setFaceMotion(0, -1.0f);
}
}
}
break;
case 2:
break;
}
return 1;
}
void dummy_aVec(daObj_GrA_c* a_this) {
static cXyz aVec[4] = {
cXyz(0.0f, 0.0f, 0.0f),
cXyz(0.0f, 0.0f, 0.0f),
cXyz(0.0f, 0.0f, 0.0f),
cXyz(0.0f, 0.0f, 0.0f),
};
}

File diff suppressed because it is too large Load Diff