/// <summary>
        /// リールに対するリーチ演出シーケンスを取得する
        /// </summary>
        /// <param name="startRole">リーチ演出を開始するときに正面に出ているRole</param>
        /// <param name="endRole">リーチ演出を完了すときに正面に出ているRole</param>
        /// <param name="prop">リーチ演出に必要な情報</param>
        /// <returns>各Roleに対するリーチ演出シーケンス</returns>
        public IReelSequence CreateReachReRollSequence(RoleValue startRole, RoleValue endRole, ReachProductionProperty prop)
        {
            return(tweenProvider.DictionarySelect(provider => GetRoleSequenceOnReachProduction(provider))
                   .ToReelSequence());

            //各Roleのリーチ演出シーケンスを取得する
            Sequence GetRoleSequenceOnReachProduction(RoleTweenProvider provider)
            {
                Sequence sequence = DOTween.Sequence();

                foreach (var role in RoleValue.ForwardLoops(startRole, endRole))
                {
                    var angle = frontRoleAngleTable.GetAngleTable(role)[provider.RoleValue];

                    float duration, interval;
                    //残り切り替わり回数によって各種間隔を切り替える
                    if (RoleValue.RemainCount(role, endRole) > prop.FastModeThreshold)
                    { //残り切り替わり回数がしきい値より多い
                        duration = prop.FastSwitchingDuration;
                        interval = prop.FastSwitchInterval;
                    }
                    else
                    { //残り切り替わり回数がしきい値を切った
                        duration = prop.SwitchingDuraion;
                        interval = prop.SwitchInterval;
                    }

                    sequence = sequence.Append(provider.RollAbsolutely(angle, duration, AngleTweenDirection.Forward))
                               .AppendInterval(interval);
                }
                return(sequence);
            }
        }
        /// <summary>
        /// SequenceをReelSequenceに変換する
        /// </summary>
        /// <param name="sequence">ソース</param>
        /// <param name="roleAs">ソースSequenceをどのRoleにアタッチするか</param>
        /// <returns></returns>
        public static IReelSequence AsReelSequence(this Sequence sequence, RoleValue roleAs)
        {
            IReelSequence sq = ReelSequence.Empty();

            sq[roleAs] = sequence;
            return(sq);
        }
        /// <summary>
        /// リール上に復帰するシーケンスを生成します。
        /// </summary>
        /// <param name="frontRole">正面に表示するRole</param>
        /// <param name="duration"></param>
        /// <returns></returns>
        public IReelSequence CreateBackToReelSequence(RoleValue frontRole, float duration)
        {
            var table = frontRoleAngleTable.GetAngleTable(frontRole);

            return(tweenProvider.DictionarySelect(provider => provider.BackToReelPosition(table[provider.RoleValue], duration)
                                                  .ToSequence())
                   .ToReelSequence());
        }
Beispiel #4
0
                public Scenario GenerateScenario()
                {
                    var role1 = RoleValue.FromRandom();
                    var role2 = RoleValue.FromRandom(role1);
                    var role3 = RoleValue.FromRandom(role1, role2);

                    return(Scenario.Lose(new RoleSet(role1, role2, role3)));
                }
Beispiel #5
0
        /// <summary>
        /// 计算实际影响
        /// </summary>
        public override void ComputeImpact()
        {
            if (null == Owner || null == Target || null == Skill)
            {
                return;
            }

            // 1、免伤公式
            // 免伤率=防御/(防御参数+防御)*min(0.9/0.8,防御方等级/攻击方等级)
            //
            // 2、随机属性公式
            // 命中率=命中等级/3000
            // 闪避率=闪避等级/3000
            // 暴击率=暴击等级/3000
            // 暴抗率=暴抗等级/3000
            // 格挡率=格挡等级/3000
            //
            // 战斗时先计算是否命中,命中概率=攻击方命中率/(攻击方命中率+防御方闪避率),
            // 如果命中进入减伤和伤害加深的计算
            // 之后再判断是否暴击,暴击概率=攻击方暴击率/(攻击方暴击率+防御方暴抗率),暴击的话乘以暴击系数,不暴击按正常伤害
            // 最后判断是否格挡,格挡的话在已有伤害的基础上乘以50%
            RoleValue OwnerVal = Owner.FinalRoleValue;
            RoleValue revVal   = Target.FinalRoleValue;
            int       hit      = OwnerVal.Hit;

            if (hit == 0)
            {
                hit = 1;
            }

            if (!IsRateHit(hit, revVal.Dodge, 0, 0)) //未命中
            {
                mHitType = eHitType.Miss;
                return;
            }

            mHitType = eHitType.Hit;
            if (IsRateHit(0, 1, OwnerVal.DeadlyHit / 3000 + OwnerVal.DeadlyHitRate, 0))
            {
                mHitType = eHitType.Deadly; //致命
            }
            else if (IsRateHit(OwnerVal.Crit, revVal.CritDef, OwnerVal.CritRate, revVal.CritDefRate))
            {
                mHitType = eHitType.Crit; //暴击
            }
            else if (IsRateHit(0, 1, Target.FinalRoleValue.Block / 3000 + Target.FinalRoleValue.BlockRate, 0))
            {
                mHitType = eHitType.Block; //格挡
            }

            float attackTotal = Owner.FinalRoleValue.Atk * Skill.LvData.damagePercent + Skill.Level * Skill.LvData.levelParam + Skill.LvData.damage;
            float defendTotal = Target.FinalRoleValue.GetDef(Owner.ElemType);

            mDamageHP = ComputeAttackImpact(attackTotal, defendTotal, mHitType, Owner, Target);
        }
Beispiel #6
0
        /// <summary>
        /// 计算实际影响
        /// </summary>
        public override void ComputeImpact()
        {
            if (null == Owner || null == Target || null == Skill)
            {
                return;
            }

            RoleValue OwnerVal = Owner.FinalRoleValue;
            var       addHp    = Owner.FinalRoleValue.Atk * Skill.LvData.damagePercent + Skill.Level * Skill.LvData.levelParam + Skill.LvData.damage;

            if (IsRateHit(OwnerVal.Crit, 0, OwnerVal.CritRate, 0))
            {
                addHp *= 1.5f;
            }
            mDamageHP = (int)addHp;
        }
Beispiel #7
0
        /// <summary>
        ///     Initializes User collection in database with demo values.
        /// </summary>
        /// <author>Anna Krebs</author>
        /// <param name="roleValue"></param>
        /// <returns></returns>
        private async Task InitRoleCollection(RoleValue roleValue)
        {
            var roleValueString = roleValue.ToString();

            var roleCollection = _mongoContext.Database.GetCollection <Role>(nameof(Role));
            var isDuplicate    =
                await MongoHelper <Role> .IsDuplicate(Constants.Name, roleValueString, roleCollection, null);

            if (!isDuplicate)
            {
                var role = new Role {
                    Name = roleValueString
                };
                await roleCollection.InsertOneAsync(role);

                Log.Info($"Inserted role with name {role} with Id {role.ObjectId} into database.");
            }
        }
Beispiel #8
0
                public Scenario GenerateScenario()
                {
                    //リーチする役を決定
                    RoleValue reachRole = RoleValue.FromRandom();
                    //外れる役を決定
                    RoleValue loseRole = RoleValue.FromRandom(reachRole);

                    //リーチ後に当たるかはずれるかを決定
                    bool isWin = UnityEngine.Random.value < reachToWinProbability;

                    //リーチ後の確定役を決定
                    RoleValue afterReachRole;

                    //あたりなら揃える
                    if (isWin)
                    {
                        afterReachRole = reachRole;
                    }
                    //ハズレならその前の役にする
                    else
                    {
                        afterReachRole = reachRole.Previous;
                    }

                    //はずれる位置を決定
                    switch (UnityEngine.Random.Range(0, 3))
                    {
                    case 0:
                        return(Scenario.Reach(new RoleSet(loseRole, reachRole, reachRole), afterReachRole));

                    case 1:
                        return(Scenario.Reach(new RoleSet(reachRole, loseRole, reachRole), afterReachRole));

                    case 2:
                        return(Scenario.Reach(new RoleSet(reachRole, reachRole, loseRole), afterReachRole));

                    default:
                        throw new Exception("リーチの位置を決定できませんでした");
                    }
                }
Beispiel #9
0
        /// <summary>
        ///     Initializes User collection in database with demo values.
        /// </summary>
        /// <author>Anna Krebs</author>
        /// <param name="email"></param>
        /// <param name="passwordHash"></param>
        /// <param name="isAccountVerified"></param>
        /// <param name="isConfirmed"></param>
        /// <param name="isInactive"></param>
        /// <param name="roleValue"></param>
        /// <param name="firstName"></param>
        /// <param name="lastName"></param>
        /// <param name="isSystemAdmin"></param>
        /// <returns></returns>
        private async Task InitUserCollection(string email, string passwordHash, bool isAccountVerified,
                                              bool isConfirmed, bool isInactive, RoleValue roleValue, string firstName, string lastName,
                                              bool isSystemAdmin)
        {
            var roleValueString = roleValue.ToString();

            var userCollection = _mongoContext.Database.GetCollection <User>(nameof(User));
            var isDuplicate    = await MongoHelper <User> .IsDuplicate(Constants.Email, email, userCollection, null);

            if (!isDuplicate)
            {
                // Get role by name.
                var roleCollection = _mongoContext.Database.GetCollection <Role>(nameof(Role));
                var bsonFilter     = Builders <Role> .Filter.Eq(nameof(Role.Name), roleValueString);

                var role = await roleCollection.Find(bsonFilter, _findOptions).SingleOrDefaultAsync();

                var user = new User
                {
                    FirstName         = firstName,
                    LastName          = lastName,
                    Email             = email,
                    PasswordHash      = passwordHash,
                    IsAccountVerified = isAccountVerified,
                    IsConfirmed       = isConfirmed,
                    IsInactive        = isInactive,
                    IsSystemAdmin     = isSystemAdmin,
                    RoleId            = role.ObjectId,
                    PasswordResetKey  = null
                };

                await userCollection.InsertOneAsync(user);

                Log.Info($"Inserted user with email {email} with Id {user.ObjectId} into database.");
            }
        }
 /// <summary>
 /// 当たったときの演出シーケンスを取得する
 /// </summary>
 /// <param name="target"></param>
 /// <returns></returns>
 public IReelSequence CreateWinningProductionSequence(RoleValue target)
 {
     return(tweenProvider[target].GetWinningProductionSequence().AsReelSequence(target));
 }
 /// <summary>
 /// 停止状態からリールを回転させ、指定の位置で停止するシーケンスを取得する
 /// </summary>
 /// <param name="stopRole">正面に停止させる役柄</param>
 /// <param name="laps">等速回転時の回転数</param>
 /// <param name="maxrps">最大回転速度(rps)</param>
 /// <param name="accelDutation">加速時間(s)</param>
 /// <param name="deceleDuration">減速時間(s)</param>
 /// <returns>各Roleに対するシーケンス</returns>
 public IReelSequence CreateFirstRollSequence(RoleValue stopRole, NormalRollProductionProperty prop) =>
 tweenProvider.DictionarySelect(provider => DOTween.Sequence()
                                .Append(provider.AccelerationRotate(prop.AccelDuration, prop.MaxRps))
                                .Append(provider.LinearRotate(prop.Laps, prop.MaxRps))
                                .Append(provider.DecelerateAndStopAbsAngle(frontRoleAngleTable.GetAngleTable(stopRole)[provider.RoleValue], prop.DeceleDuration, prop.MaxRps)))
 .ToReelSequence();
Beispiel #12
0
 public Role(string roleName, RoleValue roleValue) : base(roleName)
 {
     RoleValue = roleValue;
 }
        /// <summary>
        /// Gets all the apps that belongs to an organization and role
        /// </summary>
        /// <param name="organization">the organization to be checked</param>
        /// <param name="roleValue">the role value to be checked</param>
        /// <returns>All the apps that have that org and role in his permisions</returns>
        public IEnumerable <Apps> GetAppsByOrganizarionRole(Organization organization, RoleValue roleValue)
        {
            var allApps      = _repository.GetAll();
            var filteredApps = new List <Apps>();

            foreach (var app in allApps)
            {
                var currentAppPermisions = new List <RoleAppPermission>(app.RoleAppPermission);
                if (currentAppPermisions.Exists(rap => rap.OrganizationRole.OrganizationId == organization.Id && rap.OrganizationRole.Rvid == roleValue.Id))
                {
                    filteredApps.Add(app);
                }
            }
            return(filteredApps);
        }
 public Sequence this[RoleValue index]
 {
     get => m_sequenceTable[index];
        /// <summary>
        /// RoleTweenProviderを使って、特定のRoleに任意のReelSequenceを生成します。
        /// </summary>
        /// <param name="sequenceSelector"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public IReelSequence CreateFromProvider(Func <RoleTweenProvider, Sequence> sequenceSelector, RoleValue target)
        {
            var sq = ReelSequence.Empty();

            sq[target] = sequenceSelector(tweenProvider[target]);
            return(sq);
        }
Beispiel #16
0
        public UniTask DriveBy(Production production)
        {
            //各リールの制御タスクを格納するListを用意
            List <UniTask> reelDriveTasks = new List <UniTask>();

            //左右真ん中3つのリールに対して、同様の処理を行う
            foreach (var(reelPos, provider) in sequenceProviderTable)
            {
                //通常の回転シーケンスを取得
                var sq = provider.CreateFirstRollSequence(production[reelPos].FirstRole,
                                                          production.NormalProperty)
                         //Play時にステータスを更新
                         .OnPlay(() => productionStatus.Value = SlotProductionStatus.Rolling);

                //リールの演出がリーチの場合はリーチシーケンスを追加
                if (production[reelPos].IsReachProduction)
                {
                    //リーチ開始時(通常の回転シーケンス完了時)にステータスを更新
                    sq.OnComplete(() => productionStatus.Value = SlotProductionStatus.Reaching);

                    //リールの演出を取得
                    ReelProduction reelProduction = production[reelPos];
                    //拮抗演出の守備側と攻撃側を取得
                    //defenser:現在の位置を死守しようとする役, offenser:位置を獲得しようとする役
                    RoleValue defenser = production.IsWinProduction ? reelProduction.FinallyRole.Previous :
                                         reelProduction.FinallyRole;
                    RoleValue offenser = production.IsWinProduction ? reelProduction.FinallyRole :
                                         reelProduction.FinallyRole.Next;
                    //拮抗直前まで高速回転させるシーケンスを追加
                    sq.Append(provider.CreateReachReRollSequence(startRole: reelProduction.FirstRole,
                                                                 endValue: defenser,
                                                                 prop: production.ReachProperty));
                    //ランダムに拮抗演出を取得する
                    AntagonistType antagonistType = UnityUtility.Enum.Random <AntagonistType>();

                    //拮抗演出シーケンスを追加
                    sq.Append(provider.CreateAntagonistSequence(antagonistType, new AntagonistSequenceProperty()
                    {
                        Defenser      = defenser,
                        Offenser      = offenser,
                        IsOffenserWin = production.IsWinProduction
                    }));
                }

                //リールの制御を開始して、そのタスクを保持する
                reelDriveTasks.Add(sq.PlayAsync());
            }

            //各リールの制御がすべて完了したら、当たり演出を追加する
            //当たり演出が完了するまでのタスクを返す
            return(UniTask.WhenAll(reelDriveTasks).ContinueWith(() =>
            {
                //当たりじゃなければここで終了
                if (!production.IsWinProduction)
                {
                    productionStatus.Value = SlotProductionStatus.Idol;
                    return UniTask.CompletedTask;
                }
                //当たりなら当たり演出を追加
                else
                {
                    //各リールに対して当たり演出シーケンスを追加
                    return sequenceProviderTable
                    .Select(kvp => (reelpos: kvp.Key, provider: kvp.Value))
                    .Select(pair => pair.provider
                            //当たり演出シーケンスを取得
                            .CreateWinningProductionSequence(production.FinallyRoleset[pair.reelpos])
                            //再生開始したらステータスを「当たり演出中」に変更
                            .OnPlay(() => productionStatus.Value = SlotProductionStatus.Winning)
                            //シーケンスが完了したらステータスを「アイドル」に変更
                            .OnComplete(() => productionStatus.Value = SlotProductionStatus.Idol)
                            //再生してタスクに変換
                            .PlayAsync())
                    //各リールのタスクをまとめて返す
                    .WhenAll();
                }
            }));
        }
 /// <summary>
 /// いずれかの役を正面に持ってきたときの、各役の配置角度テーブルを取得する
 /// </summary>
 /// <param name="frontAngle">正面に持ってくる役</param>
 /// <returns></returns>
 public IReadOnlyDictionary <RoleValue, Angle> GetAngleTable(RoleValue frontRole) => frontRoleAngleTable[frontRole];
 public Role(string name, RoleValue roleValue) : base(name)
 {
     RoleValue = roleValue;
 }
Beispiel #19
0
 public int SaveRole(RoleValue role)
 {
     throw new NotImplementedException();
 }
Beispiel #20
0
 public Scenario GenerateScenario()
 {
     return(Scenario.DirectWin(RoleValue.FromRandom()));
 }