Add enums for items and disappears

This commit is contained in:
LagoLunatic
2025-01-11 19:15:36 -05:00
parent 24fab1a52a
commit d330c1e68a
8 changed files with 159 additions and 119 deletions
+13 -13
View File
@@ -21,22 +21,22 @@ static BOOL daDisappear_Execute(disappear_class* i_this) {
i_this->mTimer--;
if (i_this->mTimer == 0) {
s8 health = i_this->health; // TODO: add enum for disappear types (stored in health)
s8 dropType = i_this->health;
if (health != 1 && health != 3) {
if (health == 2) {
fopAcM_createItemForBoss(&i_this->current.pos, 0, i_this->current.roomNo, &i_this->current.angle);
if (dropType != daDisItem_NONE1_e && dropType != daDisItem_NONE3_e) {
if (dropType == daDisItem_HEART_CONTAINER_e) {
fopAcM_createItemForBoss(&i_this->current.pos, 0, i_this->current.roomNo, &i_this->current.angle, NULL, 0);
}
else if (health >= 0x0A && health <= 0x0D) {
else if (dropType >= daDisItem_HEART_e && dropType <= daDisItem_UNK13_e) {
// Special type for Keese (ki) spawned in the Puppet Ganon fight.
if (health < 0x0D) {
static u32 ki_item_d[] = {
dItem_HEART_e,
L_MAGIC,
ARROW_10,
};
fopAcM_createItem(&i_this->current.pos, ki_item_d[health - 0xA], -1, -1, 0, NULL, 4);
// This also seems to be used by several other enemies, such as Molgera's spawn.
static u32 ki_item_d[] = {
dItem_HEART_e,
L_MAGIC,
ARROW_10,
};
if (dropType < daDisItem_HEART_e + (int)ARRAY_SIZE(ki_item_d)) {
fopAcM_createItem(&i_this->current.pos, ki_item_d[dropType - daDisItem_HEART_e], -1, -1, daItemType_0_e, NULL, daItemAct_4_e);
}
}
else {
+37 -35
View File
@@ -159,7 +159,7 @@ void daItem_c::CreateInit() {
mItemStatus = STATUS_UNK0;
mType = daItem_prm::getType(this);
if (daItem_prm::getType(this) == 3 || daItem_prm::getType(this) == 1) {
if (daItem_prm::getType(this) == daItemType_3_e || daItem_prm::getType(this) == daItemType_1_e) {
setFlag(FLAG_UNK02);
}
mAction = daItem_prm::getAction(this);
@@ -309,7 +309,7 @@ void daItem_c::mode_proc_call() {
&daItem_c::mode_water,
};
if (mType == 1) {
if (mType == daItemType_1_e) {
itemDefaultRotateY();
} else {
(this->*mode_proc[mMode])();
@@ -333,8 +333,8 @@ void daItem_c::mode_proc_call() {
}
}
if (mType == 1 && (fopAcM_checkHookCarryNow(this) || checkFlag(FLAG_BOOMERANG))) {
mType = 3;
if (mType == daItemType_1_e && (fopAcM_checkHookCarryNow(this) || checkFlag(FLAG_BOOMERANG))) {
mType = daItemType_3_e;
}
}
@@ -430,7 +430,7 @@ void daItem_c::execMainGetDemoDirection() {
/* 800F5D44-800F5D88 .text execBringNezumi__8daItem_cFv */
void daItem_c::execBringNezumi() {
if (mType != 1) {
if (mType != daItemType_1_e) {
fopAcM_posMoveF(this, mStts.GetCCMoveP());
}
mode_proc_call();
@@ -439,7 +439,7 @@ void daItem_c::execBringNezumi() {
/* 800F5D88-800F5F40 .text execWaitMain__8daItem_cFv */
void daItem_c::execWaitMain() {
checkGetItem();
if (mType != 1) {
if (mType != daItemType_1_e) {
fopAcM_posMoveF(this, mStts.GetCCMoveP());
}
mode_proc_call();
@@ -474,7 +474,7 @@ void daItem_c::execWaitMain() {
/* 800F5F40-800F5FC0 .text execWaitMainFromBoss__8daItem_cFv */
void daItem_c::execWaitMainFromBoss() {
checkGetItem();
if (mType != 1) {
if (mType != daItemType_1_e) {
fopAcM_posMoveF(this, mStts.GetCCMoveP());
}
mode_proc_call();
@@ -853,16 +853,16 @@ BOOL daItem_c::itemActionForRupee() {
field_0x650 = speed.y;
}
field_0x654 = getData()->mRotateXSpeed;
mRotateSpeed = getData()->mRotateXSpeed;
if (mOnGroundTimer == 0) {
mTargetAngleX = current.angle.x + field_0x654;
mTargetAngleX = current.angle.x + mRotateSpeed;
} else {
mTargetAngleX = 0;
}
if (!checkFlag(FLAG_UNK02)) {
cLib_chaseAngleS(&current.angle.x, mTargetAngleX, field_0x654);
cLib_chaseAngleS(&current.angle.x, mTargetAngleX, mRotateSpeed);
}
return TRUE;
@@ -903,7 +903,7 @@ BOOL daItem_c::itemActionForKey() {
speedF = 0.0f;
current.angle.x = 0x4000;
mTargetAngleX = current.angle.x;
field_0x654 = 0;
mRotateSpeed = 0;
} else {
speed.set(0.0f, -temp2, 0.0f);
}
@@ -924,15 +924,15 @@ BOOL daItem_c::itemActionForKey() {
field_0x650 = speed.y;
}
field_0x654 = getData()->mRotateXSpeed;
mRotateSpeed = getData()->mRotateXSpeed;
if (mOnGroundTimer == 0) {
mTargetAngleX = current.angle.x + field_0x654;
mTargetAngleX = current.angle.x + mRotateSpeed;
} else {
mTargetAngleX = 0;
}
cLib_chaseAngleS(&current.angle.x, mTargetAngleX, field_0x654);
cLib_chaseAngleS(&current.angle.x, mTargetAngleX, mRotateSpeed);
return TRUE;
}
@@ -1079,10 +1079,10 @@ BOOL daItem_c::itemActionForArrow() {
if (mOnGroundTimer != 0) {
getData();
s16 rotationSpeed = 0xFFFF / getData()->mRotateYSpeed;
cLib_addCalcAngleS(&field_0x654, rotationSpeed, 10, 0x400, 0x100);
cLib_addCalcAngleS(&mRotateSpeed, rotationSpeed, 10, 0x400, 0x100);
}
cLib_chaseAngleS(&shape_angle.y, shape_angle.y + field_0x654, field_0x654);
cLib_chaseAngleS(&shape_angle.y, shape_angle.y + mRotateSpeed, mRotateSpeed);
}
if (speed.y != 0.0f) {
@@ -1226,7 +1226,7 @@ void daItem_c::mode_water_init() {
current.angle.z = 0;
current.angle.x = 0;
mExtraZRot = 0;
field_0x654 = 0;
mRotateSpeed = 0;
clrFlag(FLAG_UNK04);
scale.set(mScaleTarget.x, mScaleTarget.y, mScaleTarget.z);
@@ -1333,26 +1333,26 @@ BOOL daItem_c::initAction() {
scale.set(mScaleTarget.x, mScaleTarget.y, mScaleTarget.z);
switch (mAction) {
case 4: {
case daItemAct_4_e: {
current.angle.y = cM_rndF((f32)0xFFFF);
f32 temp = getData()->field_0x2C + cM_rndF(5.0f);
speedF = cM_rndF(getData()->field_0x30);
speed.set(0.0f, temp, 0.0f);
break;
}
case 5:
case daItemAct_BOSS_DISAPPEAR_e:
speed.setall(0.0f);
speedF = 0.0f;
scale.setall(0.0f);
mItemStatus = STATUS_WAIT_BOSS1;
fopAcM_OnStatus(this, fopAcStts_UNK4000_e);
field_0x654 = 0x4A8;
mRotateSpeed = 0x4A8;
break;
case 0xC:
case daItemAct_BOSS_e:
scale.setall(1.0f);
mItemStatus = STATUS_WAIT_BOSS2;
fopAcM_OnStatus(this, fopAcStts_UNK4000_e);
field_0x654 = 0x4A8;
mRotateSpeed = 0x4A8;
break;
}
@@ -1363,10 +1363,12 @@ BOOL daItem_c::initAction() {
return TRUE;
}
// TODO: bug? usage of uninitialized register f31 in some cases
// Bug: Usage of uninitialized variable y_speed (register f31) in some cases.
// In practice only daItem_c::CreateInit calls daItem_c::initAction, which means y_speed will
// be set to the item's collision height if the action is 0, 5, or 0xA.
f32 y_speed;
switch (mAction) {
case 1:
case daItemAct_1_e:
y_speed = getData()->mLaunchSpeed + cM_rndFX(5.0f);
speedF = getData()->mSpeedH / 10.0f;
if (g_mDoCPd_cpadInfo[0].mMainStickValue) {
@@ -1374,43 +1376,43 @@ BOOL daItem_c::initAction() {
}
current.angle.y = cM_rndF((f32)0xFFFF);
break;
case 3:
case daItemAct_3_e:
y_speed = 25.0f;
current.angle.y = cM_rndF((f32)0xFFFF);
speedF = getData()->mVelocityScale;
break;
case 7:
case daItemAct_7_e:
speedF = getData()->mVelocityScale * 1.5f;
current.angle.y = cM_rndF((f32)0xFFFF);
y_speed = getData()->mLaunchSpeed + cM_rndFX(5.0f);
break;
case 2:
case 4:
case 9:
case daItemAct_2_e:
case daItemAct_4_e:
case daItemAct_9_e:
speedF = 0.0f;
current.angle.y = cM_rndF((f32)0xFFFF);
y_speed = getData()->mLaunchSpeed + cM_rndFX(5.0f);
break;
case 8:
case daItemAct_8_e:
current.angle.y = cM_rndF((f32)0xFFFF);
y_speed = getData()->field_0x44 + cM_rndFX(5.0f);
speedF = getData()->mVelocityScale;
break;
case 0xA:
case daItemAct_A_e:
gravity = getData()->mGravity;
scale.setall(0.0f);
mMode = MODE_WAIT;
break;
case 0xB:
case daItemAct_B_e:
current.angle.y = cM_rndF((f32)0xFFFF);
y_speed = 0.0f;
speedF = 0.0f;
break;
case 6:
case daItemAct_6_e:
y_speed = getData()->mLaunchSpeed + cM_rndFX(5.0f);
break;
case 0:
case 5:
case daItemAct_0_e:
case daItemAct_BOSS_DISAPPEAR_e:
break;
}
+10 -6
View File
@@ -1260,7 +1260,7 @@ namespace daObjMovebox {
}
/* 00001C64-00001DD4 .text PPCallBack__Q212daObjMovebox5Act_cFP10fopAc_ac_cP10fopAc_ac_csQ24dBgW13PushPullLabel */
fopAc_ac_c* Act_c::PPCallBack(fopAc_ac_c* actor, fopAc_ac_c*, s16 rot, dBgW::PushPullLabel orig_pp_label) {
fopAc_ac_c* Act_c::PPCallBack(fopAc_ac_c* actor, fopAc_ac_c*, s16 angle, dBgW::PushPullLabel orig_pp_label) {
Act_c* i_this = (Act_c*)actor;
dBgW::PushPullLabel pp_label = static_cast<dBgW::PushPullLabel>(orig_pp_label & (dBgW::PP_UNK1_e | dBgW::PP_UNK2_e));
@@ -1272,18 +1272,18 @@ namespace daObjMovebox {
unk = orig_pp_label & dBgW::PP_UNK8_e;
}
if (unk) {
s16 angle = (s16)(pp_label & dBgW::PP_UNK2_e ? rot - 0x8000 : rot) - actor->home.angle.y;
s16 angleDiff = (s16)(pp_label & dBgW::PP_UNK2_e ? angle - 0x8000 : angle) - actor->home.angle.y;
int pp_field = dBgW::PP_UNK1_e | dBgW::PP_UNK2_e;
JUT_ASSERT(1813, pp_label != pp_field);
i_this->mPPLabel = orig_pp_label;
int whichSide;
if (angle >= -0x2000 && angle < 0x2000) {
if (angleDiff >= -0x2000 && angleDiff < 0x2000) {
whichSide = 0;
} else if (angle >= 0x2000 && angle < 0x6000) {
} else if (angleDiff >= 0x2000 && angleDiff < 0x6000) {
whichSide = 1;
} else if (angle >= 0x6000 || angle < -0x6000) {
} else if (angleDiff >= 0x6000 || angleDiff < -0x6000) {
whichSide = 2;
} else {
whichSide = 3;
@@ -1707,7 +1707,11 @@ namespace daObjMovebox {
void Act_c::make_item() {
s32 itemTableNo = prm_get_itemNo();
s32 itemBitNo = prm_get_itemSave();
fopAcM_createItemFromTable(&current.pos, itemTableNo, itemBitNo, fopAcM_GetHomeRoomNo(this), 0, &current.angle, 7);
fopAcM_createItemFromTable(
&current.pos, itemTableNo, itemBitNo,
fopAcM_GetHomeRoomNo(this), daItemType_0_e,
&current.angle, daItemAct_7_e
);
}
/* 00003450-00003570 .text eff_break__Q212daObjMovebox5Act_cFv */
+2 -1
View File
@@ -135,7 +135,8 @@ bool daSwItem_c::_execute() {
csXyz angle(0, home.angle.y, 0);
fpc_ProcID itemProcId = fopAcM_createItemFromTable(
&current.pos, itemTbl, itemBitNo,
fopAcM_GetHomeRoomNo(this), 0, &angle, 1
fopAcM_GetHomeRoomNo(this), daItemType_0_e,
&angle, daItemAct_1_e
);
daItem_c* item = (daItem_c*)fopAcM_SearchByID(itemProcId);