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; } } } }
public virtual void DamageEffect(TrustedAI ai, ref DamageStruct damage, DamageStruct.DamageStep step) { }
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]); }