Esempio n. 1
0
        private static GameState NotifyAllAboutMinionEvents(GameState gameState, Minion triggeringMinion)
        {
            gameState = triggeringMinion.RaisedEvents.Aggregate(gameState,
                                                                (state, raisedEvent) =>
                                                                state.MinionEventOccured(new Event(raisedEvent, Target.FriendlyMinions), triggeringMinion));

            return(gameState.UpdateCharacter(triggeringMinion, triggeringMinion.ClearRaisedEvents()));
        }
Esempio n. 2
0
        public GameState ApplyAction(GameState gameState, GameAction gameAction)
        {
            var newGameState = TypeSwitchExpr.On <GameAction, GameState>(gameAction)
                               .Case <SummonBattlecryTargetable>(action =>
            {
                var withMinionSummoned = SummonMinnion(gameState, action);
                return(action.ApplyEffect(withMinionSummoned, action.Owner));
            })
                               .Case <SummonBattlecryTargetless>(action =>
            {
                var minionToSummon     = new Minion(action.Card);
                var withMinionSummoned = SummonMinnion(gameState, action, minionToSummon);
                return(action.ApplyBattlecry(withMinionSummoned, action.Owner, minionToSummon));
            })
                               .Case <SummonAction>(action => SummonMinnion(gameState, action))
                               .Case <CastSpell>(action =>
            {
                var handManaUpdated  = CardPlayUpdateHandMana(gameState, action.Card, action.Owner);
                var withSpellApplied = action.ApplyEffect(handManaUpdated, action.Owner);
                return(withSpellApplied.PlayerEventOccured(new Event(EventType.SpellCasted, Target.FriendlyPlayer), action.Owner));
            })
                               .Case <AttackAction>(action =>
                                                    TypeSwitchExpr.On <ITarget <Character>, GameState>(action.Target)
                                                    .Case <Minion>(target =>
            {
                var updatedAttacker     = action.Attacker.RecieveDamage(target.Attack);
                var updatedTarget       = target.RecieveDamage(action.Attacker.Attack);
                var withAttackerUpdated = gameState.UpdateCharacter(action.Attacker, updatedAttacker);
                var withBothUpdated     = withAttackerUpdated.UpdateCharacter(target, updatedTarget);
                return(withBothUpdated);
            })
                                                    .Case <Face>(target =>
                                                                 gameState.With(gameState.OfOpponent(action.Owner).With(face: x => x.RecieveDamage(action.Attacker.Attack))))
                                                    .ElseThrow())
                               .ElseThrow();

            newGameState = ProcessChainReactions(newGameState);

            return(newGameState.RemoveDeadBodies());
        }
        public GameState ApplyOn(GameState gameState, Player player, ITarget <Character> target)
        {
            var updatedTarget = _effects.Aggregate((Character)target, (t, effect) => effect.ApplyOn(t));

            return(gameState.UpdateCharacter((Character)target, updatedTarget));
        }