private double calculateMinionScore(Minion minion, ThreatLevel threatLevel) { if (minion.hasAttribute(Attribute.MARKED_FOR_DEATH)) { return 0; } double minionScore = weights.get(WeightedFeature.MINION_INTRINSIC_VALUE); minionScore += weights.get(WeightedFeature.MINION_ATTACK_FACTOR) * (minion.getAttack() - minion.getAttributeValue(Attribute.TEMPORARY_ATTACK_BONUS)); minionScore += weights.get(WeightedFeature.MINION_HP_FACTOR) * minion.getHp(); if (minion.hasAttribute(Attribute.TAUNT)) { switch (threatLevel) { case RED: minionScore += weights.get(WeightedFeature.MINION_RED_TAUNT_MODIFIER); break; case YELLOW: minionScore += weights.get(WeightedFeature.MINION_YELLOW_TAUNT_MODIFIER); break; default: minionScore += weights.get(WeightedFeature.MINION_DEFAULT_TAUNT_MODIFIER); break; } } if (minion.hasAttribute(Attribute.WINDFURY)) { minionScore += weights.get(WeightedFeature.MINION_WINDFURY_MODIFIER); } else if (minion.hasAttribute(Attribute.MEGA_WINDFURY)) { minionScore += 2 * weights.get(WeightedFeature.MINION_WINDFURY_MODIFIER); } if (minion.hasAttribute(Attribute.DIVINE_SHIELD)) { minionScore += weights.get(WeightedFeature.MINION_DIVINE_SHIELD_MODIFIER); } if (minion.hasAttribute(Attribute.SPELL_DAMAGE)) { minionScore += minion.getAttributeValue(Attribute.SPELL_DAMAGE) * weights.get(WeightedFeature.MINION_SPELL_POWER_MODIFIER); } if (minion.hasAttribute(Attribute.STEALTH)) { minionScore += weights.get(WeightedFeature.MINION_STEALTHED_MODIFIER); } if (minion.hasAttribute(Attribute.UNTARGETABLE_BY_SPELLS)) { minionScore += weights.get(WeightedFeature.MINION_UNTARGETABLE_BY_SPELLS_MODIFIER); } return minionScore; }