Esempio n. 1
0
 public override void DamageEffect(TrustedAI ai, ref DamageStruct damage, DamageStruct.DamageStep step)
 {
     if (step <= DamageStruct.DamageStep.Caused && damage.From != null && damage.From.Alive && ai.HasSkill(Name, damage.From) && damage.To.Hp >= damage.From.Hp &&
         damage.Card != null && damage.Card.Name.Contains(Slash.ClassName) && !damage.Transfer && !damage.Chain)
     {
         damage.Damage++;
     }
 }
 public override void DamageEffect(TrustedAI ai, ref DamageStruct damage, DamageStruct.DamageStep step)
 {
     if (damage.From != null && damage.Card != null && damage.From.HasWeapon(Name) && damage.Card.Name.Contains(Slash.ClassName) && !damage.Transfer && !damage.Chain)
     {
         Room       room = ai.Room;
         List <int> ids  = ai.GetKnownCards(damage.From);
         foreach (int id in ids)
         {
             if (damage.Card.SubCards.Contains(id))
             {
                 continue;
             }
             WrappedCard  card  = room.GetCard(id);
             FunctionCard fcard = Engine.GetFunctionCard(card.Name);
             if (fcard is Slash || fcard is Weapon)
             {
                 damage.Damage++;
                 break;
             }
         }
     }
 }
Esempio n. 3
0
 public virtual void DamageEffect(TrustedAI ai, ref DamageStruct damage, DamageStruct.DamageStep step)
 {
 }
Esempio n. 4
0
        public override ScoreStruct GetDamageScore(DamageStruct _damage, DamageStruct.DamageStep step = DamageStruct.DamageStep.Caused)
        {
            DamageStruct damage = new DamageStruct(_damage.Card, _damage.From, _damage.To, _damage.Damage, _damage.Nature)
            {
                Reason         = _damage.Reason,
                Steped         = _damage.Steped,
                Transfer       = _damage.Transfer,
                TransferReason = _damage.TransferReason,
                Chain          = _damage.Chain
            };

            if (!HasSkill("gangzhi", damage.To))
            {
                damage.Damage = DamageEffect(damage, step);
            }

            Player from = damage.From;
            Player to   = damage.To;

            if (damage.Steped < DamageStruct.DamageStep.Caused)
            {
                damage.Steped = DamageStruct.DamageStep.Caused;
            }

            ScoreStruct result_score = new ScoreStruct
            {
                Damage   = damage,
                DoDamage = true
            };

            if (!HasSkill("gangzhi", damage.To))
            {
                damage.Damage = DamageEffect(damage, DamageStruct.DamageStep.Done);
            }
            damage.Steped       = DamageStruct.DamageStep.Done;
            result_score.Damage = damage;

            List <ScoreStruct> scores = new List <ScoreStruct>();
            bool deadly = false;

            if (damage.Damage > 0 && !to.Removed)
            {
                double value = 0;
                value = Math.Min(damage.Damage, to.Hp) * 3.5;
                if (IsWeak(to))
                {
                    value += 4;
                    if (damage.Damage > to.Hp)
                    {
                        if (!CanSave(to, damage.Damage - to.Hp + 1))
                        {
                            int over_damage = damage.Damage - to.Hp;
                            for (int i = 1; i <= over_damage; i++)
                            {
                                double x = HasSkill("buqu", to) ? 1 / Math.Pow(i, 2) : (double)8 / Math.Pow(i, 2);
                                value += x;
                            }
                        }
                        else
                        {
                            deadly = true;
                        }
                    }
                }

                //刚直应该这里就停止计算
                if (HasSkill("gangzhi", to))
                {
                    if (IsFriend(to))
                    {
                        value = -value;
                    }
                    if (priority_enemies.Contains(to) && value > 0)
                    {
                        value *= 1.5;
                    }
                    if (to.GetRoleEnum() == Player.PlayerRole.Lord)
                    {
                        value *= 1.2;
                    }
                    result_score.DoDamage = false;
                    result_score.Score    = value;
                    return(result_score);
                }

                if (!to.Removed && CanResist(to, damage.Damage))
                {
                    result_score.Score = 3;
                }
                if (IsFriend(to))
                {
                    value = -value;
                    if (deadly && damage.From != null && damage.From.Alive)
                    {
                        if (RoomLogic.IsFriendWith(room, damage.From, damage.To) && !damage.From.IsNude())
                        {
                            value -= 3;
                        }
                        else if (!RoomLogic.WillBeFriendWith(room, damage.From, damage.To))
                        {
                            value -= 2;
                        }
                    }
                }
                else
                {
                    if (deadly && damage.From != null && damage.From.Alive)
                    {
                        if (RoomLogic.IsFriendWith(room, damage.From, damage.To) && !damage.From.IsNude())
                        {
                            value += 2.5;
                        }
                        else if (IsFriend(damage.From) && !RoomLogic.WillBeFriendWith(room, damage.From, damage.To))
                        {
                            value += 4;
                        }
                    }
                }

                foreach (SkillEvent e in skill_events.Values)
                {
                    if (e.Name != damage.Reason)
                    {
                        value += e.GetDamageScore(this, damage).Score;
                    }
                }
                if (priority_enemies.Contains(to) && value > 0)
                {
                    value *= 1.5;
                }

                //ai debug log

                /*
                 * if ((RoomLogic.IsFriendWith(room, self, to) || IsFriend(to)) && value > 0)
                 * {
                 *  string damage_from = damage.From != null ? string.Format("{0},{1} has skills {2}", damage.From.General1Showed ? damage.From.ActualGeneral1 : "hidden head",
                 *      damage.From.General2Showed ? damage.From.ActualGeneral2 : "hidden deputy", string.Join(",", GetKnownSkills(damage.From))) : "no damage from";
                 *  string damage_str = string.Format("nature {0} count {1} reason {2}", damage.Nature == DamageStruct.DamageNature.Normal ? "normal" : damage.Nature == DamageStruct.DamageNature.Fire ?
                 *      "fire" : "thunder", damage.Damage, damage.Card != null ? damage.Card.Name : damage.Reason);
                 *  string damage_to = string.Format("{0},{1} has skills {2}", damage.To.General1Showed ? damage.To.ActualGeneral1 : "hidden head",
                 *      damage.To.General2Showed ? damage.To.ActualGeneral2 : "hidden deputy", string.Join(",", GetKnownSkills(damage.To)));
                 *  string self_str = string.Format("{0},{1}", self.ActualGeneral1, self.ActualGeneral2);
                 *
                 *  File.AppendAllText("ai_damage_log.txt", string.Format("{0} judge damage {1} against {2} {6} and value is {3} and ai judge target is my {4} and I'm {5}\r\n",
                 *      damage_from, damage_str, damage_to, value, IsFriend(self, to) ? "friend" : "enemy", self_str, to.Chained ? "chained" : string.Empty));
                 * }
                 */

                result_score.Score = value;
            }
            scores.Add(result_score);

            if (damage.Card != null && from != null && !damage.Transfer)
            {
                if (damage.Card.Name.Contains(Slash.ClassName) && from.HasWeapon(IceSword.ClassName) && !to.IsNude())
                {
                    ScoreStruct score = FindCards2Discard(from, to, string.Empty, "he", HandlingMethod.MethodDiscard, 2, true);
                    scores.Add(score);
                }
            }

            CompareByScore(ref scores);
            return(scores[0]);
        }