NPC work, obj_szbridge matching (#2757)

* Some NPC work

* Fix impal

* Hopefully fix regressions in debug

* HIO work for more NPCs

* fix regressions

* obj_szbridge matching

* Fix literals
This commit is contained in:
hev7
2025-10-26 11:03:16 +00:00
committed by GitHub
parent 245abbe4c3
commit 3984dfac31
23 changed files with 2138 additions and 2969 deletions
+109 -47
View File
@@ -3,7 +3,7 @@
*
*/
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "SSystem/SComponent/c_counter.h"
#include "Z2AudioLib/Z2Instances.h"
@@ -11,6 +11,80 @@
#include "d/actor/d_a_npc_moi.h"
#include "d/actor/d_a_npc_uri.h"
/* 80A7AEF0-80A7AFAC 000000 00BC+00 19/19 0/0 0/0 .rodata m__17daNpc_Moi_Param_c */
const daNpc_Moi_HIOParam daNpc_Moi_Param_c::m = {
200.0f, // attention_offset
-3.0f, // gravity
1.0f, // scale
400.0f, // real_shadow_size
255.0f, // weight
180.0f, // height
35.0f, // knee_length
30.0f, // width
0.0f, // body_angleX_max
0.0f, // body_angleX_min
10.0f, // body_angleY_max
-10.0f, // body_angleY_min
30.0f, // head_angleX_max
-10.0f, // head_angleX_min
45.0f, // head_angleY_max
-45.0f, // head_angleY_min
0.6f, // neck_rotation_ratio
12.0f, // morf_frame
3, // talk_distance
6, // talk_angle
5, // attention_distance
6, // attention_angle
110.0f, // fov
0.0f, // search_distance
0.0f, // search_height
0.0f, // search_depth
60, // attention_time
8, // damage_time
0, // face_expression
0, // motion
0, // look_mode
0, // debug_mode_ON
0, // debug_info_ON
4.0f, // expression_morf_frame
0.0f, // box_min_x
0.0f, // box_min_y
0.0f, // box_min_z
0.0f, // box_max_x
0.0f, // box_max_y
0.0f, // box_max_z
0.0f, // box_offset
350.0f, // field_0x8c
300.0f, // field_0x90
-100.0f, // field_0x94
90, // field_0x98
200, // field_0x9a
235, // field_0x9c
125, // field_0x9e
0, // field_0xa0
0, // field_0xa2
1.0f, // field_0xa4
1000.0f, // field_0xa8
300.0f, // field_0xac
-300.0f, // field_0xb0
30.0f, // field_0xb4
60.0f, // field_0xb8
};
#if DEBUG
daNpc_Moi_HIO_c::daNpc_Moi_HIO_c() {
m = daNpc_Moi_Param_c::m;
}
void daNpc_Moi_HIO_c::listenPropertyEvent(const JORPropertyEvent* event) {
// TODO
}
void daNpc_Moi_HIO_c::genMessage(JORMContext* ctext) {
// TODO
}
#endif
/* 80A7B17C-80A7B1BC 000020 0040+00 1/1 0/0 0/0 .data l_bmdData */
static int l_bmdData[8][2] = {
{11, 1}, {29, 3}, {30, 3}, {31, 3}, {13, 1}, {33, 3}, {12, 1}, {32, 3},
@@ -193,17 +267,6 @@ daNpc_Moi_c::~daNpc_Moi_c() {
deleteRes(l_loadResPtrnList[mType], (char const**)l_resNameList);
}
/* 80A7AEF0-80A7AFAC 000000 00BC+00 19/19 0/0 0/0 .rodata m__17daNpc_Moi_Param_c */
const daNpc_Moi_HIOParam daNpc_Moi_Param_c::m = {
200.0f, -3.0f, 1.0f, 400.0f, 255.0f, 180.0f, 35.0f, 30.0f, 0.0f, 0.0f, 10.0f,
-10.0f, 30.0f, -10.0f, 45.0f, -45.0f, 0.6f, 12.0f, 3, 6, 5, 6,
110.0f, 0.0f, 0.0f, 0.0f, 60, 8, 0, 0, 0, 0, 0,
4.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0x43, 0xAF, 0x00,
0x00, 0x43, 0x96, 0x00, 0x00, 0xC2, 0xC8, 0x00, 0x00, 90, 200,
235, 125, 0, 0, 1.0f, 0x44, 0x7A, 0x00, 0x00, 0x43, 0x96,
0x00, 0x00, 0xC3, 0x96, 0x00, 0x00, 30.0f, 60.0f,
};
/* 80A74150-80A74474 0002F0 0324+00 1/1 0/0 0/0 .text create__11daNpc_Moi_cFv */
int daNpc_Moi_c::create() {
static const int heapSize[] = {0, 0x5C70, 0x7CB0, 0x7CA0, 0x5C70, 0x5C80, 0};
@@ -234,7 +297,7 @@ int daNpc_Moi_c::create() {
reset();
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(daNpc_Moi_Param_c::m.common.weight, 0, this);
mCcStts.Init(mpHIO->m.common.weight, 0, this);
for (int i = 0; i < 4; i++) {
mCyl[i].Set(mCcDCyl);
mCyl[i].SetStts(&mCcStts);
@@ -358,11 +421,11 @@ int daNpc_Moi_c::Draw() {
actor->field_0x634 = field_0x1628;
actor->current.pos = field_0x1628;
GXColor color;
color.r = daNpc_Moi_Param_c::m.field_0x9c;
color.g = daNpc_Moi_Param_c::m.field_0x9e;
color.b = daNpc_Moi_Param_c::m.field_0xa0;
color.r = mpHIO->m.field_0x9c;
color.g = mpHIO->m.field_0x9e;
color.b = mpHIO->m.field_0xa0;
color.a = (u8)actor->field_0x5c0;
dKy_BossLight_set(&field_0x1628, &color, daNpc_Moi_Param_c::m.field_0xa4, 1);
dKy_BossLight_set(&field_0x1628, &color, mpHIO->m.field_0xa4, 1);
}
}
@@ -535,10 +598,10 @@ void daNpc_Moi_c::setParam() {
srchActors();
int uVar5 = (fopAc_AttnFlag_SPEAK_e | fopAc_AttnFlag_TALK_e);
s16 talk_distance = daNpc_Moi_Param_c::m.common.talk_distance;
s16 talk_angle = daNpc_Moi_Param_c::m.common.talk_angle;
s16 attention_distance = daNpc_Moi_Param_c::m.common.attention_distance;
s16 attention_angle = daNpc_Moi_Param_c::m.common.attention_angle;
s16 talk_distance = mpHIO->m.common.talk_distance;
s16 talk_angle = mpHIO->m.common.talk_angle;
s16 attention_distance = mpHIO->m.common.attention_distance;
s16 attention_angle = mpHIO->m.common.attention_angle;
if (mType == TYPE_2) {
if (field_0x166d) {
@@ -584,18 +647,17 @@ void daNpc_Moi_c::setParam() {
attention_info.flags = uVar5;
}
scale.set(daNpc_Moi_Param_c::m.common.scale, daNpc_Moi_Param_c::m.common.scale,
daNpc_Moi_Param_c::m.common.scale);
mCcStts.SetWeight(daNpc_Moi_Param_c::m.common.weight);
mCylH = daNpc_Moi_Param_c::m.common.height;
mWallR = daNpc_Moi_Param_c::m.common.width;
mAttnFovY = daNpc_Moi_Param_c::m.common.fov;
scale.set(mpHIO->m.common.scale, mpHIO->m.common.scale, mpHIO->m.common.scale);
mCcStts.SetWeight(mpHIO->m.common.weight);
mCylH = mpHIO->m.common.height;
mWallR = mpHIO->m.common.width;
mAttnFovY = mpHIO->m.common.fov;
if (mType == TYPE_2) {
mAttnFovY = 135.0f;
}
mAcchCir.SetWallR(mWallR);
mAcchCir.SetWallH(daNpc_Moi_Param_c::m.common.knee_length);
mRealShadowSize = daNpc_Moi_Param_c::m.common.real_shadow_size;
mAcchCir.SetWallH(mpHIO->m.common.knee_length);
mRealShadowSize = mpHIO->m.common.real_shadow_size;
if (mType == TYPE_1) {
mRealShadowSize = 600.0f;
} else if (mType == TYPE_2) {
@@ -604,9 +666,9 @@ void daNpc_Moi_c::setParam() {
mRealShadowSize = 800.0f;
}
}
gravity = daNpc_Moi_Param_c::m.common.gravity;
mExpressionMorfFrame = daNpc_Moi_Param_c::m.common.expression_morf_frame;
mMorfFrames = daNpc_Moi_Param_c::m.common.morf_frame;
gravity = mpHIO->m.common.gravity;
mExpressionMorfFrame = mpHIO->m.common.expression_morf_frame;
mMorfFrames = mpHIO->m.common.morf_frame;
if (mType == TYPE_3) {
mAcch.SetGrndNone();
mAcch.SetWallNone();
@@ -762,7 +824,7 @@ void daNpc_Moi_c::beforeMove() {
}
/* 80A7BFF4-80A7BFF8 000054 0004+00 1/1 0/0 0/0 .bss l_HIO */
static daNpc_Moi_Param_c l_HIO;
NPC_MOI_HIO_CLASS l_HIO;
/* 80A75AB8-80A75E68 001C58 03B0+00 1/0 0/0 0/0 .text setAttnPos__11daNpc_Moi_cFv */
void daNpc_Moi_c::setAttnPos() {
@@ -775,15 +837,15 @@ void daNpc_Moi_c::setAttnPos() {
if (mType == 3) {
mJntAnm.setParam(this, mpMorf[0]->getModel(), &acStack_3c, getBackboneJointNo(),
getNeckJointNo(), getHeadJointNo(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, l_HIO.m.common.neck_rotation_ratio, dVar6, NULL);
0.0f, 0.0f, mpHIO->m.common.neck_rotation_ratio, dVar6, NULL);
} else {
mJntAnm.setParam(this, mpMorf[0]->getModel(), &acStack_3c, getBackboneJointNo(),
getNeckJointNo(), getHeadJointNo(), l_HIO.m.common.body_angleX_min,
l_HIO.m.common.body_angleX_max, l_HIO.m.common.body_angleY_min,
l_HIO.m.common.body_angleY_max, l_HIO.m.common.head_angleX_min,
l_HIO.m.common.head_angleX_max, l_HIO.m.common.head_angleY_min,
l_HIO.m.common.head_angleY_max, l_HIO.m.common.neck_rotation_ratio, dVar6,
NULL);
getNeckJointNo(), getHeadJointNo(), mpHIO->m.common.body_angleX_min,
mpHIO->m.common.body_angleX_max, mpHIO->m.common.body_angleY_min,
mpHIO->m.common.body_angleY_max, mpHIO->m.common.head_angleX_min,
mpHIO->m.common.head_angleX_max, mpHIO->m.common.head_angleY_min,
mpHIO->m.common.head_angleY_max, mpHIO->m.common.neck_rotation_ratio,
dVar6, NULL);
}
mJntAnm.calcJntRad(0.2f, 1.0f, dVar6);
@@ -795,7 +857,7 @@ void daNpc_Moi_c::setAttnPos() {
mJntAnm.setEyeAngleY(eyePos, mCurAngle.y + field_0xd8a.y, 1, 1.0f, 0);
acStack_3c.set(0.0f, 0.0f, 0.0f);
acStack_3c.y = l_HIO.m.common.attention_offset;
acStack_3c.y = mpHIO->m.common.attention_offset;
if (mType == TYPE_3) {
acStack_3c.set(0.0f, 140.0f, -60.0f);
@@ -1052,10 +1114,10 @@ void daNpc_Moi_c::setSSlash(int param_1) {
mSound.startCreatureVoice(JAISoundID(Z2SE_MOI_V_WOUND_SWING), -1);
}
field_0x1664 = fopAcM_searchPlayerAngleY(this);
s16 iVar3 = cM_deg2s(daNpc_Moi_Param_c::m.field_0xb8);
daPy_getPlayerActorClass()->setThrowDamage(
fopAcM_searchPlayerAngleY(this), daNpc_Moi_Param_c::m.field_0xb4 * cM_scos(iVar3),
daNpc_Moi_Param_c::m.field_0xb4 * cM_ssin(iVar3), 1, 0, 0);
s16 iVar3 = cM_deg2s(mpHIO->m.field_0xb8);
daPy_getPlayerActorClass()->setThrowDamage(fopAcM_searchPlayerAngleY(this),
mpHIO->m.field_0xb4 * cM_scos(iVar3),
mpHIO->m.field_0xb4 * cM_ssin(iVar3), 1, 0, 0);
if (param_1 != 0) {
field_0x1660 = 1;
field_0x165c = 202;
@@ -1679,7 +1741,7 @@ int daNpc_Moi_c::cutFindWolf(int param_1) {
/* 80A789D8-80A78E0C 004B78 0434+00 2/0 0/0 0/0 .text wait__11daNpc_Moi_cFPv */
int daNpc_Moi_c::wait(void* param_1) {
int iVar4 = daNpc_Moi_Param_c::m.field_0x98;
int iVar4 = mpHIO->m.field_0x98;
switch (mMode) {
case MODE_ENTER:
@@ -1793,7 +1855,7 @@ int daNpc_Moi_c::walk(void* param_1) {
/* 80A78FF4-80A794C0 005194 04CC+00 1/0 0/0 0/0 .text walkOnEggshell__11daNpc_Moi_cFPv */
int daNpc_Moi_c::walkOnEggshell(void* param_1) {
int sVar1 = daNpc_Moi_Param_c::m.field_0x9a;
int sVar1 = mpHIO->m.field_0x9a;
switch (mMode) {
case MODE_ENTER: