// 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])); }
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)); }