It is currently 26 Apr 2024, 19:27
   
Text Size

spDestroyTgt keyword

Post MTG Forge Related Programming Questions Here

Moderators: timmermac, Blacksmith, KrazyTheFox, Agetian, friarsol, CCGHQ Admins

spDestroyTgt keyword

Postby Rob Cashwalker » 03 Jul 2009, 15:38

Hi, Billy Mays here for the Destroy Target keyword!

Finally, the answer to every pesky permanent! It handles any combination of the following target restrictions:

Artifact, Creature, Enchantment, Land, Permanent, White, Blue, Black, Red, Green, Colorless, MultiColor
non-Artifact, non-Creature, non-Enchantment, non-Land, non-Permanent
non-White, non-Blue, non-Black, non-Red, non-Green, non-Colorless, non-MultiColor

Shatter? No problem!
Shatter
1 R
Instant
Destory target artifact.
spDestroyTgt:Artifact

Naturalize? Bob's your uncle!
Naturalize
1 G
Instant
Destroy target artifact or enchantment.
spDestroyTgt:Artifact,Enchantment

But wait there's more!
Deathmark
B
Sorcery
Destroy target green or white creature.
spDestroy:Creature,Green,White

And if you integrate this code right now, I'll throw this in for free!
Ghostly Visit
2 B
Sorcery
Destroy target nonblack creature.
spDestroyTgt:non-Black,Creature


CardFactory:
Code: Select all
    private final int shouldSpDestroyTgt(Card c){
       ArrayList<String> a = c.getKeyword();
       for (int i = 0; i < a.size(); i++)
          if (a.get(i).toString().startsWith("spDestroyTgt:"))
             return i;
       
       return -1;
    }
Code: Select all
 // Generic destroy target card
    if (shouldSpDestroyTgt(card) != -1)
    {
       int n = shouldSpDestroyTgt(card);
       
       String parse = card.getKeyword().get(n).toString();
        card.removeIntrinsicKeyword(parse);
       
        String k[] = parse.split(":");
        String Targets = k[1];   // Artifact, Creature, Enchantment, Land, Permanent, White, Blue, Black, Red, Green, Colorless, MultiColor
                          // non-Artifact, non-Creature, non-Enchantment, non-Land, non-Permanent,
                          //non-White, non-Blue, non-Black, non-Red, non-Green, non-Colorless, non-MultiColor
        final String Tgts[] = Targets.split(",");
       
        String tmpDesc = card.getText().substring(15);
        int i = tmpDesc.indexOf(".");
        tmpDesc = tmpDesc.substring(0, i);
        final String Selec = new String("Select target " + tmpDesc + " to destroy.");

        card.clearSpellAbility();
       
        final SpellAbility spDstryTgt = new Spell(card)
        {
         private static final long serialVersionUID = 142142142142L;
         
         public boolean canPlayAI()
         {
            CardList results = new CardList();
            CardList choices = getTargets();
            
            if (choices.size() > 0)
            {
               for (int i = 0; i < Tgts.length; i++)
               {
                  if (Tgts[i].equals("Artifact"))
                     results.add(CardFactoryUtil.AI_getBestArtifact(choices));
                  else if (Tgts[i].equals("Creature"))
                     results.add(CardFactoryUtil.AI_getBestCreature(choices));
                  else if (Tgts[i].equals("Enchantment"))
                     results.add(CardFactoryUtil.AI_getBestEnchantment(choices, card, true));
                  else if (Tgts[i].equals("Land"))
                     results.add(CardFactoryUtil.AI_getBestLand(choices));
                  else if (Tgts[i].equals("Permanent"))
                     results.add(CardFactoryUtil.AI_getMostExpensivePermanent(choices, card, true));
               }
            }
            if (results.size() > 0)
            {
               results.shuffle();
               setTargetCard(results.get(0));
               return true;
            }
            return false;
         }
         CardList getTargets()
         {
            CardList tmpList = new CardList();
            tmpList.addAll(AllZone.Human_Play.getCards());
            tmpList.filter(new CardListFilter()
            {
               public boolean addCard(Card c)
               {
                  return (CardFactoryUtil.canTarget(card, c));
               }
            });
            final CardList list = tmpList;
            
            return CardFactoryUtil.getValidCards(list, Tgts);
         }
         public void resolve()
           {
              if (AllZone.GameAction.isCardInPlay(getTargetCard()) &&  CardFactoryUtil.canTarget(card, getTargetCard()))
                 AllZone.GameAction.destroy(getTargetCard());
              
           }
        }; //SpDstryTgt
       
        Input InGetTarget = new Input()
        {
           private static final long serialVersionUID = -142142142142L;
           
           public void showMessage()
           {
              CardList allCards = new CardList();
              allCards.addAll(AllZone.Human_Play.getCards());
              allCards.addAll(AllZone.Computer_Play.getCards());
              
              CardList choices = CardFactoryUtil.getValidCards(allCards, Tgts);
              stopSetNext(CardFactoryUtil.input_targetSpecific(spDstryTgt, choices, Selec, true));
           }
        };//InGetTarget
       
        spDstryTgt.setBeforePayMana(InGetTarget);
        card.addSpellAbility(spDstryTgt);
    }//spDestroyTgt
CardFactoryUtil:
Code: Select all
  public static CardList getValidCards(CardList baseList, String Tgts[])
  {
     //CardList newList = new CardList();
     CardList tmpList = baseList;
     final String T[] = Tgts;

     tmpList = tmpList.filter(new CardListFilter()
     {
        public boolean addCard(Card c)
        {
           boolean r = false;
           for (int i=0; i<T.length; i++)
           {
              if (T[i].contains("White") ||
                 T[i].contains("Blue") ||
                 T[i].contains("Black") ||
                 T[i].contains("Red") ||
                 T[i].contains("Green") ||
                 T[i].contains("Colorless"))
                    if (T[i].startsWith("non-"))
                       r = r || (! CardUtil.getColors(c).contains(T[i].toLowerCase()));
                    else
                       r = r || (CardUtil.getColors(c).contains(T[i].toLowerCase()));
              else if (T[i].contains("MultiColor"))
                 if (T[i].startsWith("non-"))
                    r = r || (CardUtil.getColors(c).size() == 1);
                 else
                    r = r || (CardUtil.getColors(c).size() > 1);
              else
                 if (T[i].startsWith("non-"))
                    r = r || (! c.getType().contains(T[i]));
                 else
                    r = r || (c.getType().contains(T[i]));
           }
           return r;
        }
     });

     return tmpList;
  }
 
  public static Card AI_getBestLand(CardList list)
  {
     CardList land = list.getType("Land");
     if (! (land.size() > 0))
        return null;
    
     CardList nbLand = land.filter(new CardListFilter ()   // prefer to target non basic lands
      {
        public boolean addCard(Card c)
           {
              return (!c.getType().contains("Basic"));
           }
      }
     );
    
     if (nbLand.size() > 0)
     {
        //TODO: Rank non basics?
       
        Random r = new Random();
        return nbLand.get(r.nextInt(nbLand.size()));
     }
    
     // if no non-basic lands, target the least represented basic land type
     String names[] = {"Plains", "Island", "Swamp", "Mountain", "Forest"};
     String sminBL = new String();
     int iminBL = 20000; // hopefully no one will ever have more than 20000 lands of one type....
     int n = 0;
     for (int i = 0; i < 5; i++)
     {
        n = land.getType(names[i]).size();
        if (n < iminBL && n > 0)   // if two or more are tied, only the first one checked will be used
        {                     
           iminBL = n;
           sminBL = names[i];
        }
     }
     if (iminBL == 20000)
        return null;   // no basic land was a minimum
    
     CardList BLand = land.getType(sminBL);
     for (int i=0; i<BLand.size(); i++)
        if (!BLand.get(i).isTapped())      // prefer untapped lands
           return BLand.get(i);
    
     Random r = new Random();
     return BLand.get(r.nextInt(BLand.size()));   // random tapped land of least represented type
  }
Note: the card text is used to build the selection prompt string, so it MUST follow the format:
Destroy target ____.
Whatever is in the blank section (character 15 through to the period) is used as is.
The Force will be with you, Always.
User avatar
Rob Cashwalker
Programmer
 
Posts: 2167
Joined: 09 Sep 2008, 15:09
Location: New York
Has thanked: 5 times
Been thanked: 40 times

Re: spDestroyTgt keyword

Postby Rob Cashwalker » 03 Jul 2009, 16:09

There's even more!

No Regeneration? No Problem!
Terror
1 B
Sorcery
Destroy target nonblack, nonartifact creature. It can't be regenerated.
spDestroyTgt:non-Black,non-Artifact,Creature:NoRegen

Just use this CardFactory code instead and pay separate shipping and handling!
Code: Select all
 // Generic destroy target card
    if (shouldSpDestroyTgt(card) != -1)
    {
       int n = shouldSpDestroyTgt(card);
       
       String parse = card.getKeyword().get(n).toString();
        card.removeIntrinsicKeyword(parse);
       
        String k[] = parse.split(":");
        String Targets = k[1];   // Artifact, Creature, Enchantment, Land, Permanent, White, Blue, Black, Red, Green, Colorless, MultiColor
                          // non-Artifact, non-Creature, non-Enchantment, non-Land, non-Permanent,
                          //non-White, non-Blue, non-Black, non-Red, non-Green, non-Colorless, non-MultiColor
        final String Tgts[] = Targets.split(",");
       
        String tmpDesc = card.getText().substring(15);
        int i = tmpDesc.indexOf(".");
        tmpDesc = tmpDesc.substring(0, i);
        final String Selec = new String("Select target " + tmpDesc + " to destroy.");
      
      final boolean NoRegen = (k.length == 3);
      
        card.clearSpellAbility();
       
        final SpellAbility spDstryTgt = new Spell(card)
        {
         private static final long serialVersionUID = 142142142142L;
         
         public boolean canPlayAI()
         {
            CardList results = new CardList();
            CardList choices = getTargets();
            
            if (choices.size() > 0)
            {
               for (int i = 0; i < Tgts.length; i++)
               {
                  if (Tgts[i].equals("Artifact"))
                     results.add(CardFactoryUtil.AI_getBestArtifact(choices));
                  else if (Tgts[i].equals("Creature"))
                     results.add(CardFactoryUtil.AI_getBestCreature(choices));
                  else if (Tgts[i].equals("Enchantment"))
                     results.add(CardFactoryUtil.AI_getBestEnchantment(choices, card, true));
                  else if (Tgts[i].equals("Land"))
                     results.add(CardFactoryUtil.AI_getBestLand(choices));
                  else if (Tgts[i].equals("Permanent"))
                     results.add(CardFactoryUtil.AI_getMostExpensivePermanent(choices, card, true));
               }
            }
            if (results.size() > 0)
            {
               results.shuffle();
               setTargetCard(results.get(0));
               return true;
            }
            return false;
         }
         CardList getTargets()
         {
            CardList tmpList = new CardList();
            tmpList.addAll(AllZone.Human_Play.getCards());
            tmpList.filter(new CardListFilter()
            {
               public boolean addCard(Card c)
               {
                  return (CardFactoryUtil.canTarget(card, c));
               }
            });
            final CardList list = tmpList;
            
            return CardFactoryUtil.getValidCards(list, Tgts);
         }
         public void resolve()
           {
              if (AllZone.GameAction.isCardInPlay(getTargetCard()) &&  CardFactoryUtil.canTarget(card, getTargetCard()))
                 if (NoRegen)
                    AllZone.GameAction.destroyNoRegeneration(getTargetCard());
                 else
                    AllZone.GameAction.destroy(getTargetCard());
              
           }
        }; //SpDstryTgt
       
        Input InGetTarget = new Input()
        {
           private static final long serialVersionUID = -142142142142L;
           
           public void showMessage()
           {
              CardList allCards = new CardList();
              allCards.addAll(AllZone.Human_Play.getCards());
              allCards.addAll(AllZone.Computer_Play.getCards());
              
              CardList choices = CardFactoryUtil.getValidCards(allCards, Tgts);
              stopSetNext(CardFactoryUtil.input_targetSpecific(spDstryTgt, choices, Selec, true));
           }
        };//InGetTarget
       
        spDstryTgt.setBeforePayMana(InGetTarget);
        card.addSpellAbility(spDstryTgt);
    }//spDestroyTgt
The difference? The ":" split will have a 3rd element containing "NoRegen" which is checked and set as a boolean variable, which triggers the slight modification in the resolve method.
The Force will be with you, Always.
User avatar
Rob Cashwalker
Programmer
 
Posts: 2167
Joined: 09 Sep 2008, 15:09
Location: New York
Has thanked: 5 times
Been thanked: 40 times

Re: spDestroyTgt keyword

Postby Sloth » 03 Jul 2009, 17:01

This is really great! There must be dozens of cards, that can be added. I randomly start with green spells:

Code: Select all
Creeping Mold
2 G G
Sorcery
Destroy target artifact, enchantment, or land.
spDestroyTgt:Artifact,Enchantment,Land

Desert Twister
4 G G
Sorcery
Destroy target permanent.
spDestroyTgt:Permanent

Oxidize
G
Instant
Destroy target artifact. It can't be regenerated.
spDestroyTgt:Artifact:NoRegen

Putrefy
1 B G
Instant
Destroy target artifact or creature. It can't be regenerated.
spDestroyTgt:Artifact,Creature:NoRegen

Verdigris
2 G
Instant
Destroy target artifact.
spDestroyTgt:Artifact

Winter's Grasp
1 G G
Sorcery
Destroy target land.
spDestroyTgt:Land
User avatar
Sloth
Programmer
 
Posts: 3498
Joined: 23 Jun 2009, 19:40
Has thanked: 125 times
Been thanked: 507 times

Re: spDestroyTgt keyword

Postby DennisBergkamp » 03 Jul 2009, 21:41

Wow, awesome stuff Rob!!!
I'm very close to releasing a new beta though, I'm thinking I'll wait with adding this until the version after. Too much new stuff otherwise.
User avatar
DennisBergkamp
AI Programmer
 
Posts: 2602
Joined: 09 Sep 2008, 15:46
Has thanked: 0 time
Been thanked: 0 time

Re: spDestroyTgt keyword

Postby silly freak » 03 Jul 2009, 21:46

i smell an and/or problem

"destroy target green or white creature"

how does it know that creature is a must, but g/w are alternatives?

and if it works, is "destroy target creature that's both green and white" possile?

but hey, great work i must say, seems a really universal utility. i'd just like to know what this list exactly means
___

where's the "trust me, that will work!" switch for the compiler?
Laterna Magica - blog, forum, project, 2010/09/06 release!
silly freak
DEVELOPER
 
Posts: 598
Joined: 26 Mar 2009, 07:18
Location: Vienna, Austria
Has thanked: 93 times
Been thanked: 25 times

Re: spDestroyTgt keyword

Postby zerker2000 » 03 Jul 2009, 22:29

DennisBergkamp wrote:Wow, awesome stuff Rob!!!
I'm very close to releasing a new beta though, I'm thinking I'll wait with adding this until the version after. Too much new stuff otherwise.
Definently awesome!
Also Dennis, if my ManaPool.class is to be inluded in the beta, please wait a bit on that: I found a bunch of bugs with it, and am currently in the middle of modifying it heavily to get my "Ability_Mana.class" to work(If all goes well, mana abilities will now go through the mana pool as they technically should / is easier for me to code).
O forest, hold thy wand'ring son
Though fears assail the door.
O foliage, cloak thy ravaged one
In vestments cut for war.


--Eladamri, the Seed of Freyalise
zerker2000
Programmer
 
Posts: 569
Joined: 09 May 2009, 21:40
Location: South Pasadena, CA
Has thanked: 0 time
Been thanked: 0 time

Re: spDestroyTgt keyword

Postby Rob Cashwalker » 04 Jul 2009, 03:17

silly freak wrote:i smell an and/or problem

"destroy target green or white creature"

how does it know that creature is a must, but g/w are alternatives?

and if it works, is "destroy target creature that's both green and white" possile?

but hey, great work i must say, seems a really universal utility. i'd just like to know what this list exactly means
Green OR White works no problem. In CardFactoryUtil I added getValidCards(list). What it does is filters the cards in the provided list and if it meets any of the target restrictions then it includes it in the filter. If it doesn't meet the restrictions, it eliminates it as a choice.

To make Green AND White, I think if you specify it like this, you could hack it:
spDestroyTgt:Green,White,non-Blue,non-Black,non-Red,MultiColor,Creature
Sure it's hacky, but at this point, who's counting?

You are putting some doubt in my mind though, I haven't tested it with more than some basic cards, and when I was testing I didn't have the NoRegen clause figured out to make Terror.
The Force will be with you, Always.
User avatar
Rob Cashwalker
Programmer
 
Posts: 2167
Joined: 09 Sep 2008, 15:09
Location: New York
Has thanked: 5 times
Been thanked: 40 times

Re: spDestroyTgt keyword

Postby zerker2000 » 04 Jul 2009, 06:00

Rob Cashwalker wrote:spDestroyTgt:Green,White,non-Blue,non-Black,non-Red,MultiColor,Creature
Sure it's hacky...
Very: any Green and White and <another color> creature would be filtered out.
... maybe have it use "and", "or" and "non-", leaving "," only for different filter types?(e.g. "<color filter>,<type filter>", with the color filter applying to manacost, and type filter applying to super/card/sub/creature types ... as I am sure there are cards that say "destroy target goblin" or something, and e.g. Tsabo Tavoc has "destroy target legend")
I am sorry if what I'm asking for is harder than it sounds, I keep running into that myself :P
O forest, hold thy wand'ring son
Though fears assail the door.
O foliage, cloak thy ravaged one
In vestments cut for war.


--Eladamri, the Seed of Freyalise
zerker2000
Programmer
 
Posts: 569
Joined: 09 May 2009, 21:40
Location: South Pasadena, CA
Has thanked: 0 time
Been thanked: 0 time

Re: spDestroyTgt keyword

Postby DennisBergkamp » 04 Jul 2009, 07:48

Definently awesome!
Also Dennis, if my ManaPool.class is to be inluded in the beta, please wait a bit on that: I found a bunch of bugs with it, and am currently in the middle of modifying it heavily to get my "Ability_Mana.class" to work(If all goes well, mana abilities will now go through the mana pool as they technically should / is easier for me to code).
Alright. Actually, I haven't added the ManaPool class into the beta yet, it seemed a work in progress still (and I was right!).
I'm still waiting for some feedback from rares (I have a bunch of questions about the combat code I'm still kind of in the process of merging). So maybe I'll add both your ManaPool class and Rob's spDestroyTgt keyword to this coming beta anyway.
User avatar
DennisBergkamp
AI Programmer
 
Posts: 2602
Joined: 09 Sep 2008, 15:46
Has thanked: 0 time
Been thanked: 0 time

Re: spDestroyTgt keyword

Postby Rob Cashwalker » 04 Jul 2009, 12:38

zerker2000 wrote:
Rob Cashwalker wrote:spDestroyTgt:Green,White,non-Blue,non-Black,non-Red,MultiColor,Creature
Sure it's hacky...
Very: any Green and White and <another color> creature would be filtered out.
... maybe have it use "and", "or" and "non-", leaving "," only for different filter types?(e.g. "<color filter>,<type filter>", with the color filter applying to manacost, and type filter applying to super/card/sub/creature types ... as I am sure there are cards that say "destroy target goblin" or something, and e.g. Tsabo Tavoc has "destroy target legend")
I am sorry if what I'm asking for is harder than it sounds, I keep running into that myself :P
I gave that some thought originally. The commas are necessary to make the split into each element. I thought about using "and-" and "or-" along with "non-" to combine them, but it didn't seem practical. The getValidCards() routine would have to look at the next element (if it existed) looking for the "and". The number of cards that use "and" are small enough that we can start with these simple ones until we figure out an easy way to make it do "and".

"Legendary,Permanent" should work - It will filter the list to just legendary cards, then the AI will pick the most expensive one (until someone re-works that routine to be smarter).
Besides, that's an ability, not a spell. I haven't started even considering abilities with this function. The point was to make more spells available, since we've got a ton of creatures.
The Force will be with you, Always.
User avatar
Rob Cashwalker
Programmer
 
Posts: 2167
Joined: 09 Sep 2008, 15:09
Location: New York
Has thanked: 5 times
Been thanked: 40 times

Re: spDestroyTgt keyword

Postby Rob Cashwalker » 04 Jul 2009, 13:23

As suspected, I'll have to go back to the drawing board on this. I just tested Hand of Death. and I was able to target a white enchantment.
So hold off on it till the next beta...unless I get this figured out sooner.
The Force will be with you, Always.
User avatar
Rob Cashwalker
Programmer
 
Posts: 2167
Joined: 09 Sep 2008, 15:09
Location: New York
Has thanked: 5 times
Been thanked: 40 times

Re: spDestroyTgt keyword

Postby zerker2000 » 04 Jul 2009, 21:27

DennisBergkamp wrote:I'm very close to releasing a new beta though
I expected that to mean 12-36 hours :-"
... I will probably get a working version of the Ability_Mana parser within the next week though(just minor bugs left, but the last few "minor bugs" I solved snowballed into " 'orfull mess"-es :P. By the way, I hope there aren't any problems with me moving most of Input_PayManaCost_Util.tapCard into ManaPool and getManaAbilities to return Mana Abilities(i.e. what follows is my current version of it, commented out original code removed:
Code: Select all
import java.util.*;

public class Input_PayManaCostUtil
{
  //all mana abilities start with this and typical look like "tap: add G"
  //mana abilities are Strings and are retreaved by calling card.getKeyword()
  //taps any card that has mana ability, not just land
  public static ManaCost tapCard(Card card, ManaCost manaCost)
  {
    /**/if(card instanceof ManaPool) return ((ManaPool)card).subtractMana(manaCost);//*/
   ArrayList<Ability_Mana> abilities = getManaAbilities(card);

   
    if(abilities.isEmpty())
      return manaCost;

   
    String color;
    Ability_Mana chosen = abilities.get(0);
    if(1 < abilities.size())
    {
      HashMap<String, Ability_Mana> ability = new HashMap<String, Ability_Mana>();
      for(Ability_Mana am : abilities)
         ability.put(am.toString(), am);
      chosen = (Ability_Mana) AllZone.Display.getChoice("Choose mana ability", abilities.toArray());
      //chosen = ability.get(color);
    }
    color=chosen.Mana;
    //if (!(color.equals("G") || color.equals("U") || color.equals("W") ||
    //        color.equals("B") || color.equals("R") || color.equals("1")))
    {
       AllZone.GameAction.playSpellAbility(chosen);
       for(String c : color.split(""))
       {
          if(c.equals("")) continue; // some sort of glitch
             AllZone.ManaPool.subtractOne(manaCost, c);
       }
       AllZone.Human_Play.updateObservers();
      return manaCost;   
    }
    /*
    ...
    ---Most of the original code, commented
    ...
    */
  }
  public static ArrayList<Ability_Mana> getManaAbilities(Card card)
  {
    if (card instanceof ManaPool) return ((ManaPool)card).getManaAbility();
    SpellAbility[] check = card.getSpellAbility();
    ArrayList<Ability_Mana> choices  = new ArrayList<Ability_Mana>();

    //String m;

    for(SpellAbility sa : check)
    {
       if(sa instanceof Ability_Mana)
        {
         
         /*m = ((Ability_Mana)sa).Mana;
          if (m.equals("G") || m.equals("U") || m.equals("W") ||
                  m.equals("B") || m.equals("R") || m.equals("1"))
          m=getColor(m);
          choices.add(getColor(m));
     ---Left from when getManaAbilities still returned Strings, not Ability_Mana's
     */
         choices.add((Ability_Mana)sa);
        }
    }

    return choices;
  }
/*
----I think this was already commented originally...
*/
  //color is like "G", returns "Green"
  public static String getColor(String color)
  {
    Map<String, String> m = new HashMap<String, String>();
    m.put("G", Constant.Color.Green);
    m.put("R", Constant.Color.Red);
    m.put("U", Constant.Color.Blue);
    m.put("B", Constant.Color.Black);
    m.put("W", Constant.Color.White);

    Object o = m.get(color);

    if(o == null)
      o = Constant.Color.Colorless;


    return o.toString();
  }
 
  public static String getColor2(String color)
  {
     Map<String, String> m = new HashMap<String, String>();
     m.put(Constant.Color.Green, "G");
     m.put(Constant.Color.Red, "R");
     m.put(Constant.Color.Blue, "U");
     m.put(Constant.Color.Black, "B");
     m.put(Constant.Color.White, "W");
     m.put(Constant.Color.Colorless, "1");
     
     Object o = m.get(color);
   
     return o.toString();
  }
 
}
O forest, hold thy wand'ring son
Though fears assail the door.
O foliage, cloak thy ravaged one
In vestments cut for war.


--Eladamri, the Seed of Freyalise
zerker2000
Programmer
 
Posts: 569
Joined: 09 May 2009, 21:40
Location: South Pasadena, CA
Has thanked: 0 time
Been thanked: 0 time

Re: spDestroyTgt keyword

Postby DennisBergkamp » 04 Jul 2009, 22:48

Well, I can release something now :) But then I started messing around with auras again. I got Rancor coded now, I think it works alright (can't find any bugs with it).
User avatar
DennisBergkamp
AI Programmer
 
Posts: 2602
Joined: 09 Sep 2008, 15:46
Has thanked: 0 time
Been thanked: 0 time

Re: spDestroyTgt keyword

Postby zerker2000 » 05 Jul 2009, 03:23

Please do (my latest deck :-").
O forest, hold thy wand'ring son
Though fears assail the door.
O foliage, cloak thy ravaged one
In vestments cut for war.


--Eladamri, the Seed of Freyalise
zerker2000
Programmer
 
Posts: 569
Joined: 09 May 2009, 21:40
Location: South Pasadena, CA
Has thanked: 0 time
Been thanked: 0 time

Re: spDestroyTgt keyword

Postby DennisBergkamp » 05 Jul 2009, 19:52

Busy today...
I'll try and release something tomorrow :)
User avatar
DennisBergkamp
AI Programmer
 
Posts: 2602
Joined: 09 Sep 2008, 15:46
Has thanked: 0 time
Been thanked: 0 time

Next

Return to Developer's Corner

Who is online

Users browsing this forum: No registered users and 97 guests


Who is online

In total there are 97 users online :: 0 registered, 0 hidden and 97 guests (based on users active over the past 10 minutes)
Most users ever online was 4143 on 23 Jan 2024, 08:21

Users browsing this forum: No registered users and 97 guests

Login Form