public UIChangeList evaluateInput(Point in) {
		//Be careful because in comes from the UI so it is
		// y, x
		ChessMove curMove = new ChessMove(board.getBlock(in).getPiece(), in);
		UIChangeList ret = new UIChangeList();
		/*
		 * If they fail to pass a static rule, it's because it's either not their turn
		 * or they clicked on something that isn't their piece, so don't change state and 
		 * just return. 
		 */
		if (!rules.evaluateStaticRules(curMove)) {
			if (DEBUGGING) {
				System.out.println("Failed a static rule check");
			}
			return ret;
		}
		/*
		 * Otherwise, if we don't have a selected piece they are just selecting a
		 * piece for the first time, so update the state to reflect that selection
		 */
		else if (!state.hasSelectedPiece()) {
			if (DEBUGGING) {
				System.out.println("Selecting: " + curMove.piece.toString());
			}
			//Add the changes for attack and move locations
			state.setSelectedPiece(curMove.piece);
			this.addSelectChanges(ret, curMove);
			return ret;
		}
		/*
		 * Otherwise, they are moving their piece somewhere, so we need to evaluate
		 * the dynamic rules. If they don't pass the dynamic rules then they clicked on
		 * a tile they can't move to, so we need to de-select the selected piece, but 
		 * keep it as their turn
		 */
		else if (!rules.evaluateDynamicRules(curMove)) {
			if (DEBUGGING) {
				System.out.println("Deselecting: " + state.getSelectedPiece());
			}
			//Need to get the UI changes before we deselect
			this.addDeselectChanges(ret, curMove);
			state.deselectPiece();
			return ret;
		} 
		/*
		 * If we get to this point then the user has made a move that is
		 * valid so we need to update the board and the state to reflect
		 * that movement.
		 */
		else {
			//TODO checking pawn promotion and castling will occur down here probs
			this.addDeselectChanges(ret, curMove);
			ChessPiece capped = board.moveAndOrCapture(state.getSelectedPiece().getLocation(), curMove.location);
			if (capped != null) {
				state.addLostPiece(capped);
			}
			this.updateState();
			this.addCaptureChanges(ret, capped);
			return ret;
		}
	}