// Find Range
    // This is virtual so Volcano Targetting can call base()
    public virtual IEnumerable <Space> GetTargetOptionsFromKnownSource(
        Spirit self,
        GameState gameState,
        TargettingFrom powerType,
        IEnumerable <Space> source,
        TargetCriteria targetCriteria
        )
    {
        var ctx = self.BindMyPower(gameState); // !!! should this be Power???

        return(source                          // starting here
               .SelectMany(x => x.Range(targetCriteria.Range))
               .Distinct()
               .Where(s => ctx.Target(s).Matches(targetCriteria.Filter)));             // matching this destination
    }
 TargetSpaceCtx MakeFreshCtx()
 {
     return(spirit.BindMyPower(gs).Target(board[5]));
 }
示例#3
0
    public void Start()
    {
        async Task LoopAsync()
        {
            try {
                // Handle any unresolved Initialization action - (ocean/beast)
                GameState.Phase = Phase.Init;
                await Spirit.ResolveActions(Spirit.Bind(GameState));

                // !!! if this is here, why do we need to put it in the Spirit.Growth() method?

                Dictionary <int, IMemento <GameState> > savedGameStates = new Dictionary <int, IMemento <GameState> >();
                while (true)
                {
                    savedGameStates[GameState.RoundNumber] = GameState.SaveToMemento();
                    DateTime lastSaveTimeStamp = DateTime.Now;
                    try {
                        LogRound();

                        GameState.Phase = Phase.Growth;
                        LogPhase();
                        await Spirit.DoGrowth(GameState);

                        await Spirit.SelectAndPlayCardsFromHand();

                        GameState.Phase = Phase.Fast;
                        LogPhase();
                        await Spirit.ResolveActions(Spirit.BindMyPower(GameState));

                        GameState.Phase = Phase.Invaders;
                        LogPhase();
                        await InvaderPhase.ActAsync(GameState);

                        GameState.Phase = Phase.Slow;
                        LogPhase();
                        await Spirit.ResolveActions(Spirit.BindMyPower(GameState));

                        await GameState.TriggerTimePasses();
                    } catch (GameStateCommandException cmdEx) {
                        if (cmdEx.Cmd is Rewind rewind && savedGameStates.ContainsKey(rewind.TargetRound))
                        {
                            GameState.LoadFrom(savedGameStates[rewind.TargetRound]);
                            foreach (int laterRounds in savedGameStates.Keys.Where(k => k > rewind.TargetRound).ToArray())
                            {
                                savedGameStates.Remove(laterRounds);
                            }
                        }
                    }
                }
            }
            catch (GameOverException gameOver) {
                this.GameState.Result = gameOver.Status;
                GameState.Log(gameOver.Status);
            }
            catch (Exception ex) {
                GameState.Log(new LogException(ex));
            }
        }

        _ = LoopAsync();
    }
 protected void When_PlayingCard()
 {
     _ = card.ActivateAsync(spirit.BindMyPower(gameState));
 }