public MoveResult resolveMove(StrategyBoard gameBoard, PlayerColor currentTurn,
			PieceType pieceMoving, Location fromLocation, Location toLocation)
	{	
		final MoveResult firstResult;
		final Piece attacker = gameBoard.getPieceAt(fromLocation);
		final Piece defender = gameBoard.getPieceAt(toLocation);
		final MoveResult specialResult = dealWithSpecialCases(gameBoard, currentTurn, pieceMoving, fromLocation, toLocation);
		
		if (specialResult != null){
			firstResult = specialResult;
		} else {
			firstResult = super.resolveMove(gameBoard, currentTurn, pieceMoving, fromLocation, toLocation);
			
			//deal with double flag case
			if ((firstResult.getStatus() == MoveResultStatus.RED_WINS && --blueFlags > 0)
					|| (firstResult.getStatus() == MoveResultStatus.BLUE_WINS && --redFlags > 0)){
				gameBoard.movePiece(fromLocation, toLocation);
				return new MoveResult(MoveResultStatus.FLAG_CAPTURED,new PieceLocationDescriptor(attacker,toLocation));
			}		
		}
		
		//if the First Lieutenant lost, move the winning piece back to the proper spot (it doesnt swap spaces).
		if (pieceMoving == PieceType.FIRST_LIEUTENANT 
				&& firstResult.getBattleWinner() != null 
				&& firstResult.getBattleWinner().getPiece().getOwner() != currentTurn
				&& (fromLocation.distanceTo(toLocation) > 1)) {
			
			gameBoard.movePiece(fromLocation, toLocation); //move winner back
			return new MoveResult(firstResult.getStatus(),new PieceLocationDescriptor(defender,toLocation));
		}
		
		return checkForEndgame(gameBoard, firstResult);
		
	}