private void readHand(GameState state) {
		int cardsInHand = countCardsInHand(state.getScreen());
		
		if(cardsInHand > handCostIndiciesByHandSize.size()) {
			throw new GameStateViolationException("Too many cards in hand, the parser is probably reading pixels it shouldn't");
		}
		List<Integer> cardCostOffsets = handCostIndiciesByHandSize.get(cardsInHand);
		
		List<Scroll> newHand = new ArrayList<Scroll>(cardsInHand);
		for(int i = 0; i < cardsInHand; i++) {
			int xOffset = cardCostOffsets.get(i);
			
			BufferedImage subImage = state.getScreen().getSubimage(xOffset, handRow, 11, 16);
			ImageUtil.saveImage(subImage, "C:\\debug\\handCost" + i + ".png"); //debug
			
			PixelMap costPixelMap = new PixelMap(subImage, 1);
			
			ImageUtil.saveImage(costPixelMap.asImage(), "C:\\debug\\handCostPixelMap" + i + ".png"); //debug
			
			double maxSimilarity = 0;
			int closestMatch = 0;
			int currentNumber = 1;
			for(PixelMap numberMap : numberMaps) {
				if(numberMap == null) {
					continue;
				}
				ImageUtil.saveImage(costPixelMap.and(numberMap).asImage(), "C:\\debug\\andMap_" + currentNumber + ".png");
				double similarity = costPixelMap.and(numberMap).getRelativeDensity(numberMap);
				
				if(similarity > maxSimilarity) {
					maxSimilarity = similarity;
					closestMatch = currentNumber;
				}
				
				currentNumber++;
			}
			
			newHand.add(new UnitScroll(closestMatch, closestMatch, 2, closestMatch));
		}
		
		state.setHand(newHand);
	}