Esempio n. 1
0
        private static GameState SummonMinnion(GameState gameState, SummonAction action, Minion minion = null)
        {
            var handManaUpdatedState = CardPlayUpdateHandMana(gameState, action.Card, action.Owner);

            return(gameState.With(handManaUpdatedState.Of(action.Owner)
                                  .With(minions: x => x.Insert(action.DesiredBoardPosition, minion ?? new Minion(action.Card)))));
        }
Esempio n. 2
0
        private static GameState CardPlayUpdateHandMana(GameState gameState, Card card, Player owner)
        {
            var currentPlayerState = gameState.Of(owner);
            var newPlayerState     = currentPlayerState.With(
                hand: x => x.RemoveCard(card),
                remainingMana: x => x - card.ManaCost);

            return(gameState.With(newPlayerState));
        }
Esempio n. 3
0
        public override GameState ApplyOn(GameState gameState, Player player, Minion caster)
        {
            var playerGameState = gameState.Of(player);

            if (playerGameState.Minions.Count == GameEngine.MaxOnboardCount)
            {
                return(gameState);
            }

            var summonAt = caster == null ? playerGameState.Minions.Count : playerGameState.Minions.IndexOf(caster) + 1;

            return(gameState.With(playerGameState.With(minions: x => x.Insert(summonAt, new Minion(_card)))));
        }
Esempio n. 4
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());
        }