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;
}
}