mirror of
https://github.com/zeldaret/ss
synced 2026-07-29 23:46:59 -04:00
Clean up flag handling
This commit is contained in:
+20
-19
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user