public override ISkill ToSkill() { var result = new CheatSkill(); result.CheatType = (CheatType)CheatType; result.CardId = CardId; result.SkillName = SkillName; return(result); }
public static SkillItem Parse(ISkill skill) { if (skill == null) { return(null); } SkillItem result; if (skill is CheatSkill) { CheatSkillItem csi = new CheatSkillItem(); CheatSkill cs = skill as CheatSkill; result = csi; csi.CardId = cs.CardId; csi.CheatType = (int)cs.CheatType; csi.SkillName = cs.SkillName; } else if (skill is IAdditionalTypedSkill) { var atsi = new AdditionalTypedSkillItem(); var ats = skill as IAdditionalTypedSkill; result = atsi; atsi.AdditionalTypeId = GameEngine.Serialize(ats.AdditionalType); } else { result = new SkillItem(); } result.PlayerItem = PlayerItem.Parse(skill.Owner); if (skill.Owner != null) { result.SkillId = (byte)skill.Owner.ActionableSkills.IndexOf(skill); } return(result); }
public override void Run(GameEvent gameEvent, GameEventArgs eventArgs) { Player currentPlayer = Game.CurrentGame.CurrentPlayer; Trace.TraceInformation("Player {0} action.", currentPlayer.Id); while (!currentPlayer.IsDead) { bool newturn = false; foreach (var pl in Game.CurrentGame.Players) { if (GetReadyToGo(pl) && pl == currentPlayer) { newturn = true; } } if (newturn) { return; } Trace.Assert(Game.CurrentGame.UiProxies.ContainsKey(currentPlayer)); IPlayerProxy proxy = Game.CurrentGame.UiProxies[currentPlayer]; ISkill skill; List <Card> cards; List <Player> players; PlayerActionStageVerifier v = new PlayerActionStageVerifier(); Game.CurrentGame.Emit(GameEvent.PlayerIsAboutToUseCard, new PlayerIsAboutToUseOrPlayCardEventArgs() { Source = currentPlayer, Verifier = v }); if (!proxy.AskForCardUsage(new Prompt(Prompt.PlayingPhasePrompt), v, out skill, out cards, out players)) { break; } if (skill != null) { if (skill is CheatSkill) { if (!Game.CurrentGame.Settings.CheatEnabled) { break; } CheatSkill cs = skill as CheatSkill; if (cs.CheatType == CheatType.Card) { if (Game.CurrentGame.IsClient) { Game.CurrentGame.SyncUnknownLocationCardAll(null); } else { foreach (var searchCard in Game.CurrentGame.CardSet) { if (searchCard.Id == cs.CardId) { Game.CurrentGame.SyncUnknownLocationCardAll(searchCard); break; } } } foreach (var searchCard in Game.CurrentGame.CardSet) { if (searchCard.Id == cs.CardId) { CardsMovement move = new CardsMovement(); move.Cards = new List <Card>() { searchCard }; move.To = new DeckPlace(Game.CurrentGame.CurrentPlayer, DeckType.Hand); move.Helper = new MovementHelper(); Game.CurrentGame.MoveCards(move); break; } } } else if (cs.CheatType == CheatType.Skill) { foreach (var hero in Game.CurrentGame.OriginalCardSet) { bool found = false; if (hero.Type is HeroCardHandler) { foreach (var sk in (hero.Type as HeroCardHandler).Hero.Skills) { if (sk.GetType().Name == cs.SkillName) { Game.CurrentGame.PlayerAcquireAdditionalSkill(currentPlayer, sk.Clone() as ISkill, currentPlayer.Hero); found = true; break; } } } if (found) { break; } } } continue; } else if (skill is ActiveSkill) { GameEventArgs arg = new GameEventArgs(); arg.Source = Game.CurrentGame.CurrentPlayer; arg.Targets = players; arg.Cards = cards; ((ActiveSkill)skill).NotifyAndCommit(arg); Game.CurrentGame.NotificationProxy.NotifyActionComplete(); Game.CurrentGame.LastAction = skill; continue; } CompositeCard c; CardTransformSkill s = (CardTransformSkill)skill; VerifierResult r = s.TryTransform(cards, players, out c); Trace.TraceInformation("Player used {0}", c.Type); } else { Trace.Assert(cards[0] != null && cards.Count == 1); Trace.TraceInformation("Player used {0}", cards[0].Type); } try { Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, new Triggers.GameEventArgs() { Skill = skill, Source = Game.CurrentGame.CurrentPlayer, Targets = players, Cards = cards }); } catch (TriggerResultException) { } Game.CurrentGame.NotificationProxy.NotifyActionComplete(); Game.CurrentGame.LastAction = skill; } }