package net.demilich.metastone.game.spells.desc.valueprovider;
import net.demilich.metastone.game.GameContext;
import net.demilich.metastone.game.Player;
import net.demilich.metastone.game.entities.Entity;
import net.demilich.metastone.game.spells.TargetPlayer;
public abstract class ValueProvider {
protected final ValueProviderDesc desc;
public ValueProvider(ValueProviderDesc desc) {
this.desc = desc;
}
public int getValue(GameContext context, Player player, Entity target, Entity host) {
TargetPlayer targetPlayer = (TargetPlayer) desc.get(ValueProviderArg.TARGET_PLAYER);
if (targetPlayer == null) {
targetPlayer = TargetPlayer.SELF;
}
Player providingPlayer = null;
switch (targetPlayer) {
case ACTIVE:
providingPlayer = context.getActivePlayer();
break;
case BOTH:
int multiplier = desc.contains(ValueProviderArg.MULTIPLIER) ? desc.getInt(ValueProviderArg.MULTIPLIER) : 1;
int offset = desc.contains(ValueProviderArg.OFFSET) ? desc.getInt(ValueProviderArg.OFFSET) : 0;
int value = 0;
for (Player selectedPlayer : context.getPlayers()) {
value += provideValue(context, selectedPlayer, target, host);
}
value = value * multiplier + offset;
return value;
case INACTIVE:
providingPlayer = context.getOpponent(context.getActivePlayer());
break;
case OPPONENT:
providingPlayer = context.getOpponent(player);
break;
case OWNER:
providingPlayer = context.getPlayer(host.getOwner());
break;
case SELF:
default:
providingPlayer = player;
break;
}
int multiplier = desc.contains(ValueProviderArg.MULTIPLIER) ? desc.getInt(ValueProviderArg.MULTIPLIER) : 1;
int offset = desc.contains(ValueProviderArg.OFFSET) ? desc.getInt(ValueProviderArg.OFFSET) : 0;
int value = provideValue(context, providingPlayer, target, host) * multiplier + offset;
return value;
}
protected abstract int provideValue(GameContext context, Player player, Entity target, Entity host);
}