Clean up flag handling

This commit is contained in:
robojumper
2025-05-10 22:11:12 +02:00
parent 4c5dede891
commit aa35c8c970
11 changed files with 136 additions and 102 deletions
+20 -19
View File
@@ -248,14 +248,14 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) {
break;
case EVENT_SET_ZONEFLAG:
dStageMgr_c::GetInstance()->getFlagIndex();
SceneflagManager::sInstance->setFlag(
dStage_c::GetInstance()->getCurrRoomId(), ((params1n2 >> 16) & 0xFFFF) + 0xC0
SceneflagManager::sInstance->setZoneflag_i(
dStage_c::GetInstance()->getCurrRoomId(), (params1n2 >> 16) & 0xFFFF
);
break;
case EVENT_UNSET_ZONEFLAG:
dStageMgr_c::GetInstance()->getFlagIndex();
SceneflagManager::sInstance->unsetFlag(
dStage_c::GetInstance()->getCurrRoomId(), ((params1n2 >> 16) & 0xFFFF) + 0xC0
SceneflagManager::sInstance->unsetZoneflag_i(
dStage_c::GetInstance()->getCurrRoomId(), (params1n2 >> 16) & 0xFFFF
);
break;
case EVENT_DELAY:
@@ -337,7 +337,7 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) {
break;
case EVENT_SET_ITEM: {
u16 flag = params1n2 & 0xFFFF;
ItemflagManager::sInstance->setFlag(flag | 0x4000);
ItemflagManager::sInstance->setItemFlag(flag);
switch (params1n2) {
case ITEM_FARORES_COURAGE:
case ITEM_NAYRUS_WISDOM:
@@ -380,7 +380,7 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) {
} else if (counter == 0x1F3) {
counter = dAcItem_c::getTotalBombCount();
} else {
counter = ItemflagManager::sInstance->getCounterOrFlag(counter | 0x4000);
counter = ItemflagManager::sInstance->getItemCounterOrFlag(counter);
}
if (counter >= threshold) {
@@ -394,23 +394,23 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) {
case EVENT_ADD_ITEM: {
u16 flag = (params1n2 >> 16) & 0xFFFF;
s16 change = (s16)(params1n2 & 0xFFFF);
s32 value = ItemflagManager::sInstance->getCounterOrFlag(flag | 0x4000);
s32 value = ItemflagManager::sInstance->getItemCounterOrFlag(flag);
value += change;
if (value < 0) {
value = 0;
} else if (value > 0x8000) {
value = 0x7FFF;
}
ItemflagManager::sInstance->setFlagOrCounterToValue(flag | 0x4000, value);
ItemflagManager::sInstance->setItemFlagOrCounterToValue(flag, value);
break;
}
case EVENT_SET_TEMPFLAG:
dStageMgr_c::GetInstance()->getFlagIndex();
SceneflagManager::sInstance->setFlag(0x3F, ((params1n2 >> 16) & 0xFFFF) + 0x80);
SceneflagManager::sInstance->setTempflag_i(0x3F, (params1n2 >> 16) & 0xFFFF);
break;
case EVENT_UNSET_TEMPFLAG:
dStageMgr_c::GetInstance()->getFlagIndex();
SceneflagManager::sInstance->unsetFlag(0x3F, ((params1n2 >> 16) & 0xFFFF) + 0x80);
SceneflagManager::sInstance->unsetTempflag_i(0x3F, (params1n2 >> 16) & 0xFFFF);
break;
case EVENT_LIGHT_PILLAR_30: {
s8 p4 = (params1n2 >> 24) & 0xFF;
@@ -746,8 +746,8 @@ u16 dFlow_c::branchHandler04(const MsbFlowInfo *element) const {
}
u16 dFlow_c::branchHandler05(const MsbFlowInfo *element) const {
return !SceneflagManager::sInstance->checkFlag(
dStage_c::GetInstance()->getCurrRoomId(), (element->params1n2 & 0xFFFF) + 0xC0
return !SceneflagManager::sInstance->checkZoneflag_i(
dStage_c::GetInstance()->getCurrRoomId(), element->params1n2 & 0xFFFF
);
}
@@ -764,7 +764,7 @@ u16 dFlow_c::branchHandler08(const MsbFlowInfo *element) const {
}
u16 dFlow_c::branchHandler09(const MsbFlowInfo *element) const {
return !SceneflagManager::sInstance->checkFlag(0x3F, (element->params1n2 & 0xFFFF) + 0x80);
return !SceneflagManager::sInstance->checkTempflag_i(0x3F, element->params1n2 & 0xFFFF);
}
u16 dFlow_c::branchHandler10(const MsbFlowInfo *element) const {
@@ -892,7 +892,7 @@ u16 dFlow_c::branchHandler20(const MsbFlowInfo *element) const {
u16 dFlow_c::branchHandler21(const MsbFlowInfo *element) const {
u16 ret = 0;
if (matchesUnknownActorCategory(FiContext::getTargetActorId())) {
if (shouldActorShowKillCount(FiContext::getTargetActorId())) {
ret = 1;
}
return ret;
@@ -1086,12 +1086,13 @@ bool dFlow_c::advanceUntil(s32 searchType, s32 searchParam3, s32 *pOutParams1n2)
return 0;
}
static const s32 sTargetActorIds[] = {0, 1, 10, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 65, 67, 77, 81, 87, 88, 89, 90, -1};
// TODO: Where are these IDs from?
static const s32 sActorsWithKillCount[] = {0, 1, 10, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 65, 67, 77, 81, 87, 88, 89, 90, -1};
bool dFlow_c::matchesUnknownActorCategory(s32 id) const {
for (s32 i = 0; sTargetActorIds[i] >= 0; i++) {
if (sTargetActorIds[i] == id) {
bool dFlow_c::shouldActorShowKillCount(s32 id) const {
for (s32 i = 0; sActorsWithKillCount[i] >= 0; i++) {
if (sActorsWithKillCount[i] == id) {
return true;
}
}
+2 -2
View File
@@ -46,7 +46,7 @@ u16 ItemStoryManagerBase::getFlag(u16 flag) const {
}
/** 800bf4e0 */
u16 ItemStoryManagerBase::getUncommittedValue_Priv(u16 flag) {
u16 ItemStoryManagerBase::getUncommittedValue_Priv(u16 flag) const {
u16 *data = mpFlagSpace->getFlagPtrUnchecked();
return mpFlagIndex->getCounterOrFlag(flag, data, mFlagCount);
}
@@ -80,7 +80,7 @@ u16 ItemStoryManagerBase::getCounterOrFlag(u16 flag) const {
}
/** 800bf5f0 */
u16 ItemStoryManagerBase::getUncommittedValue(u16 flag) {
u16 ItemStoryManagerBase::getUncommittedValue(u16 flag) const {
return getUncommittedValue_Priv(flag);
}
+1 -1
View File
@@ -2,7 +2,7 @@
#include "common.h"
bool BitwiseFlagHelper::checkFlag(u16 slot, u16 shift, const u16 *pData, u16 flagCount) {
bool BitwiseFlagHelper::checkFlag(u16 slot, u16 shift, const u16 *pData, u16 flagCount) const {
return (pData[slot] >> shift) & 1;
}
void BitwiseFlagHelper::setFlag(u16 slot, u16 shift, u16 *pData, u16 flagCount) {
+26 -39
View File
@@ -19,21 +19,15 @@ SceneflagManager::SceneflagManager()
}
s32 SceneflagManager::isNotTempOrZoneFlag(u16 flag) {
// return ((s32)flag - 0x80) < 0;
return flag < 0x80;
return flag < TEMPFLAG_OFFSET;
}
inline s32 possiblyZoneFlag(u32 flag) {
return flag >= 0xC0;
}
s32 SceneflagManager::isZoneFlag(u32 flag) {
if (possiblyZoneFlag(flag) && flag < 0x100) {
s32 SceneflagManager::isZoneFlag(u32 flag) const {
if (ZONEFLAG_OFFSET <= flag && flag < 0x100) {
return 1;
} else {
return 0;
}
// return flag >= 0xC0 && flag < 0x100;
}
void SceneflagManager::updateFlagindex(u16 sceneIdx) {
if (sceneIdx != mSceneIdx) {
@@ -43,9 +37,7 @@ void SceneflagManager::updateFlagindex(u16 sceneIdx) {
}
}
void SceneflagManager::copyFromSave(u32 sceneIdx) {
// sceneIdx &= 0xFFFF;
u16 sceneIdx2 = sceneIdx;
// missing clrlwi, more inlines?
mSceneIdx = sceneIdx2;
mSceneflags.copyFromSaveFile2(FileManager::GetInstance()->getSceneFlagsConst() + sceneIdx2 * 8, 0, 8);
mTempflags.copyFromSaveFile(FileManager::GetInstance()->getTempFlagsConst(), 0, mTempflags.mCount);
@@ -81,23 +73,23 @@ void SceneflagManager::unsetZoneflagsForRoom(u16 roomId) {
// ? weird mask
mZoneflags.setAllToZero((roomId & 0x3FF) * 4, 4);
}
u16 SceneflagManager::getZoneflagSlot(u16 roomId, u16 flag) {
u16 SceneflagManager::getZoneflagSlot(u16 roomId, u16 flag) const {
return (flag + roomId * 0x40) >> 4 & 0xFFF;
}
u16 SceneflagManager::getSceneflagSlotGlobal(u16 sceneIdx, u16 flag) {
u16 SceneflagManager::getSceneflagSlotGlobal(u16 sceneIdx, u16 flag) const {
return (flag + sceneIdx * 0x80) >> 4 & 0xFFF;
}
u16 SceneflagManager::getSceneflagSlot(u16 flag) {
u16 SceneflagManager::getSceneflagSlot(u16 flag) const {
return flag >> 4 & 0xFFF;
}
u16 SceneflagManager::getTempflagSlot(u16 flag) {
u16 SceneflagManager::getTempflagSlot(u16 flag) const {
return flag >> 4 & 0xFFF;
}
bool SceneflagManager::checkZoneFlag(u16 roomId, u16 flag) {
bool SceneflagManager::checkZoneFlag(u16 roomId, u16 flag) const {
if (flag == 0xFF) {
return false;
} else {
u16 zoneflag = flag - 0xC0;
u16 zoneflag = flag - ZONEFLAG_OFFSET;
u16 *pData = FileManager::GetInstance()->getZoneFlagsConst();
u16 slot = getZoneflagSlot(roomId, zoneflag);
return mFlagHelper.checkFlag(slot, zoneflag % 16, pData, 0xFC);
@@ -108,43 +100,38 @@ bool SceneflagManager::checkUncommittedZoneflag(u16 roomId, u16 flag) {
return false;
} else {
u16 *pData;
u16 zoneflag = flag - 0xC0;
u16 zoneflag = flag - ZONEFLAG_OFFSET;
pData = mZoneflags.getFlagPtrUnchecked();
u16 slot = getZoneflagSlot(roomId, zoneflag);
return mFlagHelper.checkFlag(slot, zoneflag % 16, pData, mZoneflags.mCount);
}
}
inline bool SceneflagManager::checkSceneflagHelper(u16 flag) {
u16 *pData;
pData = mSceneflags.getFlagPtrUnchecked();
// u16 slot = getSceneflagSlot2(flag);
return mFlagHelper.checkFlag(getSceneflagSlot(flag), flag % 16, pData, mSceneflags.mCount);
}
bool SceneflagManager::checkUncommittedTempOrSceneflag(u16 flag) {
if (flag >= 0x80) {
u16 *pData;
u16 tempflag = flag - 0x80;
u16 *pData;
if (flag >= TEMPFLAG_OFFSET) {
u16 tempflag = flag - TEMPFLAG_OFFSET;
pData = mTempflags.getFlagPtrUnchecked();
u16 slot = getTempflagSlot(tempflag);
return mFlagHelper.checkFlag(slot, tempflag % 16, pData, mTempflags.mCount);
} else {
return checkSceneflagHelper(flag);
pData = mSceneflags.getFlagPtrUnchecked();
return mFlagHelper.checkFlag(getSceneflagSlot(flag), flag % 16, pData, mSceneflags.mCount);
}
}
u16 SceneflagManager::checkFlag(u16 roomId, u16 flag) {
u16 SceneflagManager::checkFlag(u16 roomId, u16 flag) const {
if (isZoneFlag(flag)) {
return checkZoneFlag(roomId, flag);
} else {
return checkTempOrSceneflag(flag);
}
}
u16 SceneflagManager::checkSceneflagGlobal(u16 sceneIdx, u16 flag) {
u16 SceneflagManager::checkSceneflagGlobal(u16 sceneIdx, u16 flag) const {
u16 *pData = FileManager::GetInstance()->getSceneFlagsConst();
return mFlagHelper.checkFlag(getSceneflagSlotGlobal(sceneIdx, flag), flag % 16, pData, 0x800);
}
u16 SceneflagManager::checkTempOrSceneflag(u16 flag) {
if (flag >= 0x80) {
u16 tempflag = flag - 0x80;
u16 SceneflagManager::checkTempOrSceneflag(u16 flag) const {
if (flag >= TEMPFLAG_OFFSET) {
u16 tempflag = flag - TEMPFLAG_OFFSET;
const u16 *pData = FileManager::GetInstance()->getTempFlagsConst();
u16 slot = getTempflagSlot(tempflag);
return mFlagHelper.checkFlag(slot, tempflag % 16, pData, 4);
@@ -162,7 +149,7 @@ u16 SceneflagManager::checkUncommittedFlag(u16 roomId, u16 flag) {
void SceneflagManager::setZoneflag(u16 roomId, u16 flag) {
if (checkUncommittedZoneflag2(roomId, flag) != 1 && flag != 0xFF) {
u16 *pData;
u16 zoneflag = flag - 0xC0;
u16 zoneflag = flag - ZONEFLAG_OFFSET;
pData = mZoneflags.getFlagPtrChecked();
u16 slot = getZoneflagSlot(roomId, zoneflag);
mFlagHelper.setFlag(slot, zoneflag % 16, pData, mZoneflags.mCount);
@@ -191,8 +178,8 @@ void SceneflagManager::setSceneflagGlobal(u16 sceneIdx, u16 flag) {
void SceneflagManager::setTempOrSceneflag(u16 flag) {
if (checkUncommittedTempOrSceneflag2(flag) != 1) {
u16 *pData;
if (flag >= 0x80) {
u16 tempflag = flag - 0x80;
if (flag >= TEMPFLAG_OFFSET) {
u16 tempflag = flag - TEMPFLAG_OFFSET;
pData = mTempflags.getFlagPtrChecked();
mFlagHelper.setFlag(getTempflagSlot(tempflag), tempflag % 16, pData, mTempflags.mCount);
} else {
@@ -205,7 +192,7 @@ void SceneflagManager::setTempOrSceneflag(u16 flag) {
void SceneflagManager::unsetZoneflag(u16 roomId, u16 flag) {
if (checkUncommittedZoneflag2(roomId, flag) != 0 && flag != 0xFF) {
u16 *pData;
u16 zoneflag = flag - 0xC0;
u16 zoneflag = flag - ZONEFLAG_OFFSET;
pData = mZoneflags.getFlagPtrChecked();
u16 slot = getZoneflagSlot(roomId, zoneflag);
mFlagHelper.unsetFlag(slot, zoneflag % 16, pData, mZoneflags.mCount);
@@ -234,8 +221,8 @@ void SceneflagManager::unsetSceneflagGlobal(u16 sceneIdx, u16 flag) {
void SceneflagManager::unsetTempOrSceneflag(u16 flag) {
if (checkUncommittedTempOrSceneflag2(flag) != 0) {
u16 *pData;
if (flag >= 0x80) {
u16 tempflag = flag - 0x80;
if (flag >= TEMPFLAG_OFFSET) {
u16 tempflag = flag - TEMPFLAG_OFFSET;
pData = mTempflags.getFlagPtrChecked();
mFlagHelper.unsetFlag(getTempflagSlot(tempflag), tempflag % 16, pData, mTempflags.mCount);
} else {
+3 -3
View File
@@ -22,13 +22,13 @@
}
/* 8016cd30 */ u16 Counter::getCommittedValue() const {
return ItemflagManager::sInstance->getCounterOrFlag(counterId | 0x4000);
return ItemflagManager::sInstance->getItemCounterOrFlag(counterId);
}
/* 8016cd50 */ u16 Counter::getUncommittedValue() const {
return ItemflagManager::sInstance->getUncommittedValue(counterId | 0x4000);
return ItemflagManager::sInstance->getUncommittedItemValue(counterId);
}
/* 8016cd70 */ void Counter::setValue(u16 num) {
ItemflagManager::sInstance->setFlagOrCounterToValue(counterId | 0x4000, num);
ItemflagManager::sInstance->setItemFlagOrCounterToValue(counterId, num);
}