magarena/src/magic/test/TestGameBuilder.java

138 lines
5.5 KiB
Java

package magic.test;
import java.util.concurrent.atomic.AtomicInteger;
import magic.ai.MagicAIImpl;
import magic.data.CardDefinitions;
import magic.model.DuelPlayerConfig;
import magic.model.MagicCard;
import magic.model.MagicCardDefinition;
import magic.model.MagicDeckProfile;
import magic.model.MagicDuel;
import magic.model.MagicGame;
import magic.model.MagicPayedCost;
import magic.model.MagicPermanent;
import magic.model.MagicPermanentState;
import magic.model.MagicPlayer;
import magic.model.action.PlayCardFromStackAction;
import magic.model.player.AiProfile;
import magic.model.player.HumanProfile;
import magic.model.stack.MagicCardOnStack;
public abstract class TestGameBuilder {
private static final AtomicInteger currentId=new AtomicInteger(1);
public static void addToLibrary(final MagicPlayer player, final String name, final int count) {
final MagicCardDefinition cardDefinition=CardDefinitions.getCard(name);
for (int c=count;c>0;c--) {
player.getLibrary().addToTop(new MagicCard(cardDefinition,player,currentId.getAndIncrement()));
}
}
public static void addToLibrary(final MagicPlayer player, final String name) {
addToLibrary(player, name, 1);
}
public static void addToGraveyard(final MagicPlayer player, final String name, final int count) {
final MagicCardDefinition cardDefinition=CardDefinitions.getCard(name);
for (int c=count;c>0;c--) {
player.getGraveyard().addToTop(new MagicCard(cardDefinition,player,currentId.incrementAndGet()));
}
}
public static void addToGraveyard(final MagicPlayer player, final String name) {
addToGraveyard(player, name, 1);
}
public static void addToExile(final MagicPlayer player,final String name,final int count) {
final MagicCardDefinition cardDefinition=CardDefinitions.getCard(name);
for (int c=count;c>0;c--) {
player.getExile().addToTop(new MagicCard(cardDefinition,player,currentId.incrementAndGet()));
}
}
public static void addToHand(final MagicPlayer player, final String name, final int count) {
final MagicCardDefinition cardDefinition=CardDefinitions.getCard(name);
for (int c=count;c>0;c--) {
player.addCardToHand(new MagicCard(cardDefinition,player,currentId.incrementAndGet()));
}
}
public static void addToHand(final MagicPlayer player, final String name) {
addToHand(player, name, 1);
}
public static MagicPermanent createPermanent(final MagicPlayer player, final String name, final boolean tapped, final int count) {
final MagicCardDefinition cardDefinition = CardDefinitions.getCard(name);
return createPermanent(player, cardDefinition, tapped, count);
}
public static MagicPermanent createPermanent(final MagicPlayer player, final MagicCardDefinition cardDefinition, final boolean tapped, final int count) {
final MagicGame game = player.getGame();
MagicPermanent lastPermanent= MagicPermanent.NONE;
for (int c=count;c>0;c--) {
final MagicCard card=new MagicCard(cardDefinition,player,currentId.getAndIncrement());
final MagicCardOnStack cardOnStack = new MagicCardOnStack(card, player, MagicPayedCost.NOT_SPELL);
final MagicPermanent permanent=new MagicPermanent(currentId.getAndIncrement(),card,player);
lastPermanent=permanent;
game.doAction(new PlayCardFromStackAction(cardOnStack) {
@Override
protected MagicPermanent createPermanent(final MagicGame game) {
return permanent;
}
});
game.getEvents().clear();
game.checkStatePutTriggers();
game.getStack().removeAllItems();
permanent.clearState(MagicPermanentState.Summoned);
if (tapped) {
permanent.setState(MagicPermanentState.Tapped);
}
}
return lastPermanent;
}
public static MagicPermanent createPermanent(final MagicPlayer player,final String name,final int amount){
return createPermanent(player,name,false,amount);
}
public static MagicPermanent createPermanent(final MagicPlayer player,final String name){
return createPermanent(player,name,false,1);
}
protected abstract MagicGame getGame();
public static MagicGame buildGame(final String id) {
MagicGame game = null;
try { //load class by name
final TestGameBuilder gb = Class.forName("magic.test." + id).asSubclass(TestGameBuilder.class).newInstance();
game = gb.getGame();
} catch (final ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
System.err.println("ERROR! Unable to build game " + id);
throw new RuntimeException(ex);
}
return game;
}
public static MagicDuel createDuel(final MagicAIImpl aAiType, final int aAiLevel) {
final MagicDuel duel=new MagicDuel();
final MagicDeckProfile profile=new MagicDeckProfile("bgruw");
final DuelPlayerConfig player1=new DuelPlayerConfig(HumanProfile.create("Player"),profile);
final DuelPlayerConfig player2=new DuelPlayerConfig(AiProfile.create(aAiType, aAiLevel),profile);
duel.setPlayers(new DuelPlayerConfig[]{player1,player2});
duel.setStartPlayer(0);
return duel;
}
public static MagicDuel createDuel() {
return createDuel(MagicAIImpl.MMABFast, 6);
}
}