diff options
| -rw-r--r-- | koopatlas.yaml | 4 | ||||
| -rw-r--r-- | src/creditsMgr.cpp | 2 | ||||
| -rw-r--r-- | src/koopatlas/core.cpp | 7 | ||||
| -rw-r--r-- | src/koopatlas/core.h | 1 | ||||
| -rw-r--r-- | src/koopatlas/map.cpp | 3 | ||||
| -rw-r--r-- | src/koopatlas/pathmanager.cpp | 110 | ||||
| -rw-r--r-- | src/koopatlas/pathmanager.h | 3 | ||||
| -rw-r--r-- | src/koopatlas/player.cpp | 2 | 
8 files changed, 111 insertions, 21 deletions
| diff --git a/koopatlas.yaml b/koopatlas.yaml index 1b619c9..c653192 100644 --- a/koopatlas.yaml +++ b/koopatlas.yaml @@ -114,3 +114,7 @@ hooks:      src_addr_pal: 0x801028D0      target_func: 'UpdateFSStars(void)' +  - name: DisableExitStageWorldMapOverride +    type: patch +    addr_pal: 0x80102528 +    data: '281D7777' diff --git a/src/creditsMgr.cpp b/src/creditsMgr.cpp index f680ed5..4f30bc4 100644 --- a/src/creditsMgr.cpp +++ b/src/creditsMgr.cpp @@ -564,7 +564,7 @@ void dCreditsMgr_c::theEnd() {  	GetTheEnd()->willShow = true;  }  void dCreditsMgr_c::exitStage() { -	ExitStage(WORLD_MAP, 0, BEAT_LEVEL, CIRCLE_WIPE); +	ExitStage(WORLD_MAP, 0x20000000, BEAT_LEVEL, CIRCLE_WIPE);  }  Vec2 dCreditsMgr_c::_vf70() { diff --git a/src/koopatlas/core.cpp b/src/koopatlas/core.cpp index c86c696..810c25d 100644 --- a/src/koopatlas/core.cpp +++ b/src/koopatlas/core.cpp @@ -414,6 +414,13 @@ int dScKoopatlas_c::onCreate() {  		isAfter8Castle = true;  	} +	isEndingScene = (settings & 0x20000000); +	if (isEndingScene) { +		currentMapID = 0; +		save->current_world = 0; +		save->current_path_node = 0; +	} +  	somethingAboutSound(_8042A788);  	return true; diff --git a/src/koopatlas/core.h b/src/koopatlas/core.h index a48e96c..8fbbf5d 100644 --- a/src/koopatlas/core.h +++ b/src/koopatlas/core.h @@ -119,6 +119,7 @@ class dScKoopatlas_c : public dScene_c {  		bool isFirstPlay;  		bool isAfterKamekCutscene;  		bool isAfter8Castle; +		bool isEndingScene;  		void startMusic();  		bool warpZoneHacks; diff --git a/src/koopatlas/map.cpp b/src/koopatlas/map.cpp index e12767e..84c7c45 100644 --- a/src/koopatlas/map.cpp +++ b/src/koopatlas/map.cpp @@ -505,6 +505,9 @@ void dWMMap_c::renderPathLayer(dKPLayer_s *layer) {  		dKPNode_s *node = layer->nodes[i];  		if (node->type == dKPNode_s::LEVEL) { +			if (node->levelNumber[0] == 80) +				continue; +  			short rz = 0x6000;  			short rx = 0x4000;  			short ry = 0x8000; diff --git a/src/koopatlas/pathmanager.cpp b/src/koopatlas/pathmanager.cpp index b555b41..162084d 100644 --- a/src/koopatlas/pathmanager.cpp +++ b/src/koopatlas/pathmanager.cpp @@ -154,25 +154,28 @@ void dWMPathManager_c::setup() {  			SpammyReport("OK %p\n", currentNode);  		} +		int findW = -1, findL = -1; +		bool storeIt = true; +  		if (wm->isAfterKamekCutscene) { -			// look for the 8-1 node -			for (int i = 0; i < pathLayer->nodeCount; i++) { -				dKPNode_s *node = pathLayer->nodes[i]; -				if (node->type == dKPNode_s::LEVEL && node->levelNumber[0] == 8 && node->levelNumber[1] == 1) { -					currentNode = node; -					save->current_path_node = i; -					break; -				} -			} +			findW = 8; +			findL = 1; +		} else if (wm->isAfter8Castle) { +			findW = 8; +			findL = 5; +		} else if (wm->isEndingScene) { +			findW = 80; +			findL = 80; +			storeIt = false;  		} - -		if (wm->isAfter8Castle) { -			// warp to 8-L +		if (findW > -1) { +			// look for the 8-1 node  			for (int i = 0; i < pathLayer->nodeCount; i++) {  				dKPNode_s *node = pathLayer->nodes[i]; -				if (node->type == dKPNode_s::LEVEL && node->levelNumber[0] == 8 && node->levelNumber[1] == 5) { +				if (node->type == dKPNode_s::LEVEL && node->levelNumber[0] == findW && node->levelNumber[1] == findL) {  					currentNode = node; -					save->current_path_node = i; +					if (storeIt) +						save->current_path_node = i;  					break;  				}  			} @@ -261,7 +264,7 @@ void dWMPathManager_c::setup() {  	ResetAllCompletionCandidates(); -	if (wm->isAfterKamekCutscene) +	if (wm->isAfterKamekCutscene || wm->isEndingScene)  		copyWorldDefToSave(wm->mapData.findWorldDef(1));  	finalisePathUnlocks(); @@ -507,7 +510,7 @@ void dWMPathManager_c::unlockPaths() {  	dScKoopatlas_c *wm = dScKoopatlas_c::instance;  	bool forceFlag = (wm->isAfter8Castle || wm->isAfterKamekCutscene); -	if (oldPathAvData || forceFlag) { +	if (!wm->isEndingScene && (oldPathAvData || forceFlag)) {  		for (int i = 0; i < pathLayer->pathCount; i++) {  			if ((PathAvailabilityData[i] > 0) && (forceFlag || oldPathAvData[i] == 0)) {  				if (forceFlag && PathAvailabilityData[i] == dKPPath_s::ALWAYS_AVAILABLE) @@ -530,10 +533,55 @@ void dWMPathManager_c::unlockPaths() {  				newlyAvailableNodes++;  			}  		} +	} + +	if (oldPathAvData) { +		delete[] oldPathAvData; +		delete[] oldNodeAvData; +	} + +	if (wm->isEndingScene) { +		dKPNode_s *yoshiHouse = 0; +		for (int i = 0; i < pathLayer->nodeCount; i++) { +			dKPNode_s *node = pathLayer->nodes[i]; + +			if (node->type != dKPNode_s::LEVEL) +				continue; +			if (node->levelNumber[0] != 1) +				continue; +			if (node->levelNumber[1] != 41) +				continue; + +			yoshiHouse = node; +			break; +		} -		if (oldPathAvData) { -			delete[] oldPathAvData; -			delete[] oldNodeAvData; +		if (yoshiHouse) { +			dKPNode_s *currentNode = yoshiHouse; +			dKPPath_s *nextPath = yoshiHouse->rightExit; + +			while (true) { +				if (nextPath->isAvailable == dKPPath_s::AVAILABLE) { +					nextPath->isAvailable = dKPPath_s::NEWLY_AVAILABLE; +					newlyAvailablePaths++; +					nextPath->setLayerAlpha(0); +				} + +				dKPNode_s *nextNode = nextPath->getOtherNodeTo(currentNode); +				if (!nextNode) +					break; + +				if (nextNode->isUnlocked()) { +					nextNode->isNew = true; +					newlyAvailableNodes++; +				} + +				currentNode = nextNode; +				nextPath = nextNode->getOppositeExitTo(nextPath); + +				if (!nextPath) +					break; +			}  		}  	} @@ -636,7 +684,8 @@ bool dWMPathManager_c::doingThings() {  			(waitAtStart > 0) || (waitAfterInitialPlayerAnim > 0) ||  			panningCameraToPaths || panningCameraFromPaths ||  			(waitBeforePanBack > 0) || !initialLoading || -			(countdownToFadeIn > 0) || (unlockingAlpha != -1)) +			(countdownToFadeIn > 0) || (unlockingAlpha != -1) || +			dScKoopatlas_c::instance->isEndingScene)  		return true;  	if (isMoving) @@ -827,6 +876,27 @@ void dWMPathManager_c::execute() {  		return;  	} +	if (dScKoopatlas_c::instance->isEndingScene) { +		// WE GO NO FURTHER +		if (!waitingForEndingTransition) { +			if (!savingForEnding) { +				savingForEnding = true; + +				SaveBlock *save = GetSaveFile()->GetBlock(-1); +				save->titleScreenWorld = 3; +				save->titleScreenLevel = 9; + +				SaveGame(0, false); +			} else { +				if (!GetSaveFile()->CheckIfWriting()) { +					StartTitleScreenStage(false, 0); +					waitingForEndingTransition = true; +				} +			} +		} +		return; +	} +  	if (shouldRequestSave) {  		dScKoopatlas_c::instance->showSaveWindow();  		shouldRequestSave = false; diff --git a/src/koopatlas/pathmanager.h b/src/koopatlas/pathmanager.h index 27fcfd6..afd8103 100644 --- a/src/koopatlas/pathmanager.h +++ b/src/koopatlas/pathmanager.h @@ -81,6 +81,9 @@ class dWMPathManager_c {  		int waitAfterUnlock;  		int waitBeforePanBack; +		bool savingForEnding; +		bool waitingForEndingTransition; +  	private:  		void unlockPaths();  		void finalisePathUnlocks(); diff --git a/src/koopatlas/player.cpp b/src/koopatlas/player.cpp index 1c68222..6bd4371 100644 --- a/src/koopatlas/player.cpp +++ b/src/koopatlas/player.cpp @@ -114,6 +114,8 @@ int daWMPlayer_c::onExecute() {  int daWMPlayer_c::onDraw() {  	if (!visible)  		return true; +	if (dScKoopatlas_c::instance->isEndingScene) +		return true;  	this->modelHandler->draw();  	hammerSuit.draw(); | 
