What card was discarded?
 Posted: 27 Jul 2009, 02:45
Posted: 27 Jul 2009, 02:45I'm working on a spDrawCards routine. There are very few pure draw card spells. The bulk of them come with conditions... like lose n life, or discard n cards... So I'm intending that nearly all combinations can be supported. 
There's one syntax I've run into so far that's not as easy as I had thought - "discard 2 cards unless you discard an artifact".
This is what I've got down so far:
So short of writing another form of input_discard, does anyone have some ideas?
			There's one syntax I've run into so far that's not as easy as I had thought - "discard 2 cards unless you discard an artifact".
This is what I've got down so far:
- Code: Select all
- if (shouldSpDrawCards(card) != -1)
 {
 int n = shouldSpDrawCards(card);
 String parse = card.getKeyword().get(n).toString();
 card.removeIntrinsicKeyword(parse);
 
 String k[] = parse.split(":");
 final int NumCards[] = {-1};
 final String NumCardsType[] = {"none"};
 final boolean NumCardsTypeYouCtrl[] = {false};
 final boolean NumCardsTypeInPlay[] = {false};
 final boolean NumCardsTypeInYourYard[] = {false};
 final boolean NumCardsTypeInAllYards[] = {false};
 final boolean NumCardsDomain[] = {false};
 if (k[1].length() == 1)
 NumCards[0] = Integer.parseInt(k[1]);
 else
 {
 if (k[1].startsWith("NumCardsType"))
 {
 String kk[] = k[1].split("/");
 NumCardsType[0] = kk[1];
 NumCardsTypeYouCtrl[0] = kk[2].equals("YouCtrl");
 NumCardsTypeInPlay[0] = kk[2].equals("InPlay");
 NumCardsTypeInYourYard[0] = kk[2].equals("InYourYard");
 NumCardsTypeInAllYards[0] = kk[2].equals("InAllYards");
 }
 NumCardsDomain[0] = k[1].equals("Domain");
 }
 
 final int NumDiscard[] = {0};
 final boolean UnlessDiscardLand[] = {false};
 final boolean UnlessDiscardArtifact[] = {false};
 final boolean AtRandom[] = {false};
 
 final int NumLife[] = {0};
 
 final int NumToLibrary[] = {0};
 final boolean ToLibraryTop[] = {false};
 final boolean ToLibraryTopBottom[] = {false};
 final boolean ToLibraryBottom[] = {false};
 
 final int NumOppDraw[] = {0};
 
 if (k.length > 2)
 {
 if (k[2].contains("Discard"))
 {
 String kk[] = k[2].split("/");
 NumDiscard[0] = Integer.parseInt(kk[1]);
 if (kk.length > 2)
 {
 UnlessDiscardLand[0] = kk[2].equals("UnlessDiscardLand");
 UnlessDiscardArtifact[0] = kk[2].equals("UnlessDiscardArtifact");
 AtRandom[0] = kk[2].equals("AtRandom");
 }
 }
 if (k[2].contains("Life"))
 {
 String kk[] = k[2].split("/");
 NumLife[0] = Integer.parseInt(kk[1]);
 }
 if (k[2].contains("NumToLibrary"))
 {
 String kk[] = k[2].split("/");
 NumToLibrary[0] = Integer.parseInt(kk[1]);
 if (kk.length > 2)
 {
 ToLibraryTop[0] = kk[2].equals("Top");
 ToLibraryTopBottom[0] = kk[2].equals("TopBottom");
 ToLibraryBottom[0] = kk[2].equals("Bottom");
 }
 }
 
 if (k[2].contains("NumOppDraw"))
 {
 String kk[] = k[2].split("/");
 NumOppDraw[0] = Integer.parseInt(kk[1]);
 }
 
 final SpellAbility spell = new Spell(card)
 {
 public int getNumCards()
 {
 int n = 0;
 String cardController = card.getController();
 PlayerZone myPlay = AllZone.getZone(Constant.Zone.Play, cardController);
 PlayerZone opPlay = AllZone.getZone(Constant.Zone.Play, AllZone.GameAction.getOpponent(cardController));
 
 PlayerZone myYard = AllZone.getZone(Constant.Zone.Graveyard, cardController);
 PlayerZone opYard = AllZone.getZone(Constant.Zone.Graveyard, AllZone.GameAction.getOpponent(cardController));
 
 CardList AllCards = new CardList();
 
 if (! NumCardsType[0].equals("none"))
 {
 
 if (NumCardsTypeInYourYard[0] == false)
 AllCards.addAll(myYard.getCards());
 if (NumCardsTypeInAllYards[0] == false)
 {
 AllCards.addAll(myYard.getCards());
 AllCards.addAll(opYard.getCards());
 }
 
 if (NumCardsTypeYouCtrl[0] == true)
 AllCards.addAll(myPlay.getCards());
 
 if (NumCardsTypeInPlay[0] == true)
 {
 AllCards.addAll(myPlay.getCards());
 AllCards.addAll(opPlay.getCards());
 }
 
 AllCards = AllCards.filter(new CardListFilter()
 {
 public boolean addCard(Card c)
 {
 if (c.getType().contains(NumCardsType[0]))
 return true;
 
 return false;
 }
 });
 
 n = AllCards.size();
 }
 if (NumCardsDomain[0] == true)
 {
 AllCards.addAll(myPlay.getCards());
 String basic[] = {"Forest", "Plains", "Mountain", "Island", "Swamp"};
 for(int i = 0; i < basic.length; i++)
 {
 if (! AllCards.getType(basic[i]).isEmpty())
 n++;
 }
 }
 
 return n;
 }
 public void resolve()
 {
 if (NumCards[0] == -1)
 NumCards[0] = getNumCards();
 
 for (int i=0; i<NumCards[0]; i++)
 AllZone.GameAction.drawCard(card.getController());
 
 if (NumDiscard[0] > 0)
 {
 for (int i=0; i < NumDiscard[0]; i++)
 if(card.getController().equals("Human"))
 AllZone.InputControl.setInput(CardFactoryUtil.input_discard());
 else
 AllZone.GameAction.discardRandom("Computer");
 }
 }
 };
 }
 }
- Code: Select all
- if (NumDiscard[0] > 0)
 {
 for (int i=0; i < NumDiscard[0]; i++)
 if(card.getController().equals("Human"))
 AllZone.InputControl.setInput(CardFactoryUtil.input_discard());
 else
 AllZone.GameAction.discardRandom("Computer");
 }
So short of writing another form of input_discard, does anyone have some ideas?
