예제 #1
0
        public StandardizedRuleGame(Encampment firstPlayerEncampment, IReadOnlyServiceLocator serviceLocator)
        {
            FirstPlayer  = new Player(firstPlayerEncampment);
            SecondPlayer = new Player(Terminologies.GetReversal(firstPlayerEncampment));

            var frontPlayer = GetPlayer(Encampment.Front);
            var backPlayer  = GetPlayer(Encampment.Back);

            ScoreHolder = new DefaultScoreHolder(new Dictionary <IPlayer, int> {
                { frontPlayer, 20 }, { backPlayer, 20 }
            });

            //終了条件をまとめる
            ScoreHolder.GetScore(frontPlayer).Where(value => value == 0).Subscribe(_ => gameEndSubject.OnNext(Unit.Default));
            ScoreHolder.GetScore(backPlayer).Where(value => value == 0).Subscribe(_ => gameEndSubject.OnNext(Unit.Default));

            handDatabase = new HandDatabase();

            //seasonSequencer.OnEndは季の開始の呼び出しと一体化している。
            //OnSeasonEndは季の開始前に呼び出されることが保証されている。
            StartNextSeason();
            handChangeObserver = new HandChangeObserver(HandDatabase, OnTurnEnd);
            seasonSequencer    = new SeasonSequencer(handChangeObserver.Observable, serviceLocator.GetInstance <ISeasonDeclarationProvider>(), 4);
            seasonSequencer.OnContinue.Subscribe(_ => ScoreRate *= 2);  //専用のクラス内に隠ぺいすべきかも
            seasonSequencer.OnStart.Subscribe(_ => StartNextSeason());

            var scoreCalculator = new ScoreCalculator(HandDatabase);

            seasonSequencer.OnEnd.Select(_ => Terminologies.GetReversal(CurrentTurn)) //終季の時点で終季した人のターンが終わってしまっているのでこの形にしている。
            .Select(GetPlayer)                                                        //終季の時点ではターンが終わらないようにした方がよい?
            .Select(scoreCalculator.Calculate)
            .Select(tuple => { tuple.score *= 2; return(tuple); })
            .Subscribe(tuple => ScoreHolder.MoveScore(tuple.scorer, tuple.score));
        }
예제 #2
0
        public void Init(IReadOnlyServiceLocator services, Action onComplete)
        {
            m_InputService         = services.Get <IInputService>();
            m_InputService.OnJump += () =>
            {
                m_Jump = true;
            };

            m_SpawnPoint = transform.localPosition;
            enabled      = true;
            onComplete.Invoke();
        }
예제 #3
0
        public RulesetList(IReadOnlyServiceLocator serviceLocator)
        {
            //RulesetNameとの相互依存関係を明確化する
            IGameInstanceFactory[] factories = new IGameInstanceFactory[]
            {
                new DefaultGameInstanceFactory <Domain.Entities.StandardizedRule.StandardizedRuleGame>(firstPlayerEncampment => new Domain.Entities.StandardizedRule.StandardizedRuleGame(firstPlayerEncampment, serviceLocator)),
                new DefaultGameInstanceFactory <Domain.Entities.StandardizedRule.StandardizedRuleGame>(firstPlayerEncampment => new Domain.Entities.StandardizedRule.StandardizedRuleGame(firstPlayerEncampment, serviceLocator)),
                new DefaultGameInstanceFactory <Domain.Entities.NoRule.NoRuleGame>(firstPlayerEncampment => new Domain.Entities.NoRule.NoRuleGame(firstPlayerEncampment)),
            };

            int i = 0;

            rulesets = factories.Select(factory =>
            {
                RulesetName rulesetName = (RulesetName)i;
                return(new Ruleset(i++, rulesetName.ToString(), "", factory));
            }).ToDictionary(ruleset => ruleset.id);
        }
예제 #4
0
 public void Init(IReadOnlyServiceLocator services, Action onComplete)
 {
     StartCoroutine(SpawnLoop());
     onComplete.Invoke();
 }