public Sacrifice determineSacrifice(GameState state) {
		List<Scroll> hand = state.getHand();
		
		//are we drawing or ramping?
		Type type;
		if(hand.size() == 0) {
			return new Sacrifice(Type.SKIP, null);
		}
		else if(hand.size() > 5) {
			type = Type.RAMP;
		}
		else if(hand.size() == 1) {
			type = Type.DRAW;
		}
		else if(state.getMaxMana() < INITIAL_RAMP_THRESHOLD) {
			type = Type.RAMP;
		}
		else if(handContainsCost(hand, state.getMaxMana() + 1)) {
			type = Type.RAMP;
		}
		else {
			type = Type.DRAW;
		}
		
		//which card are we sacrificing
		List<Scroll> sacrificeCandidates = new ArrayList<Scroll>();
		
		for(Scroll scroll : hand) {
			if(scroll.getCost() < state.getMaxMana() + NEGATIVE_SACRIFICE_PRIORITY_THRESHOLD) {
				sacrificeCandidates.add(scroll);
			}
			else if(scroll.getCost() > state.getMaxMana() + POSITIVE_SACRIFICE_PRIORITY_THRESHOLD) {
				sacrificeCandidates.add(scroll);
			}
		}
		
		if(sacrificeCandidates.isEmpty()) {
			sacrificeCandidates = hand;
		}
		
		//a random card from the candidate set
		return new Sacrifice(type, sacrificeCandidates.get(random.nextInt(sacrificeCandidates.size())));
	}