public void Run(Player owner, GameEvent gameEvent, GameEventArgs eventArgs) { Game.CurrentGame.DrawCards(owner, 1); Game.CurrentGame.SyncImmutableCardsAll(owner.HandCards()); Game.CurrentGame.ShowHandCards(owner, owner.HandCards()); var result = from card in owner.HandCards() select card.SuitColor; if (result.Distinct().Count() == 1) { Game.CurrentGame.ForcePlayerDiscard(eventArgs.Source, (p, i) => { return 1 - i; }, false); } }
void KuiWeiDiscard(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs) { Owner[KuiWeiStatus] = 0; int count = GetWeaponCount(); if (count == 0 || Owner.HandCards().Count + Owner.Equipments().Count == 0) return; NotifySkillUse(); if (count >= Owner.HandCards().Count + Owner.Equipments().Count) { List<Card> cards = new List<Card>(); cards.AddRange(Owner.HandCards()); cards.AddRange(Owner.Equipments()); Game.CurrentGame.HandleCardDiscard(Owner, cards); return; } Game.CurrentGame.ForcePlayerDiscard(Owner, (p, d) => { return count - d; }, true); }
void Run(Player owner, GameEvent gameEvent, GameEventArgs args) { while (owner.HandCards().Count > 0 && owner.DelayedTools().Count > 0) { List<List<Card>> answer; List<DeckPlace> sourceDeck = new List<DeckPlace>(); sourceDeck.Add(new DeckPlace(owner, DeckType.DelayedTools)); sourceDeck.Add(new DeckPlace(owner, DeckType.Hand)); AdditionalCardChoiceOptions options = new AdditionalCardChoiceOptions(); options.IsCancellable = true; if (owner.AskForCardChoice(new CardChoicePrompt("XiuLuo", owner), sourceDeck, new List<string>() { "XLJinNang", "XLShouPai" }, new List<int>() { 1, 1 }, new XiuLuoVerifier(), out answer, options)) { NotifySkillUse(); Game.CurrentGame.HandleCardDiscard(owner, answer[1]); Game.CurrentGame.HandleCardDiscard(owner, answer[0]); } else break; } }
protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo) { IPlayerProxy ui = Game.CurrentGame.UiProxies[source]; if (source.IsDead) return; if (dest.HandCards().Count + dest.Equipments().Count + dest.DelayedTools().Count == 0) return; // ShunChai -> WuXie(from target) -> WuXie(soemone else) -> target has no card List<DeckPlace> places = new List<DeckPlace>(); places.Add(new DeckPlace(dest, DeckType.Hand)); places.Add(new DeckPlace(dest, DeckType.Equipment)); places.Add(new DeckPlace(dest, DeckType.DelayedTools)); List<string> resultDeckPlace = new List<string>(); resultDeckPlace.Add(ResultDeckName); List<int> resultDeckMax = new List<int>(); resultDeckMax.Add(1); List<List<Card>> answer; if (!ui.AskForCardChoice(new CardChoicePrompt(ChoicePrompt), places, resultDeckPlace, resultDeckMax, new RequireOneCardChoiceVerifier(true), out answer)) { Trace.TraceInformation("Player {0} Invalid answer", source.Id); answer = new List<List<Card>>(); answer.Add(Game.CurrentGame.PickDefaultCardsFrom(places)); } Card theCard = answer[0][0]; if (ShunChaiDest(source, dest).DeckType == DeckType.Discard) { Game.CurrentGame.HandleCardDiscard(dest, new List<Card>() { theCard }); } else { Game.CurrentGame.HandleCardTransferToHand(dest, source, new List<Card>() { theCard }); } }
bool TianMingProcess(Player player) { int discardedCount = Math.Min(player.HandCards().Count + player.Equipments().Count, 2); ISkill skill; List<Card> cards; List<Player> players; CardUsagePrompt prompt = new CardUsagePrompt("TianMing"); CardUsagePrompt otherPrompt = new CardUsagePrompt("TianMingOther", discardedCount); CardUsagePrompt otherIsNakedPrompt = new CardUsagePrompt("TianMingOtherIsNaked"); if (player.AskForCardUsage(player == Owner ? prompt : (discardedCount == 0 ? otherIsNakedPrompt : otherPrompt), new TianMingVerifier(discardedCount), out skill, out cards, out players)) { if (player == Owner) { TianMingEffect = 0; } else if (player.IsMale) { TianMingEffect = 1; } else { TianMingEffect = 2; } NotifySkillUse(); if (cards.Count > 0) { Game.CurrentGame.HandleCardDiscard(player, cards); } Game.CurrentGame.DrawCards(player, 2); return true; } return false; }
public void OnJudgeBegin(Player player, GameEvent gameEvent, GameEventArgs eventArgs) { if (player.HandCards().Count == 0 && !player.Equipments().Any(card => card.SuitColor == SuitColorType.Black)) { return; } ISkill skill; List<Card> cards; List<Player> players; Card c = Game.CurrentGame.Decks[eventArgs.Source, DeckType.JudgeResult].Last(); if (Game.CurrentGame.UiProxies[player].AskForCardUsage(new CardUsagePrompt("GuiDao", eventArgs.Source, c.Suit, c.Rank), new GuiDaoVerifier(), out skill, out cards, out players)) { NotifySkillUse(); Card theCard = cards[0]; theCard.Log = new ActionLog(); theCard.Log.Source = player; theCard.Log.SkillAction = this; theCard.Log.GameAction = GameAction.ReplaceJudge; Game.CurrentGame.EnterAtomicContext(); List<Card> toDiscard = new List<Card>() {Game.CurrentGame.Decks[eventArgs.Source, DeckType.JudgeResult].Last()}; CardsMovement move = new CardsMovement(); move.Cards = new List<Card>(); move.Cards.AddRange(cards); move.To = new DeckPlace(eventArgs.Source, DeckType.JudgeResult); Game.CurrentGame.MoveCards(move); Game.CurrentGame.PlayerLostCard(player, cards); Game.CurrentGame.HandleCardTransferToHand(null, player, toDiscard); Game.CurrentGame.ExitAtomicContext(); } }
protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo) { if (source.IsDead) return; if (dest.HandCards().Count + dest.Equipments().Count == 0) return; // ShunChai -> WuXie(from target) -> WuXie(soemone else) -> target has no card List<string> resultDeckPlace = new List<string>(); resultDeckPlace.Add("GuoHeChaiQiao"); List<int> resultDeckMax = new List<int>(); resultDeckMax.Add(1); List<List<Card>> answer; bool doHandCard = true; if (dest.Equipments().Count != 0) { int result = 0; source.AskForMultipleChoice(new MultipleChoicePrompt("GuoHeChaiQiao2"), new List<OptionPrompt>() { new OptionPrompt("ShouPai"), new OptionPrompt("ZhuangBeiPai") }, out result); if (result == 1) doHandCard = false; } if (doHandCard) { Game.CurrentGame.SyncImmutableCards(source, Game.CurrentGame.Decks[dest, DeckType.Hand]); Game.CurrentGame.HandCardVisibility[source].Add(dest); var places = new List<DeckPlace>() { new DeckPlace(dest, DeckType.Hand) }; if (!source.AskForCardChoice(new CardChoicePrompt("GuoHeChaiQiao2"), places, resultDeckPlace, resultDeckMax, new RequireOneCardChoiceVerifier(true), out answer)) { Trace.TraceInformation("Player {0} Invalid answer", source.Id); answer = new List<List<Card>>(); answer.Add(Game.CurrentGame.PickDefaultCardsFrom(places)); } foreach (Card c in dest.HandCards()) Game.CurrentGame.HideHandCard(c); Game.CurrentGame.HandCardVisibility[source].Remove(dest); Game.CurrentGame.HandleCardDiscard(dest, answer[0]); } else { var places = new List<DeckPlace>() { new DeckPlace(dest, DeckType.Equipment) }; if (!source.AskForCardChoice(new CardChoicePrompt("GuoHeChaiQiao2"), places, resultDeckPlace, resultDeckMax, new RequireOneCardChoiceVerifier(true), out answer)) { Trace.TraceInformation("Player {0} Invalid answer", source.Id); answer = new List<List<Card>>(); answer.Add(Game.CurrentGame.PickDefaultCardsFrom(places)); } Game.CurrentGame.HandleCardDiscard(dest, answer[0]); } }
bool canTrigger(Player p, GameEvent e, GameEventArgs a) { if (e == GameEvent.CardsLost) { if (!a.Cards.Any(c => c.HistoryPlace1.DeckType == DeckType.Hand)) return false; } if (e == GameEvent.CardsAcquired) { if (!a.Cards.Any(c => c.Place.DeckType == DeckType.Hand)) return false; } if (e == GameEvent.AfterHealthChanged && p.Health - (a as HealthChangedEventArgs).Delta < 0) return false; return (Game.CurrentGame.CurrentPhaseEventIndex == 3 || Game.CurrentGame.CurrentPhase != TurnPhase.Discard) && p.HandCards().Count < p.LostHealth; }
void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs) { int drawCount = Owner.LostHealth; Game.CurrentGame.DrawCards(Owner, drawCount); drawCount = Math.Min(Owner.HandCards().Count, drawCount); while (drawCount > 0) { ISkill skill; List<Card> cards; List<Player> players; if (Owner.AskForCardUsage(new CardUsagePrompt("MiJi", drawCount), new MiJiVerifier(drawCount), out skill, out cards, out players)) { drawCount -= cards.Count; Game.CurrentGame.HandleCardTransferToHand(Owner, players[0], cards); } else { drawCount = 0; } } }
void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs) { var args = eventArgs as DamageEventArgs; int damage = args.Magnitude; while (damage-- > 0) { if (!AskForSkillUse()) break; Game.CurrentGame.DrawCards(Owner, 1); ISkill skill; List<Card> cards; List<Player> players; if (!Game.CurrentGame.UiProxies[Owner].AskForCardUsage(new CardUsagePrompt("QuanJi"), new QuanJiVerifier(), out skill, out cards, out players)) { cards = new List<Card>(); cards.Add(Owner.HandCards().First()); } Game.CurrentGame.HandleCardTransfer(Owner, Owner, QuanDeck, cards); } }
protected override bool VerifyPlayer(Player source, Player player) { return player != source && player.HandCards().Count + player.Equipments().Count > 0; }
public Card SelectACardFrom(Player from, Player ask, Prompt prompt, String resultdeckname, bool equipExcluded = false, bool delayedToolsExcluded = true, bool noReveal = false) { var deck = from.HandCards(); if (!equipExcluded) deck = new List<Card>(deck.Concat(from.Equipments())); if (!delayedToolsExcluded) deck = new List<Card>(deck.Concat(from.DelayedTools())); if (deck.Count == 0) return null; List<DeckPlace> places = new List<DeckPlace>(); places.Add(new DeckPlace(from, DeckType.Hand)); if (!equipExcluded) places.Add(new DeckPlace(from, DeckType.Equipment)); if (!delayedToolsExcluded) places.Add(new DeckPlace(from, DeckType.DelayedTools)); List<List<Card>> answer; if (!ask.AskForCardChoice(prompt, places, new List<string>() { resultdeckname }, new List<int>() { 1 }, new RequireOneCardChoiceVerifier(noReveal), out answer)) { Trace.TraceInformation("Player {0} Invalid answer", ask); answer = new List<List<Card>>(); answer.Add(new List<Card>()); answer[0].Add(deck.First()); } Card theCard = answer[0][0]; if (noReveal) { SyncCard(from, ref theCard); } else { SyncCardAll(ref theCard); } Trace.Assert(answer.Count == 1 && answer[0].Count == 1); return theCard; }
protected override bool VerifyPlayer(Player source, Player player) { return Math.Max(player.Health, 0) != player.HandCards().Count && source[SongCiTarget[player]] == 0; }
void Run(Player p, GameEvent e, GameEventArgs a) { Game.CurrentGame.DrawCards(p, p.LostHealth - p.HandCards().Count); }
protected override bool? AdditionalVerify(Player source, List<Card> cards, List<Player> players) { if (source[MiZhaoUsed] != 0 || source.HandCards().Count == 0) return false; return true; }
protected override bool VerifyPlayer(Player source, Player player) { return player != target && player.HandCards().Count > 0; }
public override VerifierResult FastVerify(Player source, ISkill skill, List<Card> cards, List<Player> players) { if (skill != null || (cards != null && cards.Count != 0)) { return VerifierResult.Fail; } if (players == null || players.Count == 0) { return VerifierResult.Partial; } foreach (Player p in players) { if (p == source) { return VerifierResult.Fail; } if (Game.CurrentGame.Decks[p, DeckType.Hand].Count == 0) { return VerifierResult.Fail; } if (p.HandCards().Count <= source.HandCards().Count) return VerifierResult.Fail; } if (players.Count > 1) { return VerifierResult.Fail; } return VerifierResult.Success; }
protected override bool? AdditionalVerify(Player source, List<Card> cards, List<Player> players) { return source[DaHeUsed] == 0 && source.HandCards().Count > 0; }
protected override bool VerifyPlayer(Player source, Player player) { return source != player && player.HandCards().Count > 0; }