/// <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()); }
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))); }
/// <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); }
/// <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; }
/// <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."); } }
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("リーチの位置を決定できませんでした"); } }
/// <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();
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); }
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; }
public int SaveRole(RoleValue role) { throw new NotImplementedException(); }
public Scenario GenerateScenario() { return(Scenario.DirectWin(RoleValue.FromRandom())); }