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