From 5ce91e3cd72989860e3f2a34f460a5b3c09388a9 Mon Sep 17 00:00:00 2001 From: Treeki 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(-) 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