private IObservable <Unit> InstantiateEnemies(EnemiesDefinition enemiesDef) { return(Observable.Interval(TimeSpan.FromSeconds(enemiesDef.InstantiationInterval)) .Take(enemiesDef.Count) .Do(_ => { var def = configuration.GetEnemyByName(enemiesDef.EnemyName); GameProvider.GetGameView().InstantiateEnemy(def); }) .AsSingleUnitObservable()); }
private IObservable <long> Cycle(LevelDefinition levelDefinition, EnemiesDefinition currentEnemies) { return(Observable.Start(() => currentEnemies) .SelectMany(def => def.Delay.Equals(0) ? InstantiateEnemies(def) : Observable.Timer(TimeSpan.FromSeconds(def.Delay)) .SelectMany(_ => InstantiateEnemies(def))) .SelectMany(_ => levelDefinition.EnemiesList.Next(currentEnemies).SelectOrElse(next => Cycle(levelDefinition, next), () => { gamePlayEventObserver.OnNext(GamePlayEvent.LastRound()); return Observable.Empty <long>(); }))); }