}
if (creature.getLevel() > HIGHEST_LEVEL) {
continue;
}
final Creature target = creature.getCreature();
final Optimizer optimizer = new Optimizer(target);
player.setLevel(level);
player.setBaseHP(100 + 10 * level);
player.setAtk(atkLevels[level]);
player.setDef(defLevels[level]);
equip(player, level);
System.out.println("Player(" + level + ") vs "
+ creature.getCreatureName());
durationThreshold = DEFAULT_DURATION_THRESHOLD;
boolean balanced = false;
int tries = 0;
while (!balanced) {
final Pair<Integer, Integer> results = combat(player, target,
ROUNDS);
final int meanTurns = results.first();
final int meanLeftHP = results.second();
final int proposedXPValue = (int) ((2 * creature.getLevel() + 1) * (meanTurns / 2.0));
creature.setLevel(creature.getLevel(), proposedXPValue);
System.out.println("Target ATK: "
+ target.getAtk()
+ "/DEF: "
+ target.getDef()
+ "/HP: "
+ target.getBaseHP()
+ "\t Turns: "
+ meanTurns
+ "\tLeft HP:"
+ meanLeftHP);
if (isCorrectResult(level, meanTurns, meanLeftHP / (double) player.getBaseHP())) {
balanced = true;
} else {
optimizer.step(meanLeftHP, meanTurns);
System.out.println("New ATK: " + target.getAtk()
+ "/DEF: " + target.getDef() + "/HP: "
+ target.getBaseHP());
}
// relax convergence criteria for pathological cases
tries++;
if (tries % 200 == 0) {
durationThreshold *= 1.1;
System.out.println(target.getName() + ": changed threshold to " + durationThreshold);
}
}
boolean changed = false;
if (creature.getAtk() != target.getAtk()) {
changed = true;
}
if (creature.getDef() != target.getDef()) {
changed = true;
}
if (creature.getHP() != target.getBaseHP()) {
changed = true;
}
System.out.print("BALANCED: ");
final StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(creature.getCreatureName());
stringBuilder.append("(");
stringBuilder.append(creature.getLevel());
stringBuilder.append(")\t");
if (changed) {
stringBuilder.append("*\t");
} else {
stringBuilder.append(" \t");
}
stringBuilder.append("ATK: ");
stringBuilder.append(target.getAtk());
stringBuilder.append("\t\tDEF: ");
stringBuilder.append(target.getDef());
stringBuilder.append("\t\tHP: ");
stringBuilder.append(target.getBaseHP());
stringBuilder.append("\t\tXP: ");
stringBuilder.append(creature.getXP());
System.out.println(stringBuilder.toString());
}
}