public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info) { room.SendCompulsoryTriggerLog(player, Name, true); room.BroadcastSkillInvoke(Name, player, info.SkillPosition); List <Player> targets = room.GetOtherPlayers(player); room.SortByActionOrder(ref targets); foreach (Player p in targets) { if (p.Alive && player.Alive && !p.IsAllNude() && RoomLogic.CanGetCard(room, player, p, "hej")) { room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, p.Name); int id = room.AskForCardChosen(player, p, "hej", Name, false, HandlingMethod.MethodGet); List <int> ids = new List <int> { id }; room.ObtainCard(player, ref ids, new CardMoveReason(MoveReason.S_REASON_EXTRACTION, player.Name, p.Name, Name, string.Empty), false); } } if (player.Alive) { room.LoseHp(player); } return(false); }
public override TriggerStruct Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who) { if (triggerEvent == TriggerEvent.TargetChosen && data is CardUseStruct use) { FunctionCard fcard = use.Card != null?Engine.GetFunctionCard(use.Card.Name) : null; if (base.Triggerable(player, room) && use.Card != null && fcard is Slash) { List <Player> targets = new List <Player>(); foreach (Player to in use.To) { if (RoomLogic.CanDiscard(room, to, to, "he")) { targets.Add(to); } } if (targets.Count > 0) { return(new TriggerStruct(Name, player, targets)); } } } else if (triggerEvent == TriggerEvent.Dying && data is DyingStruct dying && dying.Damage.Card != null && dying.Damage.Card.Name.Contains(Slash.ClassName) && !dying.Damage.Transfer && !dying.Damage.Chain && dying.Damage.From != null && dying.Damage.From.Alive && base.Triggerable(dying.Damage.From, room) && !player.IsKongcheng()) { if (RoomLogic.CanGetCard(room, dying.Damage.From, player, "h")) { return(new TriggerStruct(Name, dying.Damage.From)); } } return(new TriggerStruct()); }
public override bool OnSkillInvoke(TrustedAI ai, Player player, object data) { Room room = ai.Room; if (ai.WillSkipPlayPhase(player)) { int count = 0; foreach (Player p in room.GetOtherPlayers(player)) { if (!p.IsAllNude() && RoomLogic.CanGetCard(room, player, p, "hej")) { count++; } } Player erzhang = ai.FindPlayerBySkill("guzheng"); if (erzhang != null && !ai.IsFriend(erzhang) && player.HandcardNum + count > player.MaxHp + 2) { return(false); } } double value = 0; foreach (Player p in room.GetOtherPlayers(player)) { if (!p.IsAllNude() && RoomLogic.CanGetCard(room, player, p, "hej")) { value += ai.FindCards2Discard(player, p, string.Empty, "he", HandlingMethod.MethodGet).Score; } } return(value > 4); }
public override void Use(Room room, CardUseStruct card_use) { Player player = card_use.From; Player target = card_use.To[0]; if (target.Alive && !target.IsKongcheng() && RoomLogic.CanGetCard(room, player, target, "h")) { target.SetFlags("daoshu_target"); string suit = room.AskForChoice(player, "daoshu", string.Join("+", suits)); target.SetFlags("-daoshu_target"); int id = room.AskForCardChosen(player, target, "h", "daoshu", false, HandlingMethod.MethodGet); room.ObtainCard(player, id); if (WrappedCard.GetSuitString(room.GetCard(id).Suit) == suit) { room.Damage(new DamageStruct("daoshu", player, target)); } else { suit = WrappedCard.GetSuitString(room.GetCard(id).Suit); player.SetFlags("daoshu"); List <int> ids = new List <int>(); CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_GIVE, player.Name, target.Name, "daoshu", string.Empty); foreach (int card_id in player.GetCards("h")) { if (WrappedCard.GetSuitString(room.GetCard(card_id).Suit) != suit) { ids.Add(card_id); } } if (ids.Count == 0) { room.ShowAllCards(player, null, "daoshu"); } else if (ids.Count == 1) { room.ObtainCard(target, ref ids, reason, true); } else { List <int> to_give = room.AskForExchange(player, "daoshu", 1, 1, "@daoshu-give:" + target.Name, string.Empty, string.Format(".|^{0}|.|hand", suit), card_use.Card.SkillPosition); if (to_give.Count == 1) { room.ObtainCard(target, ref to_give, reason, true); } else { List <int> give = new List <int> { ids[0] }; room.ObtainCard(target, ref give, reason, true); } } } } }
public override TriggerStruct Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who) { if (base.Triggerable(player, room) && data is DamageStruct damage && damage.To.Alive && damage.To != player && !damage.To.IsAllNude() && RoomLogic.CanGetCard(room, player, damage.To, "hej")) { return(new TriggerStruct(Name, player)); } return(new TriggerStruct()); }
public override ScoreStruct GetDamageScore(TrustedAI ai, DamageStruct damage) { ScoreStruct score = new ScoreStruct { Score = 0 }; if (ai.HasSkill(Name, damage.To) && damage.Damage <= damage.To.Hp) { double value = 0; if (!damage.To.FaceUp && damage.Damage == 1) { value += 4; } Room room = ai.Room; foreach (Player p in room.GetOtherPlayers(damage.To)) { if (RoomLogic.CanGetCard(room, damage.To, p, "hej")) { value += 0.3; if (ai.IsEnemy(damage.To, p)) { if (!p.IsNude()) { value += 0.5; } else { value -= 1; } } } } if (damage.Damage > 1) { value *= (0.6 * (damage.Damage - 1)) + 1; } if (value > 0 && damage.Damage >= damage.To.Hp) { value /= 2; } if (!ai.IsFriend(damage.To)) { value = -value; } score.Score = value; } return(score); }
public override TriggerStruct Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who) { if (triggerEvent == TriggerEvent.Damage && data is DamageStruct damage && damage.To.Alive && !damage.To.IsNude() && base.Triggerable(player, room) && player.ContainsTag(Name) && player.GetTag(Name) is List <int> ids && RoomLogic.CanGetCard(room, player, damage.To, "he") && damage.Card.SubCards.Count == 1 && ids.Contains(damage.Card.SubCards[0])) { FunctionCard fcard = Engine.GetFunctionCard(damage.Card.Name); if (!(fcard is SkillCard)) { return(new TriggerStruct(Name, player)); } } return(new TriggerStruct()); }
public override TriggerStruct Cost(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info) { bool invoke = false; if (triggerEvent == TriggerEvent.TargetChosen && room.AskForSkillInvoke(ask_who, Name, player)) { invoke = true; } else if (triggerEvent == TriggerEvent.Dying && data is DyingStruct dying && dying.Damage.From != null && dying.Damage.From.Alive && !player.IsKongcheng() && RoomLogic.CanGetCard(room, ask_who, player, "h")) { invoke = true; } if (invoke) { room.SetEmotion(ask_who, "dragonphoenix"); return(info); } return(new TriggerStruct()); }
public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info) { if (data is DamageStruct damage) { room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, damage.To.Name); room.SendCompulsoryTriggerLog(player, name, true); room.BroadcastSkillInvoke(Name, player, info.SkillPosition); Player target = damage.To; List <string> handle = new List <string>(); if (!target.IsKongcheng() && RoomLogic.CanGetCard(room, player, target, "h")) { handle.Add("h^false^get"); } if (target.HasEquip() && RoomLogic.CanGetCard(room, player, target, "e")) { handle.Add("e^false^get"); } if (target.JudgingArea.Count > 0 && RoomLogic.CanGetCard(room, player, target, "j")) { handle.Add("j^false^get"); } List <int> ids = room.AskForCardsChosen(player, damage.To, handle, Name); if (ids.Count > 0) { room.ObtainCard(player, ref ids, new CardMoveReason(MoveReason.S_REASON_EXTRACTION, player.Name, damage.To.Name, Name, string.Empty), false); } if (player.Alive) { room.LoseHp(player); } } return(false); }
public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info) { if (triggerEvent == TriggerEvent.TargetChosen) { room.AskForDiscard(player, Name, 1, 1, false, true, "@dragonphoenix-discard"); } else if (data is DyingStruct dying && dying.Damage.From != null && dying.Damage.From.Alive && !player.IsKongcheng() && RoomLogic.CanGetCard(room, ask_who, player, "h")) { room.SendCompulsoryTriggerLog(ask_who, Name, false); int id = room.AskForCardChosen(ask_who, player, "h", Name, false, FunctionCard.HandlingMethod.MethodGet); CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_EXTRACTION, ask_who.Name, Name, Name); room.ObtainCard(ask_who, room.GetCard(id), reason, false); } return(false); }
public static List <Player> FindTuxiTargets(TrustedAI ai, Player player, int max) { List <Player> result = new List <Player>(); List <Player> enemies = ai.GetEnemies(player); ai.SortByHandcards(ref enemies, false); Room room = ai.Room; Player zhugeliang = ai.FindPlayerBySkill("kongcheng"); if (zhugeliang != null && ai.IsFriend(zhugeliang) && zhugeliang.HandcardNum == 1 && ai.GetEnemisBySeat(zhugeliang) > 0 && zhugeliang != player) { if (ai.IsWeak(zhugeliang)) { result.Add(zhugeliang); } else { List <int> ids = ai.GetKnownCards(zhugeliang); if (ids.Count == 1) { int id = ids[0]; if (!ai.IsCard(id, Jink.ClassName, zhugeliang) && !!ai.IsCard(id, Peach.ClassName, zhugeliang) && !ai.IsCard(id, Analeptic.ClassName, zhugeliang)) { result.Add(zhugeliang); } } } } foreach (Player p in enemies) { if (result.Contains(p) || !RoomLogic.CanGetCard(room, player, p, "h")) { continue; } List <int> ids = ai.GetKnownCards(p); foreach (int id in ids) { WrappedCard card = room.GetCard(id); if (card.Name == Peach.ClassName || card.Name == Nullification.ClassName || card.Name.Contains(Nullification.ClassName)) { result.Add(p); break; } } if (result.Count >= max) { break; } } if (result.Count < max) { foreach (Player p in enemies) { if (result.Contains(p) || !RoomLogic.CanGetCard(room, player, p, "h")) { continue; } if (ai.HasSkill("jijiu|qingnang|leiji|jieyin|beige|kanpo|liuli|qiaobian|zhiheng|guidao|tianxiang|lijian", p)) { result.Add(p); } if (result.Count >= max) { break; } } } if (result.Count < max) { foreach (Player p in enemies) { if (result.Contains(p) || !RoomLogic.CanGetCard(room, player, p, "h")) { continue; } int x = p.HandcardNum; bool good = true; if (x == 1 && ai.NeedKongcheng(p)) { good = false; } if (x >= 2 && ai.HasSkill("tuntian", p)) { good = false; } if (good) { result.Add(p); } if (result.Count >= max) { break; } } } return(result); }
public override bool TargetFilter(Room room, List <Player> targets, Player to_select, Player Self, WrappedCard card) { return(Self != to_select && targets.Count == 0 && !to_select.IsKongcheng() && RoomLogic.CanGetCard(room, Self, to_select, "h")); }