diff options
Diffstat (limited to 'src/koopatlas/pathmanager.cpp')
-rw-r--r-- | src/koopatlas/pathmanager.cpp | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/src/koopatlas/pathmanager.cpp b/src/koopatlas/pathmanager.cpp index 6c58107..fa618b0 100644 --- a/src/koopatlas/pathmanager.cpp +++ b/src/koopatlas/pathmanager.cpp @@ -110,31 +110,47 @@ void dWMPathManager_c::unlockPaths() { SaveBlock *save = GetSaveFile()->GetBlock(-1); u8 *in = (u8*)dScKoopatlas_c::instance->mapData.data->unlockData; + OSReport("UNLOCKING PATHS: Unlock data @ %p\n", in); + + int cmdID = 0; while (*in != 0) { + OSReport("[%p] Cmd %d: Evaluating condition\n", in, cmdID); // begin processing a block - bool value = evaluateUnlockCondition(in, save); + bool value = evaluateUnlockCondition(in, save, 0); + OSReport("[%p] Cmd %d: Condition evaluated, result: %d\n", in, cmdID, value); //OSReport("Unlock condition: %d\n", value); // get what it's supposed to affect // for now we'll assume that it affects one or more paths u8 affectedCount = *(in++); + OSReport("[%p] Cmd %d: Affects %d path(s)\n", in, cmdID, affectedCount); for (int i = 0; i < affectedCount; i++) { u8 one = *(in++); u8 two = *(in++); u16 pathID = (one << 8) | two; + OSReport("[%p] Cmd %d: Affected %d: PathID: %d\n", in, cmdID, i, pathID); dKPPath_s *path = pathLayer->paths[pathID]; + OSReport("[%p] Cmd %d: Affected %d: Path: %p\n", in, cmdID, i, path); path->isAvailable = value ? dKPPath_s::AVAILABLE : dKPPath_s::NOT_AVAILABLE; + OSReport("[%p] Cmd %d: Affected %d: IsAvailable written\n", in, cmdID, i); PathAvailabilityData[pathID] = value ? dKPPath_s::AVAILABLE : dKPPath_s::NOT_AVAILABLE; - //OSReport("Applied to path %p[%d]\n", path, pathID); + OSReport("[%p] Cmd %d: Affected %d: AvailabilityData written\n", in, cmdID, i); // NEWLY_AVAILABLE is set later, when that stuff is figured out path->setLayerAlpha(value ? 255 : 0); + OSReport("[%p] Cmd %d: Affected %d: Layer alpha applied\n", in, cmdID, i); } + + OSReport("[%p] Cmd %d: %d affected path(s) processed\n", in, cmdID, affectedCount); + + cmdID++; } + OSReport("UNLOCKING PATHS: All complete @ %p\n", in); + // did anything become newly available?! newlyAvailablePaths = 0; newlyAvailableNodes = 0; @@ -177,13 +193,17 @@ void dWMPathManager_c::unlockPaths() { unlockingAlpha = -1; } -bool dWMPathManager_c::evaluateUnlockCondition(u8 *&in, SaveBlock *save) { +bool dWMPathManager_c::evaluateUnlockCondition(u8 *&in, SaveBlock *save, int stack) { + OSReport("[%p] CondStk:%d begin\n", in, stack); u8 controlByte = *(in++); u8 conditionType = (controlByte >> 6); + OSReport("[%p] CondStk:%d control byte: %d; condition type: %d\n", in, stack, controlByte, conditionType); - if (conditionType == 0) + if (conditionType == 0) { + OSReport("[%p] CondStk:%d end, returning CONSTANT 1\n", in, stack); return true; + } if (conditionType == 1) { // Simple level @@ -191,8 +211,10 @@ bool dWMPathManager_c::evaluateUnlockCondition(u8 *&in, SaveBlock *save) { bool isSecret = (controlByte & 0x10); u8 worldNumber = controlByte & 0xF; u8 levelNumber = *(in++); + OSReport("[%p] CondStk:%d level, w:%d l:%d secret:%d\n", in, stack, worldNumber, levelNumber, isSecret); u32 conds = save->GetLevelCondition(worldNumber, levelNumber); + OSReport("[%p] CondStk:%d returning for level conditions: %d / %x\n", in, stack, conds, conds); if (isSecret) return (conds & COND_SECRET) != 0; @@ -207,9 +229,10 @@ bool dWMPathManager_c::evaluateUnlockCondition(u8 *&in, SaveBlock *save) { bool value = isOr ? false : true; u8 termCount = (controlByte & 0x3F) + 1; + OSReport("[%p] CondStk:%d and:%d or:%d startValue:%d termCount:%d\n", in, stack, isAnd, isOr, value, termCount); for (int i = 0; i < termCount; i++) { - bool what = evaluateUnlockCondition(in, save); + bool what = evaluateUnlockCondition(in, save, stack+1); if (isOr) value |= what; @@ -217,6 +240,7 @@ bool dWMPathManager_c::evaluateUnlockCondition(u8 *&in, SaveBlock *save) { value &= what; } + OSReport("[%p] CondStk:%d end, returning %d\n", in, stack, value); return value; } |