package magic.model.score;
import magic.ai.ArtificialScoringSystem;
import magic.model.MagicAbility;
import magic.model.MagicPlayer;
import magic.model.choice.MagicCombatCreature;
import magic.model.choice.MagicDeclareBlockersResult;
/** Simplified combat damage model, not taking into account all abilities. */
public class MagicFastCombatScore implements MagicCombatScore {
private final MagicPlayer defendingPlayer;
private final MagicPlayer scorePlayer;
public MagicFastCombatScore(final MagicPlayer defendingPlayer,final MagicPlayer scorePlayer) {
this.defendingPlayer=defendingPlayer;
this.scorePlayer=scorePlayer;
}
@Override
public int getScore(final MagicDeclareBlockersResult result) {
final int startLife=defendingPlayer.getLife();
int score=-ArtificialScoringSystem.getLifeScore(startLife);
int life=startLife;
for (final MagicCombatCreature[] creatures : result) {
final MagicCombatCreature attacker=creatures[0];
if (creatures.length==1) {
life-=attacker.power;
} else {
int remaining=attacker.power;
int lethalDamage=attacker.lethalDamage;
final boolean deathtouch=attacker.hasAbility(MagicAbility.Deathtouch);
for (int index=1;index<creatures.length;index++) {
final MagicCombatCreature blocker=creatures[index];
lethalDamage=blocker.hasAbility(MagicAbility.Deathtouch)?0:lethalDamage-blocker.power;
if (blocker.hasAbility(MagicAbility.Lifelink)) {
life+=blocker.power;
}
if (remaining>0) {
final int damage=Math.min(deathtouch?1:remaining,blocker.lethalDamage);
if ((deathtouch||damage>=blocker.lethalDamage)&&!blocker.hasAbility(MagicAbility.Indestructible)) {
score-=blocker.score;
}
remaining-=damage;
}
}
if (remaining>0&&attacker.hasAbility(MagicAbility.Trample)) {
life-=remaining;
}
if (lethalDamage<=0&&!attacker.hasAbility(MagicAbility.Indestructible)) {
score+=attacker.score;
}
}
}
score+=(life<=0)?ArtificialScoringSystem.LOSE_GAME_SCORE:ArtificialScoringSystem.getLifeScore(life);
return (defendingPlayer==scorePlayer)?score:-score;
}
}