X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgameboard.cpp;fp=src%2Fgameboard.cpp;h=0656e74a96425d9577185090bff4c891926ad640;hb=af4549443047a8b46809a541674d04745f7b5037;hp=b18fe9a1e2010d016022b9b5499981ecf9030f77;hpb=39aecbb4b0703dcc20f2062fb9cb0e520ca78176;p=warehouse-man-deluxe diff --git a/src/gameboard.cpp b/src/gameboard.cpp index b18fe9a..0656e74 100644 --- a/src/gameboard.cpp +++ b/src/gameboard.cpp @@ -88,6 +88,7 @@ void GameBoard::ResetGame(void) { memcpy(board, initialBoard, boardLength); playerX = initialX, playerY = initialY; + numMoves = 0; } @@ -100,7 +101,7 @@ int GameBoard::MovePlayerN(void) char cell1 = board[playerX + ((playerY - 1) * width)] & ~GTBoxSpot; char cell2 = board[playerX + ((playerY - 2) * width)] & ~GTBoxSpot; - return Move(playerY, -1, cell1, cell2); + return Move(0, -1, cell1, cell2); } @@ -113,7 +114,7 @@ int GameBoard::MovePlayerS(void) char cell1 = board[playerX + ((playerY + 1) * width)] & ~GTBoxSpot; char cell2 = board[playerX + ((playerY + 2) * width)] & ~GTBoxSpot; - return Move(playerY, +1, cell1, cell2); + return Move(0, +1, cell1, cell2); } @@ -126,7 +127,7 @@ int GameBoard::MovePlayerE(void) char cell1 = board[(playerX + 1) + (playerY * width)] & ~GTBoxSpot; char cell2 = board[(playerX + 2) + (playerY * width)] & ~GTBoxSpot; - return Move(playerX, +1, cell1, cell2); + return Move(+1, 0, cell1, cell2); } @@ -139,26 +140,34 @@ int GameBoard::MovePlayerW(void) char cell1 = board[(playerX - 1) + (playerY * width)] & ~GTBoxSpot; char cell2 = board[(playerX - 2) + (playerY * width)] & ~GTBoxSpot; - return Move(playerX, -1, cell1, cell2); + return Move(-1, 0, cell1, cell2); } -int GameBoard::Move(int & var, int direction, char cell1, char cell2) +int GameBoard::Move(int dx, int dy, char cell1, char cell2) { // Player is moving into an unoccupied space... if (cell1 == GTSpace) { - var += direction; +// var += direction; + playerX += dx, playerY += dy; + undo[numMoves].dx = dx, undo[numMoves].dy = dy, undo[numMoves].type = PMWalk; + numMoves++; return PMWalk; } // Player is pushing a box into an unoccupied space... else if ((cell1 == GTBox) && (cell2 == GTSpace)) { - var += direction; +// var += direction; + playerX += dx, playerY += dy; board[playerX + (playerY * width)] &= GTBoxSpot; - var += direction; +// var += direction; + playerX += dx, playerY += dy; board[playerX + (playerY * width)] |= GTBox; - var -= direction; +// var -= direction; + playerX -= dx, playerY -= dy; + undo[numMoves].dx = dx, undo[numMoves].dy = dy, undo[numMoves].type = PMPush; + numMoves++; return PMPush; } @@ -203,3 +212,31 @@ bool GameBoard::IsBoxWOfPlayer(void) } +bool GameBoard::UndoLastMove(int & dx, int & dy, int & type) +{ + if (numMoves == 0) + return false; + + numMoves--; + dx = undo[numMoves].dx; + dy = undo[numMoves].dy; + type = undo[numMoves].type; + + // Undo the box's move (if any) + if (type == PMPush) + { + int boxPosition = (playerX + dx) + ((playerY + dy) * width); + int newBoxPosition = playerX + (playerY * width); + + board[boxPosition] &= GTBoxSpot; +// board[newBoxPosition] &= GTBoxSpot; // This is extraneous + board[newBoxPosition] |= GTBox; + } + + // Undo the player's move + playerX += -dx; + playerY += -dy; + + return true; +} +