Page 1 of 1

abLoseLife[Tgt] keyword

PostPosted: 16 Mar 2010, 11:39
by Rob Cashwalker
No surprise, after the success of spLoseLife....

Same basic syntax of course.

Code: Select all
abLoseLife[Tgt] {mana/tap cost}:NumLife[:Drawback][:spellDescription][:stackDescription]
So, here's a few cards, some of which were already implemented.
Code: Select all
Acolyte of Xathrid
B
Creature Human Cleric
no text
0/1
abLoseLifeTgt 1 B T:1

Blightspeaker
1 B
Creature Human Rebel Cleric
no text
1/1
abLoseLifeTgt T:1
SearchMerc:4

Cackling Imp
2 B B
Creature Imp
no text
2/2
abLoseLifeTgt T:1

Onyx Goblet
2 B
Artifact
no text
abLoseLifeTgt T:1

Orzhova, the Church of Deals
no cost
Land
no text
tap: add 1
abLoseLifeTgt 3 W B T:1:Drawback$YouGainLife/1:Target player loses 1 life and you gain 1 life.

Stormscape Master
2 U U
Creature Human Wizard
no text
2/2
abPumpTgt W W T:Protection from white.
abPumpTgt W W T:Protection from blue.
abPumpTgt W W T:Protection from black.
abPumpTgt W W T:Protection from red.
abPumpTgt W W T:Protection from green.
abLoseLifeTgt B B T:2:Drawback$YouGainLife/2:Target player loses 2 life and you gain 2 life.

Thunderscape Apprentice
R
Creature Human Wizard
no text
1/1
abLoseLifeTgt B T:1
abPumpTgt G T:+1/+1
CardFactory:
Code: Select all
        if (hasKeyword(card, "abLoseLife") != -1)
        {
           int n = hasKeyword(card, "abLoseLife");
           if (n != -1)
           {
              String parse = card.getKeyword().get(n).toString();
              card.removeIntrinsicKeyword(parse);
              
              String k[] = parse.split(":");
              
              final boolean Tgt[] = {false};
              Tgt[0] = k[0].contains("Tgt");
              
              String tmpCost = "";
              
              if (Tgt[0])
                 tmpCost = k[0].substring(13);
              else
                 tmpCost = k[0].substring(10);
              
              boolean tapCost = false;
              boolean tapOnlyCost = false;
              
              if (tmpCost.contains("T"))
              {
                 tapCost = true;
                 tmpCost = tmpCost.replace("T", "").trim();
                 if (tmpCost.length() == 0)
                    tapOnlyCost = true;
              }
              
              final String manaCost = tmpCost;
              
              final int NumLife[] = {-1};
              final String NumLifeX[] = {"none"};
              
              if (k[1].matches("X"))
              {
                 String x = card.getSVar(k[1]);
                 if (x.startsWith("Count$"))
                 {
                    String kk[] = x.split("\\$");
                    NumLifeX[0] = kk[1];
                 }
              }
              else if (k[1].matches("[0-9][0-9]?"))
                 NumLife[0] = Integer.parseInt(k[1]);
              
              // drawbacks and descriptions
                final String DrawBack[] = {"none"};
                final String spDesc[] = {"none"};
                final String stDesc[] = {"none"};
                if (k.length > 2)
                {
                   if (k[2].contains("Drawback$"))
                   {
                      String kk[] = k[2].split("\\$");
                      DrawBack[0] = kk[1];
                      if (k.length > 3)
                         spDesc[0] = k[3];
                      if (k.length > 4)
                         stDesc[0] = k[4];
                   }
                   else
                   {
                      if (k.length > 2)
                         spDesc[0] = k[2];
                      if (k.length > 3)
                         stDesc[0] = k[3];
                   }
                }
                else
                {
                   if (Tgt[0] == true)
                   {
                      spDesc[0] = "Target player loses " + NumLife[0] + " life.";
                      stDesc[0] =  cardName + " - target player loses life";
                   }
                   else
                   {
                      spDesc[0] = "You lose " + NumLife[0] + " life.";
                      stDesc[0] = cardName + " - you lose life";
                   }
                }
                if (!tapCost)
                {
                    final SpellAbility abLoseLife = new Ability_Activated(card, manaCost)
                    {
                    private static final long serialVersionUID = -936369754466156082L;

                     public int getNumLife()
                     {
                        if (NumLife[0] != -1)
                           return NumLife[0];

                        if (! NumLifeX[0].equals("none"))
                           return CardFactoryUtil.xCount(card, NumLifeX[0]);
                       
                        return 0;
                     }
                     
                     public boolean canPlayAI()
                     {
                        Random r = new Random();
                        boolean rr = false; // prevent run-away activations - first time will always return true
                        if (r.nextFloat() <= Math.pow(.6667, card.getAbilityUsed()))
                           rr = true;
                       
                        if (Tgt[0] == true)
                        {
                           setTargetPlayer(Constant.Player.Human);
                           return true && rr;
                        }
                        else   
                        {      // assumes there's a good Drawback$ that makes losing life worth it
                           int nlife = getNumLife();
                           if ((AllZone.Computer_Life.getLife() - nlife) >= 10)
                              return true && rr;
                           else
                              return false;
                        }
                     }

                    public void resolve()
                       {
                          int nlife = getNumLife();
                          String TgtPlayer;

                          if (Tgt[0] == true)
                             TgtPlayer = getTargetPlayer();
                          else
                             TgtPlayer = card.getController();
                         
                          AllZone.GameAction.subLife(TgtPlayer, nlife);
                         
                          if (!DrawBack[0].equals("none"))
                             CardFactoryUtil.doDrawBack(DrawBack[0], nlife, card.getController(), AllZone.GameAction.getOpponent(card.getController()), TgtPlayer, card, null);
                       }//resolve()
                    };//SpellAbility
                   
                    if (Tgt[0] == true)
                       abLoseLife.setBeforePayMana(CardFactoryUtil.input_targetPlayer(abLoseLife));
                   
                    abLoseLife.setDescription(manaCost + ": " + spDesc[0]);
                    abLoseLife.setStackDescription(stDesc[0]);
                   
                    card.addSpellAbility(abLoseLife);
                }
                else
                {
                   final SpellAbility abLoseLife = new Ability_Tap(card)
                    {
                    private static final long serialVersionUID = -3661692584660594012L;

                     public int getNumLife()
                     {
                        if (NumLife[0] != -1)
                           return NumLife[0];

                        if (! NumLifeX[0].equals("none"))
                           return CardFactoryUtil.xCount(card, NumLifeX[0]);
                       
                        return 0;
                     }
                     
                     public boolean canPlayAI()
                     {                       
                        boolean att = !CardFactoryUtil.AI_doesCreatureAttack(card);
                       
                        if (Tgt[0] == true)
                        {
                           setTargetPlayer(Constant.Player.Human);
                           return true && att;
                        }
                        else   
                        {      // assumes there's a good Drawback$ that makes losing life worth it
                           int nlife = getNumLife();
                           if ((AllZone.Computer_Life.getLife() - nlife) >= 10)
                              return true && att;
                           else
                              return false;
                        }
                     }

                    public void resolve()
                       {
                          int nlife = getNumLife();
                          String TgtPlayer;

                          if (Tgt[0] == true)
                             TgtPlayer = getTargetPlayer();
                          else
                             TgtPlayer = card.getController();
                         
                          AllZone.GameAction.subLife(TgtPlayer, nlife);
                         
                          if (!DrawBack[0].equals("none"))
                             CardFactoryUtil.doDrawBack(DrawBack[0], nlife, card.getController(), AllZone.GameAction.getOpponent(card.getController()), TgtPlayer, card, null);
                       }//resolve()
                    };//SpellAbility
                   
                    if (Tgt[0] == true)
                       abLoseLife.setBeforePayMana(CardFactoryUtil.input_targetPlayer(abLoseLife));
                   
                    if (tapOnlyCost)
                       abLoseLife.setDescription("Tap: " + spDesc[0]);
                    else
                    {
                       abLoseLife.setDescription(manaCost + ", tap: " + spDesc[0]);
                       abLoseLife.setManaCost(manaCost);
                    }
                       
                    abLoseLife.setStackDescription(stDesc[0]);
                   
                    card.addSpellAbility(abLoseLife);
                }
           }
        }// abLoseLife
Already committed last night.