Finish naming option REL

This commit is contained in:
gamemasterplc 2024-06-18 08:11:20 -05:00
parent 997cd0bf4c
commit 0687fd8abb
11 changed files with 1493 additions and 1462 deletions

View file

@ -9,19 +9,18 @@
#include "ext_math.h"
typedef struct {
/* 0x00 */ s32 mode;
/* 0x04 */ s16 motionIdx;
/* 0x06 */ char unk06[2];
/* 0x00 */ s32 execMode;
/* 0x04 */ s16 motion;
/* 0x08 */ Vec pos;
/* 0x14 */ Vec newPos;
/* 0x20 */ Vec rot;
/* 0x2C */ Vec posChange;
/* 0x38 */ float distanceToMove;
/* 0x3C */ float unkAngle;
/* 0x40 */ float posToMoveTo;
/* 0x44 */ float distFromCam;
/* 0x2C */ Vec posDelta;
/* 0x38 */ float distRemain;
/* 0x3C */ float angle;
/* 0x40 */ float angleEnd;
/* 0x44 */ float camDist;
/* 0x48 */ char unk48[0xC];
/* 0x54 */ float velocity;
/* 0x54 */ float time;
/* 0x58 */ float speed;
/* 0x5C */ s32 unk5C;
/* 0x60 */ s32 unk60;
@ -30,29 +29,29 @@ typedef struct {
#define MODE_DISABLED 0
#define MODE_HANDLE_GUIDE 1
static void ChangeMode(omObjData *object, s32 mode);
static s32 GetMode(omObjData *object);
static void HandleGuide(omObjData *object);
static void SetExecMode(omObjData *object, s32 mode);
static s32 GetExecMode(omObjData *object);
static void ExecGuide(omObjData *object);
static void UpdateGuide(omObjData *object);
static float fn_1_2D00(float arg0, float arg1, float arg2);
static float LerpAngle(float arg0, float arg1, float arg2);
omObjData *lbl_1_bss_20;
omObjData *optionGuide;
static const s32 lbl_1_rodata_E0[] = {
static const s32 guideMotTbl[] = {
DATA_MAKE_NUM(DATADIR_OPTION, 16),
DATA_MAKE_NUM(DATADIR_OPTION, 17),
DATA_MAKE_NUM(DATADIR_OPTION, 18),
};
static omObjFunc modes[] = { NULL, HandleGuide };
static omObjFunc execModeTbl[] = { NULL, ExecGuide };
omObjData *fn_1_21F8(void)
omObjData *OptionGuideCreate(void)
{
omObjData *object;
GuideWork *work;
s32 i;
object = omAddObjEx(lbl_1_bss_8, 1002, 1, 3, 2, NULL);
object = omAddObjEx(optionObjMan, 1002, 1, 3, 2, NULL);
work = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(GuideWork), MEMORY_DEFAULT_NUM);
object->data = work;
work->pos.x = -298.59f;
@ -63,25 +62,25 @@ omObjData *fn_1_21F8(void)
work->rot.y = 134.42f;
work->rot.z = 0.0f;
work->posChange.x = 0.0f;
work->posChange.z = 0.0f;
work->posChange.y = 0.0f;
work->posDelta.x = 0.0f;
work->posDelta.z = 0.0f;
work->posDelta.y = 0.0f;
object->model[0] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_OPTION, 12));
Hu3DModelLayerSet(object->model[0], 1);
for (i = 0; i < 3; i++) {
object->motion[i] = Hu3DJointMotion(object->model[0], HuDataSelHeapReadNum(lbl_1_rodata_E0[i], MEMORY_DEFAULT_NUM, HEAP_DATA));
object->motion[i] = Hu3DJointMotion(object->model[0], HuDataSelHeapReadNum(guideMotTbl[i], MEMORY_DEFAULT_NUM, HEAP_DATA));
}
work->unk5C = CharModelEffectNpcInit(object->model[0], object->motion[2], 1, 0xC);
work->unk60 = CharModelEffectNpcInit(object->model[0], object->motion[1], 0, 0xC);
CharModelLayerSetAll(1);
Hu3DModelShadowSet(object->model[0]);
Hu3DMotionShiftSet(object->model[0], object->motion[0], 0.0f, 8.0f, 0x40000001);
ChangeMode(object, MODE_DISABLED);
SetExecMode(object, MODE_DISABLED);
UpdateGuide(object);
return object;
}
void fn_1_241C(omObjData *object)
void OptionGuideKill(omObjData *object)
{
GuideWork *work = object->data;
s32 i;
@ -95,90 +94,90 @@ void fn_1_241C(omObjData *object)
HuMemDirectFree(work);
}
static void ChangeMode(omObjData *object, s32 mode)
static void SetExecMode(omObjData *object, s32 execMode)
{
GuideWork *work = object->data;
work->mode = mode;
object->func = modes[mode];
work->execMode = execMode;
object->func = execModeTbl[execMode];
object->unk10 = 0;
object->unk10 = 0;
}
static s32 GetMode(omObjData *object)
static s32 GetExecMode(omObjData *object)
{
GuideWork *work = object->data;
return work->mode;
return work->execMode;
}
void fn_1_2508(omObjData *object, float destPos, float distFromCam, s32 walkDuration)
void OptionGuideWalkExec(omObjData *object, float angleEnd, float camDist, s32 duration)
{
GuideWork *work = object->data;
work->posToMoveTo = destPos;
work->distFromCam = distFromCam;
work->velocity = 0.0f;
work->speed = 1.0f / walkDuration;
work->motionIdx = 0;
ChangeMode(object, MODE_HANDLE_GUIDE);
work->angleEnd = angleEnd;
work->camDist = camDist;
work->time = 0.0f;
work->speed = 1.0f / duration;
work->motion = 0;
SetExecMode(object, MODE_HANDLE_GUIDE);
}
static void HandleGuide(omObjData *object)
static void ExecGuide(omObjData *object)
{
GuideWork *work = object->data;
float var_f31;
float var_f30;
float angle;
float weight;
switch (object->unk10) {
case 0:
work->unkAngle = fmod(-atan2d(work->pos.x, work->pos.z), 360.0);
if (work->unkAngle < 0.0f) {
work->unkAngle += 360.0f;
work->angle = fmod(-atan2d(work->pos.x, work->pos.z), 360.0);
if (work->angle < 0.0f) {
work->angle += 360.0f;
}
object->unk10 = 1;
/* fallthrough */
case 1:
var_f30 = sind(90.0f * work->velocity);
var_f31 = work->unkAngle + var_f30 * (work->posToMoveTo - work->unkAngle);
work->newPos.x = work->distFromCam * -sind(var_f31);
work->newPos.z = work->distFromCam * cosd(var_f31);
weight = sind(90.0f * work->time);
angle = work->angle + weight * (work->angleEnd - work->angle);
work->newPos.x = work->camDist * -sind(angle);
work->newPos.z = work->camDist * cosd(angle);
work->newPos.y = 0.0f;
work->posChange.x = work->newPos.x - work->pos.x;
work->posChange.z = work->newPos.z - work->pos.z;
if (work->velocity <= 0.0f) {
work->posChange.x = 0.0f;
work->posChange.z = 0.0f;
work->posDelta.x = work->newPos.x - work->pos.x;
work->posDelta.z = work->newPos.z - work->pos.z;
if (work->time <= 0.0f) {
work->posDelta.x = 0.0f;
work->posDelta.z = 0.0f;
work->pos = work->newPos;
}
if ((work->velocity += work->speed) < 1.0f) {
if ((work->time += work->speed) < 1.0f) {
break;
}
var_f31 = fmod(-atan2d(work->pos.x, work->pos.z), 360.0);
if (var_f31 < 0.0f) {
var_f31 += 360.0f;
angle = fmod(-atan2d(work->pos.x, work->pos.z), 360.0);
if (angle < 0.0f) {
angle += 360.0f;
}
work->newPos.x = 422.0 * -sind(var_f31);
work->newPos.z = 422.0 * cosd(var_f31);
work->posChange.x = (work->newPos.x - work->pos.x) / 10.0f;
work->posChange.z = (work->newPos.z - work->pos.z) / 10.0f;
work->newPos.x = 422.0 * -sind(angle);
work->newPos.z = 422.0 * cosd(angle);
work->posDelta.x = (work->newPos.x - work->pos.x) / 10.0f;
work->posDelta.z = (work->newPos.z - work->pos.z) / 10.0f;
work->speed = 0.1f;
work->velocity = 0.0f;
work->time = 0.0f;
object->unk10 = 2;
/* fallthrough */
case 2:
if ((work->velocity += work->speed) < 1.0f) {
if ((work->time += work->speed) < 1.0f) {
break;
}
object->unk10 = 3;
/* fallthrough */
case 3:
work->pos = work->newPos;
work->posChange.x = 0.0f;
work->posChange.y = 0.0f;
work->posChange.z = 0.0f;
work->posDelta.x = 0.0f;
work->posDelta.y = 0.0f;
work->posDelta.z = 0.0f;
UpdateGuide(object);
ChangeMode(object, MODE_DISABLED);
SetExecMode(object, MODE_DISABLED);
break;
}
UpdateGuide(object);
@ -187,51 +186,51 @@ static void HandleGuide(omObjData *object)
static void UpdateGuide(omObjData *object)
{
GuideWork *work = object->data;
s16 var_r29;
s16 motion;
var_r29 = 0;
work->distanceToMove = sqrtf(work->posChange.x * work->posChange.x + work->posChange.z * work->posChange.z);
if (0.001f <= work->distanceToMove) {
if (14.0f <= work->distanceToMove) {
work->posChange.x /= work->distanceToMove;
work->posChange.z /= work->distanceToMove;
work->distanceToMove = 14.0f;
work->posChange.x = 14.0f * work->posChange.x;
work->posChange.z = 14.0f * work->posChange.z;
motion = 0;
work->distRemain = sqrtf(work->posDelta.x * work->posDelta.x + work->posDelta.z * work->posDelta.z);
if (0.001f <= work->distRemain) {
if (14.0f <= work->distRemain) {
work->posDelta.x /= work->distRemain;
work->posDelta.z /= work->distRemain;
work->distRemain = 14.0f;
work->posDelta.x = 14.0f * work->posDelta.x;
work->posDelta.z = 14.0f * work->posDelta.z;
}
work->rot.y = fn_1_2D00(work->rot.y, atan2d(work->posChange.x, work->posChange.z), 0.4f);
if (8.0f <= work->distanceToMove) {
var_r29 = 2;
work->rot.y = LerpAngle(work->rot.y, atan2d(work->posDelta.x, work->posDelta.z), 0.4f);
if (8.0f <= work->distRemain) {
motion = 2;
}
else {
var_r29 = 1;
motion = 1;
}
}
work->pos.x += work->posChange.x;
work->pos.z += work->posChange.z;
if (work->motionIdx != var_r29) {
Hu3DMotionShiftSet(*object->model, object->motion[var_r29], 0.0f, 8.0f, 0x40000001);
work->motionIdx = var_r29;
work->pos.x += work->posDelta.x;
work->pos.z += work->posDelta.z;
if (work->motion != motion) {
Hu3DMotionShiftSet(*object->model, object->motion[motion], 0.0f, 8.0f, 0x40000001);
work->motion = motion;
}
omSetTra(object, work->pos.x, work->pos.y, work->pos.z);
omSetRot(object, work->rot.x, work->rot.y, work->rot.z);
}
static float fn_1_2D00(float arg0, float arg1, float arg2)
static float LerpAngle(float start, float end, float time)
{
float var_f30;
float var_f31;
float angle;
float delta;
var_f31 = fmod(arg1 - arg0, 360.0);
if (0.0f > var_f31) {
var_f31 += 360.0f;
delta = fmod(end - start, 360.0);
if (0.0f > delta) {
delta += 360.0f;
}
if (180.0f < var_f31) {
var_f31 -= 360.0f;
if (180.0f < delta) {
delta -= 360.0f;
}
var_f30 = fmod(arg0 + var_f31 * arg2, 360.0);
if (0.0f > var_f30) {
var_f30 += 360.0f;
angle = fmod(start + delta * time, 360.0);
if (0.0f > angle) {
angle += 360.0f;
}
return var_f30;
return angle;
}