f_op_actor_mng progress

This commit is contained in:
LagoLunatic
2023-11-06 22:32:12 -05:00
parent 84ef226b32
commit 897279a745
2 changed files with 156 additions and 25 deletions
+9 -8
View File
@@ -58,6 +58,11 @@ struct fopAcM_search_prm {
/* 0x0A */ s8 mSubType;
};
class l_HIO {
public:
~l_HIO() {}
};
class dKy_tevstr_c;
typedef int (*heapCallbackFunc)(fopAc_ac_c*);
typedef int (*createFunc)(void*);
@@ -337,10 +342,6 @@ inline bool fopAcM_IsFirstCreating(void* i_actor) {
return fpcM_IsFirstCreating(i_actor);
}
void fopAcM_initManager();
void* fopAcM_FastCreate(s16 pProcTypeID, FastCreateReqFunc param_2, void* param_3, void* pData);
void fopAcM_setStageLayer(void* p_proc);
void fopAcM_setRoomLayer(void* p_proc, int roomNo);
@@ -457,13 +458,13 @@ s32 fopAcM_createItemForTrBoxDemo(cXyz* p_pos, int i_itemNo, int i_itemBitNo, in
s32 fopAcM_createItemFromTable(cXyz* p_pos, int i_tableNo, int i_itemBitNo, int i_roomNo, int,
csXyz* p_angle, int, cXyz* p_scale);
s32 fopAcM_createShopItem(cXyz* p_pos, int i_itemNo, csXyz* rot, int roomNo, cXyz* scale,
s32 fopAcM_createShopItem(cXyz* p_pos, int i_itemNo, csXyz* p_angle, int roomNo, cXyz* scale,
createFunc createFunc);
s32 fopAcM_createRaceItem(cXyz* p_pos, int i_itemNo, int i_itemBitNo, csXyz* rot, int roomNo,
s32 fopAcM_createRaceItem(cXyz* p_pos, int i_itemNo, int i_itemBitNo, csXyz* p_angle, int roomNo,
cXyz* scale, int param_7);
s32 fopAcM_createIball(cXyz* p_pos, int itemTableIdx, int roomNo, csXyz* rot, int itemStealNum);
s32 fopAcM_createIball(cXyz* p_pos, int itemTableIdx, int roomNo, csXyz* p_angle, int itemStealNum);
s32 fopAcM_createDemoItem(cXyz* p_pos, int itemNo, int itemBitNo, csXyz* p_angle,
int roomNo, cXyz* scale, u8 param_7);
@@ -489,7 +490,7 @@ BOOL stealItem_CB(void* actor);
fopAc_ac_c* fopAcM_myRoomSearchEnemy(s8 roomNo);
s32 fopAcM_createDisappear(fopAc_ac_c*, cXyz*, u8, u8, u8);
s32 fopAcM_createDisappear(fopAc_ac_c* i_actor, cXyz* p_pos, u8 i_scale, u8 i_health, u8 i_switchNo);
void fopAcM_setCarryNow(fopAc_ac_c* i_this, int stageLayer);
void fopAcM_cancelCarryNow(fopAc_ac_c* i_this);
s32 fopAcM_otoCheck(fopAc_ac_c*, f32);
+147 -17
View File
@@ -25,6 +25,8 @@
#include "JSystem/JUtility/JUTAssert.h"
#include "SSystem/SComponent/c_malloc.h"
static Vec dummy_3569;
/* 80024060-80024104 .text fopAcM_setStageLayer__FPv */
void fopAcM_setStageLayer(void* pProc) {
scene_class* stageProc = fopScnM_SearchByID(dStage_roomControl_c::getProcID());
@@ -504,7 +506,7 @@ s32 fopAcM_rollPlayerCrash(fopAc_ac_c* i_this, f32 distAdjust, u32 flag) {
if (xzDist2 < maxDist*maxDist && yDist > -100.0f && yDist < 200.0f) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
s16 angle = fopAcM_searchPlayerAngleY(i_this);
if (cM_scos(player->current.angle.y - angle) < 0.9f) {
if (cM_scos(player->current.angle.y - angle) < -0.9f) {
if (fopAcM_GetName(player) == PROC_PLAYER) {
player->onFrollCrashFlg(flag);
return TRUE;
@@ -523,8 +525,45 @@ s32 fopAcM_checkCullingBox(Mtx pMtx, float x0, float y0, float z0, float x1, flo
return mDoLib_clipper::clip(viewMtx, &p1, &p0) != 0;
}
static fopAc_cullSizeBox l_cullSizeBox[14]; // TODO
static fopAc_cullSizeSphere l_cullSizeSphere[8]; // TODO
static l_HIO l_hio;
static fopAc_cullSizeBox l_cullSizeBox[14] = {
#ifndef __INTELLISENSE__
/* fopAc_CULLBOX_0_e */ fopAc_cullSizeBox(cXyz(-40.0f, 0.0f, -40.0f), cXyz(40.0f, 125.0f, 40.0f)),
/* fopAc_CULLBOX_1_e */ fopAc_cullSizeBox(cXyz(-25.0f, 0.0f, -25.0f), cXyz(25.0f, 50.0f, 25.0f)),
/* fopAc_CULLBOX_2_e */ fopAc_cullSizeBox(cXyz(-50.0f, 0.0f, -50.0f), cXyz(50.0f, 100.0f, 50.0f)),
/* fopAc_CULLBOX_3_e */ fopAc_cullSizeBox(cXyz(-75.0f, 0.0f, -75.0f), cXyz(75.0f, 150.0f, 75.0f)),
/* fopAc_CULLBOX_4_e */ fopAc_cullSizeBox(cXyz(-100.0f, 0.0f, -100.0f), cXyz(100.0f, 800.0f, 100.0f)),
/* fopAc_CULLBOX_5_e */ fopAc_cullSizeBox(cXyz(-125.0f, 0.0f, -125.0f), cXyz(125.0f, 250.0f, 125.0f)),
/* fopAc_CULLBOX_6_e */ fopAc_cullSizeBox(cXyz(-150.0f, 0.0f, -150.0f), cXyz(150.0f, 300.0f, 150.0f)),
/* fopAc_CULLBOX_7_e */ fopAc_cullSizeBox(cXyz(-200.0f, 0.0f, -200.0f), cXyz(200.0f, 400.0f, 200.0f)),
/* fopAc_CULLBOX_8_e */ fopAc_cullSizeBox(cXyz(-600.0f, 0.0f, -600.0f), cXyz(600.0f, 900.0f, 600.0f)),
/* fopAc_CULLBOX_9_e */ fopAc_cullSizeBox(cXyz(-250.0f, 0.0f, -50.0f), cXyz(250.0f, 450.0f, 50.0f)),
/* fopAc_CULLBOX_10_e */ fopAc_cullSizeBox(cXyz(-60.0f, 0.0f, -20.0f), cXyz(40.0f, 130.0f, 150.0f)),
/* fopAc_CULLBOX_11_e */ fopAc_cullSizeBox(cXyz(-75.0f, 0.0f, -75.0f), cXyz(75.0f, 210.0f, 75.0f)),
/* fopAc_CULLBOX_12_e */ fopAc_cullSizeBox(cXyz(-70.0f, -100.0f, -80.0f), cXyz(70.0f, 240.0f, 100.0f)),
/* fopAc_CULLBOX_13_e */ fopAc_cullSizeBox(cXyz(-60.0f, -20.0f, -60.0f), cXyz(60.0f, 160.0f, 60.0f)),
#endif
};
static fopAc_cullSizeSphere l_cullSizeSphere[8] = {
#ifndef __INTELLISENSE__
/* fopAc_CULLSPHERE_0_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 80.0f),
/* fopAc_CULLSPHERE_1_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 50.0f),
/* fopAc_CULLSPHERE_2_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 100.0f),
/* fopAc_CULLSPHERE_3_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 150.0f),
/* fopAc_CULLSPHERE_4_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 200.0f),
/* fopAc_CULLSPHERE_5_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 250.0f),
/* fopAc_CULLSPHERE_6_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 300.0f),
/* fopAc_CULLSPHERE_7_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 400.0f),
#endif
};
static void dummy() {
static Vec dummy_4863;
static Vec min;
static Vec dummy_4899;
static Vec max;
}
/* 80025660-800259A8 .text fopAcM_cullingCheck__FP10fopAc_ac_c */
s32 fopAcM_cullingCheck(fopAc_ac_c* i_this) {
@@ -766,8 +805,93 @@ s32 fopAcM_createItemForTrBoxDemo(cXyz* pos, int i_itemNo, int roomNo, int param
}
/* 800262B4-80026694 .text fopAcM_createItemFromTable__FP4cXyziiiiP5csXyziP4cXyz */
void fopAcM_createItemFromTable(cXyz*, int, int, int, int, csXyz*, int, cXyz*) {
/* Nonmatching */
s32 fopAcM_createItemFromTable(cXyz* p_pos, int i_itemNo, int i_itemBitNo, int roomNo, int type, csXyz* p_angle, int action, cXyz* p_scale) {
JUT_ASSERT(2514, 0 <= i_itemNo && i_itemNo < 64 && (-1 <= i_itemBitNo && i_itemBitNo <= 79) || i_itemBitNo == 127);
static cXyz fairy_offset_tbl[3] = {
cXyz(40.0f, 0.0f, 0.0f),
cXyz(-40.0f, 0.0f, 0.0f),
cXyz(0.0f, 0.0f, 40.0f),
};
cXyz pos(0.0f, 0.0f, 0.0f);
csXyz angle(0, 0, 0);
if (i_itemNo >= 0x20 && i_itemNo <= 0x3E) {
ItemTableList* itemTableList = dComIfGp_getItemTable();
int tableIdx = i_itemNo - 0x20;
switch (tableIdx) {
case 0x01:
case 0x02:
case 0x03:
case 0x04:
int life = dComIfGs_getLife() * 100;
int max = dComIfGs_getMaxLife() & 0xFC;
u8 lifePercent = life / max;
if (lifePercent != 0 && lifePercent <= 20) {
tableIdx = 4;
} else if (lifePercent > 20 && lifePercent <= 40) {
tableIdx = 3;
} else if (lifePercent > 40 && lifePercent <= 80) {
tableIdx = 2;
} else if (lifePercent > 80 && lifePercent <= 100) {
tableIdx = 1;
}
break;
case 0x0B:
case 0x0C:
case 0x0D:
case 0x0E:
case 0x0F:
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
if (itemTableList == NULL) {
return -1;
}
u8* pItemTable = itemTableList->mItemTables[tableIdx];
u32 itemNo;
u32 lastItemPcId;
for (int i = 0; (itemNo = *pItemTable) != NO_ITEM && i < 0x10; pItemTable++, i++) {
if (p_pos) {
pos = *p_pos;
}
if (p_angle) {
angle = *p_angle;
}
if (tableIdx == RECOVER_FAIRY) {
// Bug: This condition never gets triggered. They meant to check if (itemNo == RECOVER_FAIRY) so
// that the 3x fairies drop table (table 0x14) spawns them in a triangle. But nstead they check if
// the table index is equal to 0x16/RECOVER_FAIRY, which will never be true.
pos += fairy_offset_tbl[i];
angle.y = cM_rndF((f32)0x7FFE);
}
itemNo = getItemNoByLife((s8)itemNo);
daItem_c* item = (daItem_c*)fopAcM_fastCreateItem2(&pos, itemNo, i_itemBitNo, roomNo, type, &angle, 8, NULL);
lastItemPcId = fopAcM_GetID(item);
if (lastItemPcId == -1) {
break;
}
}
return lastItemPcId;
}
int itemIdx = (int)cM_rndF(15.9999f);
i_itemNo = itemTableList->mItemTables[tableIdx][itemIdx];
}
if (i_itemNo == 0x3F || i_itemNo == 0xFF) {
return -1;
} else {
u32 itemNo = getItemNoByLife(i_itemNo);
daItem_c* item = (daItem_c*)fopAcM_fastCreateItem2(p_pos, itemNo, i_itemBitNo, roomNo, type, p_angle, action, p_scale);
return fopAcM_GetID(item);
}
}
/* 80026694-800267C8 .text fopAcM_createRaceItemFromTable__FP4cXyziiiP5csXyzP4cXyzi */
@@ -788,14 +912,13 @@ s32 fopAcM_createShopItem(cXyz* pos, int i_itemNo, csXyz* rot, int roomNo, cXyz*
/* 8002688C-80026980 .text fopAcM_createRaceItem__FP4cXyziiP5csXyziP4cXyzi */
s32 fopAcM_createRaceItem(cXyz* pos, int i_itemNo, int i_itemBitNo, csXyz* rot, int roomNo, cXyz* scale, int param_7) {
/* Nonmatching */
JUT_ASSERT(2763, 0 <= i_itemNo && i_itemNo < 256 && (-1 <= i_itemBitNo && i_itemBitNo <= 79) || i_itemBitNo == 127);
if (i_itemNo == NO_ITEM) {
return -1;
}
i_itemNo = (u8)check_itemno(i_itemNo);
u32 params = (i_itemBitNo & 0x7F) << 0x08 | i_itemNo | (param_7 & 0xF) << 0xF;
i_itemNo = check_itemno(i_itemNo);
u32 params = (i_itemBitNo & 0x7F) << 0x08 | i_itemNo & 0xFF | (param_7 & 0xF) << 0xF;
fopAcM_create(PROC_RACEITEM, params, pos, roomNo, rot, scale, 0xFF, NULL);
}
@@ -956,8 +1079,9 @@ s32 fopAcM_createIball(cXyz*, int, int, csXyz*, int) {
}
/* 800278D8-80027920 .text fopAcM_createWarpFlower__FP4cXyzP5csXyziUc */
void fopAcM_createWarpFlower(cXyz*, csXyz*, int, unsigned char) {
/* Nonmatching */
void fopAcM_createWarpFlower(cXyz* p_pos, csXyz* p_angle, int i_roomNo, u8 param_4) {
u32 params = param_4;
fopAcM_create(PROC_WARPFLOWER, params, p_pos, i_roomNo, p_angle, NULL, 0xFF, NULL);
}
/* 80027920-80027970 .text enemySearchJugge__FPvPv */
@@ -986,8 +1110,13 @@ fopAc_ac_c* fopAcM_myRoomSearchEnemy(s8 roomNo) {
}
/* 80027A9C-80027B24 .text fopAcM_createDisappear__FP10fopAc_ac_cP4cXyzUcUcUc */
s32 fopAcM_createDisappear(fopAc_ac_c*, cXyz*, unsigned char, unsigned char, unsigned char) {
/* Nonmatching */
s32 fopAcM_createDisappear(fopAc_ac_c* i_actor, cXyz* p_pos, u8 i_scale, u8 i_health, u8 i_switchNo) {
u32 params = (i_switchNo & 0xFF) << 0x10 | (i_scale & 0xFF) << 0x08 | i_health & 0xFF;
fopAc_ac_c* disappear = (fopAc_ac_c*)fopAcM_fastCreate(PROC_DISAPPEAR, params, p_pos, fopAcM_GetRoomNo(i_actor), &i_actor->current.angle, NULL, -1, NULL, NULL);
if (disappear) {
disappear->mItemTableIdx = i_actor->mItemTableIdx;
}
return fopAcM_GetID(disappear);
}
/* 80027B24-80027E28 .text fopAcM_getGroundAngle__FP10fopAc_ac_cP5csXyz */
@@ -1067,14 +1196,15 @@ fopAc_ac_c* fopAcM_searchFromName(char* pProcName, u32 paramMask, u32 parameter)
/* 80028448-80028560 .text fopAcM_getWaterY__FPC4cXyzPf */
s32 fopAcM_getWaterY(const cXyz* pPos, float* pDstWaterY) {
/* Nonmatching */
static dBgS_WtrChk water_check;
s32 ret = 0;
*pDstWaterY = -1e09;
cXyz pos = *pPos;
pos.y -= 500.0f;
cXyz pos;
pos.x = pPos->x;
pos.y = pPos->y - 500.0f;
pos.z = pPos->z;
water_check.Set(pos, pos.y + 1000.0f);
bool hit = dComIfG_Bgsp()->SplGrpChk(&water_check);
@@ -1083,8 +1213,8 @@ s32 fopAcM_getWaterY(const cXyz* pPos, float* pDstWaterY) {
ret = 1;
}
if (daSea_ChkArea(pos.x, pos.z)) {
f32 waveY = daSea_calcWave(pos.x, pos.z);
if (daSea_ChkArea(pPos->x, pPos->z)) {
f32 waveY = daSea_calcWave(pPos->x, pPos->z);
if (waveY > *pDstWaterY)
*pDstWaterY = waveY;
ret = 1;