示例#1
0
 public TargetSpaceCtx TargetSpace(string spaceLabel) => spirit.Bind(this.gameState)
 .Target(gameState.Island.AllSpaces.Single(x => x.Label == spaceLabel));
示例#2
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();
    }