From 5ce91e3cd72989860e3f2a34f460a5b3c09388a9 Mon Sep 17 00:00:00 2001
From: Treeki <treeki@gmail.com>
Date: Sun, 5 May 2013 23:07:33 +0200
Subject: add continuous movement to map engine

---
 src/koopatlas/pathmanager.cpp | 35 +++++++++++++++++++++++++++++------
 1 file changed, 29 insertions(+), 6 deletions(-)

(limited to 'src/koopatlas')

diff --git a/src/koopatlas/pathmanager.cpp b/src/koopatlas/pathmanager.cpp
index c35ee4a..5acac0c 100644
--- a/src/koopatlas/pathmanager.cpp
+++ b/src/koopatlas/pathmanager.cpp
@@ -30,6 +30,14 @@ void ResetAllCompletionCandidates() {
 	CanFinishEverything = false;
 }
 
+int getPressedDir(int buttons) {
+	if (buttons & WPAD_LEFT) return 0;
+	else if (buttons & WPAD_RIGHT) return 1;
+	else if (buttons & WPAD_UP) return 2;
+	else if (buttons & WPAD_DOWN) return 3;
+	return -1;
+}
+
 void dWMPathManager_c::setup() {
 	dScKoopatlas_c *wm = dScKoopatlas_c::instance;
 
@@ -971,11 +979,7 @@ void dWMPathManager_c::execute() {
 	int nowPressed = Remocon_GetPressed(GetActiveRemocon());
 
 	// Left, right, up, down
-	int pressedDir = -1;
-	if (nowPressed & WPAD_LEFT) pressedDir = 0;
-	else if (nowPressed & WPAD_RIGHT) pressedDir = 1;
-	else if (nowPressed & WPAD_UP) pressedDir = 2;
-	else if (nowPressed & WPAD_DOWN) pressedDir = 3;
+	int pressedDir = getPressedDir(nowPressed);
 
 	if (isMoving) {
 		moveThroughPath(pressedDir);
@@ -1435,7 +1439,7 @@ void dWMPathManager_c::moveThroughPath(int pressedDir) {
 
 		} else if (reallyStop) {
 			// Stop here
-			player->startAnimation(wait_select, 1.2, 10.0, 0.0);
+			bool movingAgain = false;
 			player->hasEffect = false;
 			player->hasSound = false;
 
@@ -1448,6 +1452,25 @@ void dWMPathManager_c::moveThroughPath(int pressedDir) {
 			save->current_path_node = pathLayer->findNodeID(to);
 			if (!calledEnteredNode && dWMHud_c::instance)
 				dWMHud_c::instance->enteredNode();
+
+			// Should we continue here? (Requested by Jason)
+			int held = Remocon_GetButtons(GetActiveRemocon());
+			int pressedDir = getPressedDir(held);
+			if (pressedDir >= 0) {
+				// Use an exit if possible
+				if (canUseExit(currentNode->exits[pressedDir])) {
+					startMovementTo(currentNode->exits[pressedDir]);
+					movingAgain = true;
+				} else {
+					// TODO: maybe remove this? got to see how it looks
+					static u16 directions[] = {-0x4000,0x4000,-0x7FFF,0};
+					daWMPlayer_c::instance->setTargetRotY(directions[pressedDir]);
+				}
+			}
+
+			if (!movingAgain)
+				player->startAnimation(wait_select, 1.2, 10.0, 0.0);
+
 		} else {
 			startMovementTo(to->getOppositeAvailableExitTo(currentPath));
 			SpammyReport("passthrough node, continuing to next path\n");
-- 
cgit v1.2.3