summaryrefslogtreecommitdiff
path: root/src/koopatlas/pathmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/koopatlas/pathmanager.cpp202
1 files changed, 167 insertions, 35 deletions
diff --git a/src/koopatlas/pathmanager.cpp b/src/koopatlas/pathmanager.cpp
index 89b9f59..48590f9 100644
--- a/src/koopatlas/pathmanager.cpp
+++ b/src/koopatlas/pathmanager.cpp
@@ -50,12 +50,14 @@ void dWMPathManager_c::setup() {
levelStartWait = -1;
unlockPaths();
- waitForAfterDeathAnim = -1;
- mustPlayAfterDeathAnim = false;
+ waitAfterInitialPlayerAnim = -1;
if (LastPowerupStoreType == LOSE_LEVEL) {
mustPlayAfterDeathAnim = true;
daWMPlayer_c::instance->visible = false;
LastPowerupStoreType = BEAT_LEVEL;
+ } else if (LastPowerupStoreType == BEAT_LEVEL && LastLevelPlayed[0] != 0xFF) {
+ mustPlayAfterWinAnim = true;
+ daWMPlayer_c::instance->visible = false;
}
SpammyReport("done\n");
@@ -78,7 +80,7 @@ void dWMPathManager_c::setup() {
found = true;
currentNode = node;
- //OSReport("Found CHANGE node: %d %p\n", changeID, node);
+ SpammyReport("Found CHANGE node: %d %p\n", changeID, node);
// figure out where we should move to
dKPPath_s *exitTo = 0;
@@ -237,6 +239,8 @@ void dWMPathManager_c::setup() {
if (wm->isAfterKamekCutscene)
copyWorldDefToSave(wm->mapData.findWorldDef(1));
+
+ finalisePathUnlocks();
}
static u8 *PathAvailabilityData = 0;
@@ -505,10 +509,13 @@ void dWMPathManager_c::unlockPaths() {
node->setLayerAlpha((node->isUnlocked() & !node->isNew) ? 255 : 0);
}
+}
+void dWMPathManager_c::finalisePathUnlocks() {
// if anything was new, set it as such
if (newlyAvailablePaths || newlyAvailableNodes) {
countdownToFadeIn = 30;
+ findCameraBoundsForUnlockedPaths();
}
unlockingAlpha = -1;
}
@@ -592,7 +599,9 @@ bool dWMPathManager_c::evaluateUnlockCondition(u8 *&in, SaveBlock *save, int sta
bool dWMPathManager_c::doingThings() {
if (isEnteringLevel || (waitAfterUnlock > 0) || (completionAnimDelay > 0) ||
- (waitAtStart > 0) || (waitForAfterDeathAnim > 0) ||
+ (waitAtStart > 0) || (waitAfterInitialPlayerAnim > 0) ||
+ panningCameraToPaths || panningCameraFromPaths ||
+ (waitBeforePanBack > 0) ||
(countdownToFadeIn > 0) || (unlockingAlpha != -1))
return true;
@@ -613,11 +622,52 @@ void dWMPathManager_c::execute() {
return;
}
+ if (waitAtStart > 0) {
+ waitAtStart--;
+ if (waitAtStart == 0) {
+ if (mustPlayAfterDeathAnim) {
+ daWMPlayer_c::instance->visible = true;
+ daWMPlayer_c::instance->startAnimation(ending_wait, 1.0f, 0.0f, 0.0f);
+ waitAfterInitialPlayerAnim = 60;
+
+ nw4r::snd::SoundHandle something;
+ PlaySoundWithFunctionB4(SoundRelatedClass, &something, SE_VOC_MA_CS_COURSE_MISS, 1);
+ } else if (mustPlayAfterWinAnim) {
+ daWMPlayer_c::instance->visible = true;
+ daWMPlayer_c::instance->startAnimation(dm_surp_wait, 1.0f, 0.0f, 0.0f);
+ waitAfterInitialPlayerAnim = 38;
+
+ nw4r::snd::SoundHandle something;
+ PlaySoundWithFunctionB4(SoundRelatedClass, &something, SE_VOC_MA_CS_JUMP, 1);
+ }
+ }
+ return;
+ }
+
+ if (waitAfterInitialPlayerAnim > 0) {
+ waitAfterInitialPlayerAnim--;
+ if (waitAfterInitialPlayerAnim == 0)
+ daWMPlayer_c::instance->startAnimation(wait_select, 1.0f, 0.0f, 0.0f);
+ if (mustPlayAfterWinAnim && (waitAfterInitialPlayerAnim == 9)) {
+ nw4r::snd::SoundHandle something;
+ PlaySoundWithFunctionB4(SoundRelatedClass, &something, SE_PLY_LAND_ROCK, 1);
+ }
+ return;
+ }
+
+
// handle path fading
if (countdownToFadeIn > 0) {
countdownToFadeIn--;
if (countdownToFadeIn <= 0) {
- unlockingAlpha = 0;
+ if (camBoundsValid) {
+ dWorldCamera_c::instance->currentX = currentNode->x;
+ dWorldCamera_c::instance->currentY = -currentNode->y;
+ dWorldCamera_c::instance->panToBounds(camMinX, camMinY, camMaxX, camMaxY);
+
+ panningCameraToPaths = true;
+ } else
+ unlockingAlpha = 0;
nw4r::snd::SoundHandle something;
PlaySoundWithFunctionB4(SoundRelatedClass, &something, SE_OBJ_GEN_LOAD, 1);
@@ -626,6 +676,13 @@ void dWMPathManager_c::execute() {
}
}
+ if (panningCameraToPaths) {
+ if (dWorldCamera_c::instance->panning)
+ return;
+ panningCameraToPaths = false;
+ unlockingAlpha = 0;
+ }
+
if (unlockingAlpha != -1) {
unlockingAlpha += 3;
@@ -648,6 +705,7 @@ void dWMPathManager_c::execute() {
unlockingAlpha = -1;
nw4r::snd::SoundHandle something;
PlaySoundWithFunctionB4(SoundRelatedClass, &something, SE_OBJ_GEN_NEW_COURSE, 1);
+
waitAfterUnlock = 15;
for (int i = 0; i < pathLayer->nodeCount; i++) {
@@ -667,16 +725,36 @@ void dWMPathManager_c::execute() {
if (waitAfterUnlock > 0) {
waitAfterUnlock--;
+ if (waitAfterUnlock == 0)
+ waitBeforePanBack = 20;
return;
}
+ if (waitBeforePanBack > 0) {
+ waitBeforePanBack--;
+ if (waitBeforePanBack == 0 && camBoundsValid) {
+ dWorldCamera_c::instance->panToPosition(
+ currentNode->x, -currentNode->y,
+ STD_ZOOM);
+ panningCameraFromPaths = true;
+ }
+ }
+
+ if (panningCameraFromPaths) {
+ if (dWorldCamera_c::instance->panning)
+ return;
+ panningCameraFromPaths = false;
+ dWorldCamera_c::instance->followPlayer = true;
+ }
+
+ if (dmGladDuration > 0) {
+ dmGladDuration--;
+ if (dmGladDuration == 0)
+ daWMPlayer_c::instance->startAnimation(wait_select, 1.0f, 0.0f, 0.0f);
+ }
+
if (completionAnimDelay > 0) {
completionAnimDelay--;
- if (dmGladDuration > 0) {
- dmGladDuration--;
- if (dmGladDuration == 0)
- daWMPlayer_c::instance->startAnimation(wait_select, 1.0f, 0.0f, 0.0f);
- }
if (completionAnimDelay == 0)
completionMessagePending = true;
return;
@@ -710,35 +788,17 @@ void dWMPathManager_c::execute() {
return;
}
- if (waitAtStart > 0) {
- waitAtStart--;
- if (waitAtStart == 0) {
- if (mustPlayAfterDeathAnim) {
- daWMPlayer_c::instance->visible = true;
- daWMPlayer_c::instance->startAnimation(ending_wait, 1.0f, 0.0f, 0.0f);
- waitForAfterDeathAnim = 60;
-
- nw4r::snd::SoundHandle something;
- PlaySoundWithFunctionB4(SoundRelatedClass, &something, SE_VOC_MA_CS_COURSE_MISS, 1);
- }
-
- dScKoopatlas_c::instance->startMusic();
- }
- return;
- }
-
- if (waitForAfterDeathAnim > 0) {
- waitForAfterDeathAnim--;
- if (waitForAfterDeathAnim == 0)
- daWMPlayer_c::instance->startAnimation(wait_select, 1.0f, 0.0f, 0.0f);
- return;
- }
-
if (shouldRequestSave) {
dScKoopatlas_c::instance->showSaveWindow();
shouldRequestSave = false;
}
+ if (!initialLoading) {
+ dScKoopatlas_c::instance->startMusic();
+ dWMHud_c::instance->loadInitially();
+ initialLoading = true;
+ }
+
int nowPressed = Remocon_GetPressed(GetActiveRemocon());
// Left, right, up, down
@@ -1191,7 +1251,7 @@ void dWMPathManager_c::moveThroughPath(int pressedDir) {
} else if (reallyStop) {
// Stop here
- player->startAnimation(0, 1.2, 10.0, 0.0);
+ player->startAnimation(wait_select, 1.2, 10.0, 0.0);
player->hasEffect = false;
player->hasSound = false;
@@ -1314,3 +1374,75 @@ void dWMPathManager_c::unlockAllPaths(char type) {
}
+
+
+void dWMPathManager_c::findCameraBoundsForUnlockedPaths() {
+ dKPMapData_c *data = &dScKoopatlas_c::instance->mapData;
+
+ camMinX = 10000;
+ camMaxX = 0;
+ camMinY = 10000;
+ camMaxY = 0;
+
+ nodeStackLength = 0;
+ for (int i = 0; i < data->pathLayer->nodeCount; i++)
+ data->pathLayer->nodes[i]->reserved1 = false;
+
+ visitNodeForCamCheck(currentNode);
+ OSReport("Worked out camera bounds: %d,%d to %d,%d with validity %d\n", camMinX, camMinY, camMaxX, camMaxY, camBoundsValid);
+}
+
+void dWMPathManager_c::visitNodeForCamCheck(dKPNode_s *node) {
+ // Yay.
+ nodeStackLength++;
+ node->reserved1 = true;
+
+ for (int i = 0; i < 4; i++) {
+ dKPPath_s *path = node->exits[i];
+ if (!path)
+ continue;
+
+ OSReport("Checking path %p, whose status is %d\n", path, path->isAvailable);
+ if (path->isAvailable == dKPPath_s::NEWLY_AVAILABLE) {
+ addNodeToCameraBounds(path->start);
+ addNodeToCameraBounds(path->end);
+ }
+
+ // Should we follow the other node?
+ dKPNode_s *otherNode = path->getOtherNodeTo(node);
+
+ if (otherNode->reserved1)
+ continue;
+ if (otherNode->type == otherNode->LEVEL) {
+ OSReport("Not travelling to %p because it's level %d-%d\n", otherNode, otherNode->levelNumber[0], otherNode->levelNumber[1]);
+ continue;
+ }
+ if (otherNode->type == otherNode->CHANGE) {
+ OSReport("Not travelling to %p because it's a change\n", otherNode);
+ continue;
+ }
+ if (otherNode->type == otherNode->WORLD_CHANGE) {
+ OSReport("Not travelling to %p because it's a world change\n", otherNode);
+ continue;
+ }
+
+ visitNodeForCamCheck(otherNode);
+ }
+
+ nodeStackLength--;
+}
+
+void dWMPathManager_c::addNodeToCameraBounds(dKPNode_s *node) {
+ camBoundsValid = true;
+ OSReport("Adding node to camera bounds: %p at %d,%d\n", node, node->x, node->y);
+
+ if (node->x < camMinX)
+ camMinX = node->x;
+ if (node->x > camMaxX)
+ camMaxX = node->x;
+ if (node->y < camMinY)
+ camMinY = node->y;
+ if (node->y > camMaxY)
+ camMaxY = node->y;
+}
+