Beispiel #1
0
        public Handcard getOppositeCard(Playfield p, group Group, bool canWait = true, int gangSize = 5)
        {
            Handcard bestCard = null;
            int      bestVal  = int.MinValue;
            int      tmpVal;

            foreach (Handcard hc in p.ownHandCards)
            {
                if (canWait || hc.manacost <= p.ownMana)
                {
                    tmpVal = 0;
                    int numAirTransport = Group.lowHPboAirTransport + Group.avgHPboAirTransport + Group.hiHPboAirTransport;
                    int groupSize       = Group.lowHPbo.Count + Group.avgHPbo.Count + Group.hiHPbo.Count;
                    if (hc.card.aoeAir)
                    {
                        tmpVal += 3;
                    }
                    if (hc.card.type == boardObjType.MOB)
                    {
                        tmpVal += 2;
                    }
                    if (hc.card.Transport == transportType.AIR)
                    {
                        tmpVal += 3;
                    }
                    if (numAirTransport > 0)
                    {
                        if (hc.card.TargetType == targetType.ALL)
                        {
                            tmpVal += 20;
                        }
                        if (Group.lowHPboAirTransport >= gangSize && hc.card.aoeAir)
                        {
                            tmpVal += 5;
                        }
                    }
                    if (groupSize > numAirTransport)
                    {
                        if (Group.lowHPbo.Count - Group.lowHPboAirTransport >= gangSize)
                        {
                            if (hc.card.aoeAir)
                            {
                                tmpVal += 15;
                            }
                            if (hc.card.aoeGround)
                            {
                                tmpVal += 15;
                            }
                        }
                        if (hc.card.TargetType == targetType.GROUND)
                        {
                            tmpVal += 15;
                        }
                        if (hc.card.TargetType == targetType.ALL)
                        {
                            tmpVal += 15;
                        }
                    }
                    foreach (BoardObj tmp in Group.hiHPbo)
                    {
                        if (OppositeDB.ContainsKey(tmp.card.name))
                        {
                            var opp = OppositeDB[tmp.card.name];
                            if (opp.ContainsKey(hc.card.name))
                            {
                                tmpVal += opp[hc.card.name] / 10;
                            }
                        }
                    }
                    foreach (BoardObj tmp in Group.avgHPbo)
                    {
                        if (OppositeDB.ContainsKey(tmp.card.name))
                        {
                            var opp = OppositeDB[tmp.card.name];
                            if (opp.ContainsKey(hc.card.name))
                            {
                                tmpVal += opp[hc.card.name] / 10;
                            }
                        }
                    }
                    foreach (BoardObj tmp in Group.lowHPbo)
                    {
                        if (OppositeDB.ContainsKey(tmp.card.name))
                        {
                            var opp = OppositeDB[tmp.card.name];
                            if (opp.ContainsKey(hc.card.name))
                            {
                                tmpVal += opp[hc.card.name] / 15;
                            }
                        }
                    }
                    if (bestVal < tmpVal)
                    {
                        bestVal      = tmpVal;
                        bestCard     = hc;
                        bestCard.val = tmpVal;
                    }
                }
            }
            return(bestCard);
        }
Beispiel #2
0
        public opposite getOppositeToAll(Playfield p, BoardObj defender, bool canWait = true)
        {
            opposite         bestOpposite  = null;
            List <attackDef> attackersList = defender.getPossibleAttackers(p);

            if (attackersList.Count < 1)
            {
                return(bestOpposite);
            }

            List <attackDef> defendersList;

            CardDB.cardName aName;
            CardDB.cardName dName;
            Dictionary <CardDB.cardName, int> aopp;

            Dictionary <CardDB.cardName, opposite> allOpposite = new Dictionary <CardDB.cardName, opposite>();

            foreach (attackDef ad in attackersList)
            {
                if (OppositeDB.ContainsKey(ad.attacker.Name))
                {
                    aopp = OppositeDB[ad.attacker.Name];
                    //-1.Get all obj on board
                    defendersList = ad.attacker.getPossibleAttackers(p);
                    foreach (var def in defendersList)
                    {
                        dName = def.attacker.Name;
                        if (aopp.ContainsKey(dName))
                        {
                            if (!allOpposite.ContainsKey(dName))
                            {
                                allOpposite.Add(dName, new opposite(dName, aopp[dName], def.attacker, ad.attacker));
                            }
                            else
                            {
                                allOpposite[dName].value += aopp[dName];
                            }
                        }
                    }

                    //-2.Get all cards
                    //TODO - enemy have opposite - it depends on his mana
                    if (defender.own)
                    {
                        foreach (Handcard hc in p.ownHandCards)
                        {
                            dName = hc.card.name;
                            if ((canWait || hc.manacost <= p.ownMana) && aopp.ContainsKey(dName))
                            {
                                if (!allOpposite.ContainsKey(dName))
                                {
                                    allOpposite.Add(dName, new opposite(dName, aopp[dName], hc, ad.attacker));
                                }
                                else
                                {
                                    allOpposite[dName].value += aopp[dName];
                                }
                            }
                        }
                    }
                }
                else
                {
                    Handcard tmp   = null;
                    int      count = p.ownHandCards.Count;
                    //TODO automatic creation opposite list
                    if (ad.attacker.Transport == transportType.AIR)
                    {
                        foreach (Handcard hc in p.ownHandCards)
                        {
                            if (hc.card.TargetType == targetType.ALL)
                            {
                                if (ad.attacker.card.DamageRadius > 1000)
                                {
                                    if (hc.card.MaxHP > ad.attacker.Atk)
                                    {
                                        if (tmp == null || tmp.card.MaxHP < hc.card.MaxHP)
                                        {
                                            tmp = hc;
                                        }
                                    }
                                }
                                else
                                {
                                    if (hc.card.MaxHP > ad.attacker.Atk * 4 || hc.card.SpawnNumber > 3)
                                    {
                                        tmp = hc;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        if (ad.attacker.TargetType == targetType.ALL)
                        {
                            foreach (Handcard hc in p.ownHandCards)
                            {
                                if (ad.attacker.card.DamageRadius > 1000 && hc.card.MaxHP > ad.attacker.Atk)
                                {
                                    if (tmp == null || tmp.card.MaxHP < hc.card.MaxHP)
                                    {
                                        tmp = hc;
                                    }
                                }
                                else
                                {
                                    if (hc.card.MaxHP > ad.attacker.Atk * 4 || hc.card.SpawnNumber > 3)
                                    {
                                        tmp = hc;
                                        break;
                                    }
                                }
                            }
                        }
                        else if (ad.attacker.TargetType == targetType.BUILDINGS)
                        {
                            foreach (Handcard hc in p.ownHandCards)
                            {
                                if (hc.card.Atk > ad.attacker.HP * 5 || hc.card.SpawnNumber > 3)
                                {
                                    tmp = hc;
                                    break;
                                }
                            }
                        }
                        else
                        {
                            foreach (Handcard hc in p.ownHandCards)
                            {
                                if (hc.card.Transport == transportType.AIR)
                                {
                                    if (tmp == null || tmp.card.SpawnNumber < hc.card.SpawnNumber)
                                    {
                                        tmp = hc;
                                    }
                                }
                            }
                            if (tmp == null)
                            {
                                foreach (Handcard hc in p.ownHandCards)
                                {
                                    if (ad.attacker.card.DamageRadius > 1000)
                                    {
                                        if (hc.card.MaxHP > ad.attacker.Atk)
                                        {
                                            if (tmp == null || tmp.card.MaxHP < hc.card.MaxHP)
                                            {
                                                tmp = hc;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        if (hc.card.MaxHP > ad.attacker.Atk * 4 || hc.card.SpawnNumber > 3)
                                        {
                                            tmp = hc;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if (tmp == null)
                    {
                        foreach (Handcard hc in p.ownHandCards)
                        {
                            if (hc.card.type == boardObjType.PROJECTILE)
                            {
                                if (tmp == null || tmp.card.Atk < hc.card.Atk)
                                {
                                    tmp = hc;
                                }
                            }
                        }
                    }
                    if (tmp == null && p.ownMana >= 9)
                    {
                        tmp = p.getCheapestCard(boardObjType.NONE, targetType.NONE);
                    }
                    if (tmp != null)
                    {
                        allOpposite.Add(tmp.card.name, new opposite(tmp.card.name, 10, tmp, ad.attacker));
                    }
                }
            }

            int oppCount = allOpposite.Count;

            if (oppCount > 0)
            {
                foreach (opposite opp in allOpposite.Values)
                {
                    if (OppositeDB.ContainsKey(opp.name))
                    {
                        aopp = OppositeDB[opp.name];
                        foreach (attackDef ad in attackersList)
                        {
                            aName = ad.attacker.Name;
                            if (aopp.ContainsKey(aName))
                            {
                                opp.value -= aopp[aName];
                                //TODO: test - repeat for each or break;
                            }
                        }
                    }
                    else
                    {
                        Logger.Debug("!OppositeDB.ContainsKey");
                    }
                    if (bestOpposite != null)
                    {
                        if (bestOpposite.value < opp.value)
                        {
                            bestOpposite = opp;
                        }
                    }
                    else
                    {
                        bestOpposite = opp;
                    }
                }

                if (bestOpposite != null && bestOpposite.target != null)
                {
                    bestOpposite.target.attacker = new BoardObj(bestOpposite.hc.card.name, bestOpposite.hc.lvl);
                }
            }
            return(bestOpposite);
        }