Exemple #1
0
        public override GameState?StateUpdate()
        {
            /*
             * 0. ** обновляем UI голосования **
             * 1. обновляем таймер голосования
             *  если таймер (голосование) закончился
             *      распределяем деньги (Context.Company.ActiveContract.Earnings) за контракт:
             *      в зависимости от результатов голосования
             *      c_Investors vs c_Company (percent)
             *      Company.Balance += c_Company * Earnings
             *
             *      for each user in active users:
             *          user balance increase by c_Investors * Earnings
             *
             ** не делим на количество человек
             **
             **     смотрим счетчик контрактов (кол-во до события)
             **     если счетчик достиг Х
             **         переходим в EventState
             **     иначе
             **         переходим в ContractStart
             */
            if (_votingState == null)
            {
                return(GameState.Idle);
            }

            _votingState.Update();
            if (_votingState.CanBeFinished())
            {
                _votingState.Finish(Context);
                var earnings       = _reward;
                var companyVotes   = _votingState.Results[CompanyOption];
                var investorsVotes = _votingState.Results[InvestorsOption];
                var total          = companyVotes + investorsVotes;
                var toCompany      = 0.5f;
                if (total > 0)
                {
                    toCompany = (float)companyVotes / total;
                }

                var toUsers = Mathf.Clamp01(1f - toCompany);

                SoundManager.Instance.Play(SoundBank.Instance.MoneyEarned);
                Context.Company.Balance += earnings * toCompany;
                // TODO: выплаты только тем, кто участвовал в контракте
                foreach (var activeUser in Context.Db.GetActiveUsers())
                {
                    activeUser.Balance += earnings * toUsers;
                }

                if (Context.ContractsTillNextEvent <= 0)
                {
                    Context.ContractsTillNextEvent = Common.ContractsTillNextEvent;
                    return(GameState.Event);
                }

                Context.ContractsTillNextEvent -= 1;

                // New contract
                return(GameState.ChooseContractStart);
            }

            return(null);
        }