Пример #1
0
        public static EffectFunc <TEvent, TData> Aggregate <TEvent, TData>(EffectFunc <TEvent, TData> func1, EffectFunc <TEvent, TData> func2,
                                                                           Func <Effect <Unit>, Effect <Unit>, Effect <Unit> > accumulator)
        {
            return((@event, data) =>
            {
                var ef1 = func1(@event, data);
                var ef2 = func2(@event, data);

                return accumulator(ef1, ef2);
            });
        }
Пример #2
0
        public static EffectFunc <TEvent, TData> Aggregate <TEvent, TData>(EffectFunc <TEvent, TData> func1, EffectFunc <TEvent, TData> func2,
                                                                           Func <IEffect, IEffect, IEffect> accumulator)
            where TData : struct
        {
            return((@event, data) =>
            {
                var ef1 = func1(@event, data);
                var ef2 = func2(@event, data);

                return accumulator(ef1, ef2);
            });
        }
Пример #3
0
 public EventActivitySetBuilder <TEvent, TData> Then(EffectFunc <TEvent, TData> func, EventPredicate <TEvent, TData> predicate = null)
 {
     _eventActivitySet.AddEffectHandler((whenEvent, data) =>
     {
         if (predicate != null && !predicate(whenEvent, data))
         {
             return(Effect.Pure());
         }
         return(func(whenEvent, data));
     });
     return(this);
 }
Пример #4
0
        public void AddEffectHandler(EffectFunc <TEvent, TData> func)
        {
            IEffect NewFunc(IEvent @event, InstanceData <TData> data)
            {
                if (_starterPredicate != null && !_starterPredicate((TEvent)@event, data))
                {
                    return(Effect.Pure());
                }
                return(func((TEvent)@event, data));
            }

            EffectFunc = EffectFuncs.Sequential(EffectFunc, NewFunc);
        }
Пример #5
0
 public static EffectFunc <TEvent, TData> Sequential <TEvent, TData>(EffectFunc <TEvent, TData> func1, EffectFunc <TEvent, TData> func2)
 {
     return(Aggregate(func1, func2, (effect1, effect2) => effect1.Then(effect2)));
 }
Пример #6
0
 protected static Action <PGame> MakeMultiTargetNormalEffect(PPlayer Player, PCard Card, TargetChooser AITargetChooser, PTrigger.PlayerCondition TargetCondition, EffectFunc Effect, int MaxNumber = -1)
 {
     return(MakeNormalEffect(Player, Card, AITargetChooser, (PGame Game, PPlayer _Player) => {
         return PNetworkManager.NetworkServer.ChooseManager.AskForTargetPlayers(_Player, TargetCondition, Card.Name, MaxNumber);
     }, Effect));
 }
Пример #7
0
 protected static Action <PGame> MakeNormalEffect(PPlayer Player, PCard Card, TargetChooser AITargetChooser, PTrigger.PlayerCondition TargetCondition, EffectFunc Effect)
 {
     return(MakeNormalEffect(Player, Card, AITargetChooser, (PGame Game, PPlayer _Player) => {
         return new List <PPlayer> {
             PNetworkManager.NetworkServer.ChooseManager.AskForTargetPlayer(_Player, TargetCondition, Card.Name)
         };
     }, Effect));
 }
Пример #8
0
 protected static Action <PGame> MakeNormalEffect(PPlayer Player, PCard Card, TargetChooser AITargetChooser, TargetChooser PlayerTargetChooser, EffectFunc Effect, Action <PGame, PPlayer, List <PPlayer> > StartAction = null, Action <PGame, PPlayer, List <PPlayer> > EndAction = null)
 {
     return((PGame Game) => {
         List <PPlayer> Targets = Player.IsAI ? AITargetChooser(Game, Player) : PlayerTargetChooser(Game, Player);
         Targets.RemoveAll((PPlayer _Player) => _Player == null);
         if (Targets.Count == 0)
         {
             return;
         }
         Game.Monitor.CallTime(PTime.Card.AfterEmitTargetTime, new PUseCardTag(Card, Player, Targets));
         if (Card.Point > 0)
         {
             Game.CardManager.MoveCard(Card, Player.Area.HandCardArea, Game.CardManager.SettlingArea);
         }
         Game.Monitor.CallTime(PTime.Card.AfterBecomeTargetTime, new PUseCardTag(Card, Player, Targets));
         Targets = ArrangeTargets(Game, Targets, Player);
         Game.TagManager.CreateTag(new PUseCardTag(Card, Player, Targets));
         StartAction?.Invoke(Game, Player, Targets);
         Targets.ForEach((PPlayer Target) => {
             if (Target != null && Target.IsAlive)
             {
                 Effect(Game, Player, Target);
             }
         });
         EndAction?.Invoke(Game, Player, Targets);
         Game.TagManager.PopTag <PUseCardTag>(PUseCardTag.TagName);
         if (Card.Point > 0)
         {
             Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Game.CardManager.ThrownCardHeap);
         }
         Game.Monitor.CallTime(PTime.Card.EndSettleTime, new PUseCardTag(Card, Player, Targets));
     });
 }