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