Beispiel #1
0
        public void SkillView(int uniqId)
        {
            _skillParent.SetActive(true);
            var canvasGroup = _skillParent.GetComponent <CanvasGroup>();

            DOTween.To(() => canvasGroup.alpha, (x) => canvasGroup.alpha = x, 1, 0.2f).Play();
            var battler  = BattlerDictionary.GetBattlerByUniqId(uniqId);
            var eqSkills = battler.skills;

            foreach (var(x, i) in _icons.Select((x, i) => (x, i)))
            {
                var image = x.Find("Image").GetComponent <Image>();
                if (i < eqSkills.Count)
                {
                    var skill = SkillsDicionary.GetSkillById(eqSkills[i]);

                    Sprite sprite = Resources.Load <Sprite>(skill.iconSpritePath);
                    //Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(skill.iconSpritePath);
                    image.sprite  = sprite;
                    image.enabled = true;
                }
                else
                {
                    image.sprite  = null;
                    image.enabled = false;
                }
            }
        }
Beispiel #2
0
        private void DamagePopup(Transform target, SkillDamage damage, int uniqId)
        {
            if (damage.isResist == false)
            {
                switch (damage.valueTarget)
                {
                    case SkillValueTarget.SLEEP:
                        SleepPopup(uniqId);
                        break;
                    default:
                        string color = SkillsDicionary.SkillColor(damage.valueTarget);
                        string damageText = $"<color={color}>{damage.damage}";
                        GameObject text =
                            Instantiate(Resources.Load("Prefabs/Text/DamageText", typeof(GameObject)) as GameObject);
                        var pos = target.GetComponent<Transform>().localPosition;
                        pos = PopupPos(pos);

                        text.GetComponent<Transform>().localPosition = pos;
                        var tMesh = text.GetComponent<TextMeshPro>();
                        tMesh.rectTransform.localScale = new Vector3(1.4f, 1.4f);
                        tMesh.rectTransform.pivot = new Vector2(0, 0);
                        tMesh.color = new Color(tMesh.color.r, tMesh.color.g, tMesh.color.b, 0);
                        tMesh.text = damageText;
                        TextPopUpFadeInOut(tMesh, text);
                        break;
                }
            }
            else
            {
                ResistPopup(target);
            }
        }
Beispiel #3
0
        /// <summary>
        /// 回避判定
        /// 味方に対するスキル、もしくは必中でない限り回避チェックを行う
        /// 物理属性が含まれる場合は命中率-回避率
        /// 魔法属性のみの場合は100%-魔法回避率
        /// </summary>
        /// <param name="skill"></param>
        /// <param name="fromBattler"></param>
        /// <param name="toBattler"></param>
        /// <returns></returns>
        private static bool HitCheck(string skillId, BattlerSerializable fromBattler,
                                     BattlerSerializable toBattler)
        {
            var skill = SkillsDicionary.GetSkillById(skillId);

            if (skill.target == SkillConsts.MEMBER || skill.target == SkillConsts.ALL_MEMBER ||
                skill.target == SkillConsts.RANDOM_MEMBER)
            {
                return(true);
            }

            float hitRate = fromBattler.parameter.hit;

            hitRate = hitRate * (skill.effect.hitRate / 100);
            if (skill.effect.elements.Contains(SkillConsts.ELEMENTS_PHYSICS))
            {
                hitRate -= toBattler.parameter.dodge;
            }
            else if (skill.effect.elements.Contains(SkillConsts.ELEMENTS_MAGIC))
            {
                hitRate -= toBattler.parameter.magicDodge;
            }

            if (Random.Range(0, 100) < hitRate)
            {
                return(true);
            }

            return(false);
        }
Beispiel #4
0
        public static AsyncSubject <Unit> SkillByAi(AiSelectSkillResultSerializableData ai, BattlerSerializable fromBattler)
        {
            AsyncSubject <Unit> subject = new AsyncSubject <Unit>();

            if (ai == null)
            {
                ObservableUtils.AsyncSubjectTimeZeroCompleted(subject);
            }
            else
            {
                var skill = SkillsDicionary.GetSkillById(ai.SkillId);
                if (SkillsDicionary.IsAll(skill))
                {
                    List <BattlerSerializable> toBattlers = new List <BattlerSerializable>();
                    ai.TargetUniqIds.ForEach(x => { toBattlers.Add(BattlerDictionary.GetBattlerByUniqId(x)); });
                    SkillToAll(ai.SkillId, fromBattler, toBattlers).Subscribe(_ =>
                    {
                        subject.OnNext(Unit.Default);
                        subject.OnCompleted();
                    });
                }
                else
                {
                    var uniqId          = ai.TargetUniqIds.First();
                    var toBattler       = BattlerDictionary.GetBattlerByUniqId(uniqId);
                    var targetTransform = BattleDictionary.GetTransformByUniqId(uniqId);
                    SkillToSingle(ai.SkillId, fromBattler, toBattler).Subscribe(_ =>
                    {
                        subject.OnNext(Unit.Default);
                        subject.OnCompleted();
                    });
                }
            }
            return(subject);
        }
Beispiel #5
0
        /// <summary>
        /// ランダムの対象にスキル発動
        /// </summary>
        /// <param name="skillId"></param>
        /// <param name="fromBattler"></param>
        /// <param name="uniqIds"></param>
        /// <returns></returns>
        public static AsyncSubject <Unit> SkillToRandom(string skillId, BattlerSerializable fromBattler,
                                                        List <int> uniqIds)
        {
            AsyncSubject <Unit> subject   = new AsyncSubject <Unit>();
            List <SkillDamages> damageses = new List <SkillDamages>();

            var skill = SkillsDicionary.GetSkillById(skillId);

            var strikeSize = 1;

            if (skill.strikeSize.min != 0 && skill.strikeSize.max != 0)
            {
                strikeSize = Random.Range(skill.strikeSize.min, skill.strikeSize.max);
            }
            List <BattlerSerializable> toBattlers = new List <BattlerSerializable>();

            uniqIds.ForEach(uniqId =>
            {
                toBattlers.Add(BattlerDictionary.GetBattlerByUniqId(uniqId));
            });
            for (int i = 0; i < strikeSize; i++)
            {
                var toBattler = BattleDictionary.GetAliveBattlerByRandom(toBattlers);
                if (toBattler == null)
                {
                    break;
                }
                var isHit = HitCheck(skillId, fromBattler, toBattler);
                List <SkillDamage> damages = new List <SkillDamage>();
                if (isHit)
                {
                    damages = SkillToBattler(skillId, fromBattler, toBattler);
                }

                var isDead = DeadCheck(toBattler);
                damageses.Add(new SkillDamages
                {
                    SkillDamage  = damages,
                    targetUniqId = toBattler.uniqId,
                    isHit        = isHit,
                    isDead       = isDead
                });
            }
            //ダメージテキストの表示
            AnnounceTextView.Instance.AddDamageText(fromBattler, skill.name, damageses);

            EffectManager.Instance.SkillToTarget(skillId, damageses).Subscribe(_ =>
            {
                subject.OnNext(Unit.Default);
                subject.OnCompleted();
            });
            return(subject);
        }
Beispiel #6
0
        private void SkillToSubscribe()
        {
            _container.Add(_battlerSpriteModel.SelectedSubject.Subscribe(_ =>
            {
                var skill   = SkillsDicionary.GetSkillById(_skillModel.SkillId);
                var battler = BattlerDictionary.GetBattlerByUniqId(_battleModel.ActiveUniqId);
                switch (skill.target)
                {
                case SkillConsts.ENEMY:
                case SkillConsts.MEMBER:
                    var uniqId    = _battlerSpriteModel.SelectUniqId;
                    var toBattler = BattlerDictionary.GetBattlerByUniqId(uniqId);
                    BattleLogic.SkillToSingle(skill.skillId, battler, toBattler)
                    .Subscribe(
                        __ => { _battleModel.NextTurn.OnNext(Unit.Default); });
                    break;

                case SkillConsts.ALL_ENEMY:
                    BattleLogic.SkillToAll(skill.skillId, battler,
                                           BattleDictionary.GetRivalBattlers(battler.battlerType)).Subscribe(__ =>
                    {
                        _battleModel.NextTurn.OnNext(Unit.Default);
                    });
                    break;

                case SkillConsts.ALL_MEMBER:
                    BattleLogic.SkillToAll(skill.skillId, battler,
                                           BattleDictionary.GetMemberBattlers(battler.battlerType)).Subscribe(__ =>
                    {
                        _battleModel.NextTurn.OnNext(Unit.Default);
                    });
                    break;

                case SkillConsts.RANDOM_ENEMY:
                    BattleLogic.SkillToRandom(skill.skillId, battler,
                                              BattleDictionary.GetRivalUniqIds(BattlerEnum.BattlerType.Actor)).Subscribe(
                        __ =>
                    {
                        _battleModel.NextTurn.OnNext(Unit.Default);
                    });
                    break;

                case SkillConsts.RANDOM_MEMBER:
                    BattleLogic.SkillToRandom(skill.skillId, battler,
                                              BattleDictionary.GetMemberUniqIds(BattlerEnum.BattlerType.Actor)).Subscribe(
                        __ =>
                    {
                        _battleModel.NextTurn.OnNext(Unit.Default);
                    });
                    break;
                }
            }));
        }
Beispiel #7
0
        /// <summary>
        /// スキル説明テキストの作成
        /// </summary>
        /// <param name="skillId"></param>
        /// <param name="battler"></param>
        /// <returns></returns>
        public static string CreateSkillDescription(string skillId, BattlerSerializable battler)
        {
            var           skill = SkillsDicionary.GetSkillById(skillId);
            StringBuilder sb    = new StringBuilder();
            string        name  = skill.name;

            sb.Append("<b><size=18>");
            sb.Append(name);
            sb.Append("</size></b>");
            sb.Append("\n--------------------\n");
            sb.Append(skill.description);
            sb.Append("\n--------------------\n");
            sb.Append(SkillsDicionary.SkillTargetText(skill.target));
            if (skill.strikeSize.min == 0 && skill.strikeSize.max == 0)
            {
                //敵単体(敵全体)に
                sb.Append("に\n");
            }
            else
            {
                //敵単体をx回から
                sb.Append("を");
                if (skill.strikeSize.min == skill.strikeSize.max)
                {
                    sb.Append(skill.strikeSize.min).Append("回\n");
                }
                else
                {
                    sb.Append(skill.strikeSize.min).Append("回から").Append(skill.strikeSize.max).Append("回\n");
                }
            }
            skill.effect.value.ForEach(item =>
            {
                item.rates.ForEach(rate =>
                {
                    StringBuilder msb = new StringBuilder();
                    msb.Append(SkillsDicionary.SkillDependenceText(rate.dependence)).Append("(").Append(rate.rate * 100)
                    .Append("%)\n").Append(SkillsDicionary.SkillDamageDescriptionTargetText(item.valueTarget)).Append("\n");
                    sb.Append(msb);
                });
            });
            //属性
            sb.Append("\n--------------------\n");
            skill.effect.elements.ForEach(x =>
            {
                sb.Append(SkillsDicionary.SkillElementsText(x)).Append("\n");
            });
            return(sb.ToString());
        }
Beispiel #8
0
        public void PoisonText(BattlerSerializable battler, int value, bool isDead)
        {
            StringBuilder sb         = new StringBuilder();
            var           nameColor  = GuiDictionary.GetBattlerNameColor(battler.battlerType);
            var           skillColor = SkillsDicionary.SkillColor(SkillValueTarget.TARGET_POISON);
            var           texts      = new List <string>();

            sb.Append($"<color={nameColor}>{battler.name}は</color><color={skillColor}>{value}</color>の毒ダメージを受けた");
            texts.Add(sb.ToString());
            if (isDead)
            {
                texts.Add(DeadText(battler));
            }
            AddText(texts);
        }
Beispiel #9
0
        /// <summary>
        /// 単体の対象に向けてスキルを使う
        /// </summary>
        /// <param name="skillId"></param>
        /// <param name="fromBattler"></param>
        /// <param name="toBattler"></param>
        /// <returns></returns>
        public static List <SkillDamage> SkillToBattler(string skillId, BattlerSerializable fromBattler,
                                                        BattlerSerializable toBattler)
        {
            List <SkillDamage> skillDamages = new List <SkillDamage>();
            var skill = SkillsDicionary.GetSkillById(skillId);

            foreach (var(x, i) in skill.effect.value.Select((x, i) => (x, i)))
            {
                var skillDamage = new SkillDamage();
                var damage      = SkillLogic.GetTotalDamageByTarget(x, fromBattler);
                skillDamage.damage      = damage;
                skillDamage.valueTarget = x.valueTarget;
                skillDamage.turn        = x.turn;
                skillDamages.Add(skillDamage);
                skillDamage.damage = CalcDamage(skillDamage, toBattler);
            }

            return(skillDamages);
        }
Beispiel #10
0
 /// <summary>
 /// スキル選択時
 /// </summary>
 private void SkillSelectSubscribe()
 {
     foreach (var(icon, index) in _skillsView.Icons.Select((icon, index) => (icon, index)))
     {
         var image = icon.Find("Image").GetComponent <Image>();
         //マウスホバー時
         _container.Add(image.OnMouseEnterAsObservable().Subscribe(_ =>
         {
             var battler = BattlerDictionary.GetBattlerByUniqId(_battleModel.ActiveUniqId);
             var skill   = SkillsDicionary.GetEquippedSkillByIndex(battler, index);
             if (skill != null)
             {
                 _skillModel.HoverIndex = index;
                 _skillsView.Refresh(_skillModel);
                 _skillsView.ViewSkillDescription(skill.skillId, _battleModel.ActiveUniqId);
             }
         }));
         //マウスホバーアウト時
         _container.Add(image.OnMouseExitAsObservable().Subscribe(_ =>
         {
             _skillModel.HoverIndex = -1;
             _skillsView.Refresh(_skillModel);
             //_skillsView.CleanSkillDescription();
         }));
         //クリック
         _container.Add(image.OnMouseUpAsButtonAsObservable().Subscribe(_ =>
         {
             var battler = BattlerDictionary.GetBattlerByUniqId(_battleModel.ActiveUniqId);
             var skill   = SkillsDicionary.GetEquippedSkillByIndex(battler, index);
             if (skill != null)
             {
                 _skillModel.SkillId     = skill.skillId;
                 _skillModel.ActiveIndex = index;
                 BattlerSpriteModel.SkillSelectSubject.OnNext(Unit.Default);
                 if (SkillsDicionary.IsAll(skill) || SkillsDicionary.IsRandom(skill))
                 {
                     BattlerSpriteModel.AllSelectSubject.OnNext(Unit.Default);
                 }
             }
         }));
     }
     ;
 }
Beispiel #11
0
        public AiSelectSkillResultSerializableData SelectSkill(int uniqId)
        {
            BattlerSerializable battler = BattlerDictionary.GetBattlerByUniqId(uniqId);
            //スキルを無造作に選ぶ、アタックの重みは少ない
            var choice = new WeightChoice <string>();

            foreach (var x in battler.skills)
            {
                var _skill = SkillsDicionary.GetSkillById(x);
                if (_skill.skillId == SkillIds.ATTACK)
                {
                    choice.Add(SkillWeights.VERY_LOW, x);
                }
                else if (battler.parameter.mp >= _skill.mp)
                {
                    choice.Add(SkillWeights.NORMAL, x);
                }
            }

            AiSelectSkillResultSerializableData result = new AiSelectSkillResultSerializableData();
            var skill = SkillsDicionary.GetSkillById(choice.ChoiceOne());

            if (battler.parameter.mp >= skill.mp)
            {
                switch (skill.target)
                {
                case SkillConsts.ENEMY:
                case SkillConsts.MEMBER:
                    result.TargetUniqIds.Add(
                        AiLogic.ChoiceBattlerByHostile(BattleDictionary.GetAliveRivalBattlers(battler.battlerType)));
                    break;

                case SkillConsts.ALL_ENEMY:
                case SkillConsts.ALL_MEMBER:
                    result.TargetUniqIds = BattleDictionary.GetRivalUniqIds(battler.battlerType);
                    break;
                }
                result.SkillId = skill.skillId;
            }

            return(result);
        }
Beispiel #12
0
        public AsyncSubject <Unit> SkillToTarget(string skillId, List <SkillDamages> damageses)
        {
            AsyncSubject <Unit> subject = new AsyncSubject <Unit>();
            var skill  = SkillsDicionary.GetSkillById(skillId);
            var effect = Instantiate((GameObject)Resources.Load("Prefabs/Skills/" + skill.effectAnimationId));

            effect.GetComponent <SkillBehavior>().Play(damageses);
            //演出が終わったタイミングではなく
            effect.GetComponent <ParticleSystem>().OnDestroyAsObservable().Subscribe(_ =>
            {
                //subject.OnNext(Unit.Default);
                //subject.OnCompleted();
            });
            Observable.Timer(TimeSpan.FromMilliseconds(400)).Subscribe(_ =>
            {
                subject.OnNext(Unit.Default);
                subject.OnCompleted();
            });
            return(subject);
        }
Beispiel #13
0
        /// <summary>
        /// 全体にスキル発動
        /// </summary>
        /// <param name="skillId"></param>
        /// <param name="fromBattler"></param>
        /// <param name="toBattlers"></param>
        /// <returns></returns>
        public static AsyncSubject <Unit> SkillToAll(string skillId, BattlerSerializable fromBattler,
                                                     List <BattlerSerializable> toBattlers)
        {
            AsyncSubject <Unit> subject   = new AsyncSubject <Unit>();
            List <SkillDamages> damageses = new List <SkillDamages>();
            var skill = SkillsDicionary.GetSkillById(skillId);
            List <Transform> targetTransforms = new List <Transform>();

            toBattlers.ForEach(battler =>
            {
                var targetTransform        = BattleDictionary.GetTransformByUniqId(battler.uniqId);
                var isHit                  = HitCheck(skillId, fromBattler, battler);
                List <SkillDamage> damages = new List <SkillDamage>();
                if (isHit)
                {
                    damages = SkillToBattler(skillId, fromBattler, battler);
                }

                var isDead = DeadCheck(battler);
                damageses.Add(new SkillDamages()
                {
                    SkillDamage  = damages,
                    targetUniqId = battler.uniqId,
                    isHit        = isHit,
                    isDead       = isDead
                });
                targetTransforms.Add(targetTransform);
            });
            //ダメージテキストの表示
            AnnounceTextView.Instance.AddDamageText(fromBattler, skill.name, damageses);

            EffectManager.Instance.SkillToAll(skillId, damageses).Subscribe(_ =>
            {
                subject.OnNext(Unit.Default);
                subject.OnCompleted();
            });
            return(subject);
        }
Beispiel #14
0
        public void AddDamageText(BattlerSerializable fromBattler, string skillName, List <SkillDamages> damageses)
        {
            List <string> texts = new List <string>();
            StringBuilder sb    = new StringBuilder();

            var fromColor = GuiDictionary.GetBattlerNameColor(fromBattler.battlerType);

            sb.Append($"<color={fromColor}>").Append(fromBattler.name).Append("</color>の").Append(skillName)
            .Append("!");
            texts.Add(sb.ToString());
            List <BattlerSerializable> deadBattlers = new List <BattlerSerializable>();

            damageses.ForEach(x =>
            {
                sb.Clear();
                var toBattler =
                    BattlerDictionary.GetBattlerByUniqId(x.targetUniqId);
                var toColor = GuiDictionary.GetBattlerNameColor(toBattler.battlerType);
                if (x.isHit)
                {
                    x.SkillDamage.ForEach(damage =>
                    {
                        var targetText = SkillsDicionary.SkillAnnounceValueTargetText(damage.valueTarget);
                        if (SkillsDicionary.IsDamageSkill(damage.valueTarget))
                        {
                            sb.Clear();
                            var damageColor = SkillsDicionary.SkillColor(damage.valueTarget);
                            sb.Append($"<color={toColor}>").Append(toBattler.name).Append("</color>に")
                            .Append($"<color={damageColor}>").Append(damage.damage)
                            .Append($"</color>の{targetText}");
                            texts.Add(sb.ToString());
                        }
                        else
                        {
                            sb.Clear();
                            if (damage.damage != 0)
                            {
                                sb.Append($"<color={toColor}>").Append(toBattler.name).Append("</color>は")
                                .Append($"{targetText}");
                                texts.Add(sb.ToString());
                            }
                            else
                            {
                                var missText = SkillsDicionary.SkillAnnounceStateMissText(damage.valueTarget);
                                sb.Append($"<color={toColor}>").Append(toBattler.name).Append("</color>は")
                                .Append($"{missText}");
                                texts.Add(sb.ToString());
                            }
                        }
                    });
                }
                else
                {
                    sb.Append($"<color={toColor}>").Append(toBattler.name).Append("</color>は回避した!");
                    texts.Add(sb.ToString());
                }

                if (x.isDead && deadBattlers.Find(battler => battler == toBattler) == null)
                {
                    deadBattlers.Add(toBattler);
                }
            });
            deadBattlers.ForEach(battler => { texts.Add(DeadText(battler)); });
            AddText(texts);
        }
Beispiel #15
0
        /// <summary>
        /// バトラー選択時
        /// </summary>
        private void BattlerSelectSubscribe()
        {
            _container.Add(BattlerSpriteModel.SkillSelectSubject.Subscribe(_ =>
            {
                _battlerSpriteView.DeActiveOutline();
            }));
            //全体選択時
            _container.Add(BattlerSpriteModel.AllSelectSubject.Subscribe(_ =>
            {
                var skill = SkillsDicionary.GetSkillById(_skillModel.SkillId);
                BattlerSpriteView.Sprites.ForEach(sprite =>
                {
                    var battler = BattlerDictionary.GetBattlerByUniqId(sprite.UniqId);
                    if ((skill.target == SkillConsts.ALL_ENEMY || skill.target == SkillConsts.RANDOM_ENEMY) && battler.battlerType == BattlerEnum.BattlerType.Enemy ||
                        (skill.target == SkillConsts.ALL_MEMBER || skill.target == SkillConsts.RANDOM_MEMBER) && battler.battlerType == BattlerEnum.BattlerType.Actor)
                    {
                        _battlerSpriteView.SelectOutline(sprite);
                    }
                });
            }));
            BattlerSpriteView.Sprites.ForEach(sprite =>
            {
                //ホバー時
                _container.Add(sprite.SpriteObject.OnMouseOverAsObservable().Subscribe(_ =>
                {
                    if (_skillModel.ActiveIndex != -1 && _battlerSpriteModel.HoverUniqId != sprite.UniqId)
                    {
                        var skill = SkillsDicionary.GetSkillById(_skillModel.SkillId);
                        if (SkillsDicionary.IsSingle(skill))
                        {
                            _battlerSpriteModel.HoverUniqId = sprite.UniqId;
                            var targetBattler = BattlerDictionary.GetBattlerByUniqId(sprite.UniqId);
                            _battlerSpriteView.DeSelectOutlineByBattlerType(targetBattler.battlerType);
                            if (BattleDictionary.IsAppropriate(skill.skillId, _battleModel.ActiveUniqId, sprite.UniqId))
                            {
                                _battlerSpriteView.SelectOutline(sprite);
                            }
                        }
                    }
                }));
                //ターゲット選択時の処理、選択したスキルが発動する
                _container.Add(sprite.SpriteObject.OnMouseUpAsButtonAsObservable().Subscribe(_ =>
                {
                    if (_skillModel.ActiveIndex != -1)
                    {
                        _skillsView.SkillHide();
                        var skill = SkillsDicionary.GetSkillById(_skillModel.SkillId);
                        if (BattleDictionary.IsAppropriate(skill.skillId, _battleModel.ActiveUniqId, sprite.UniqId))
                        {
                            _skillModel.ActiveIndex = -1;

                            switch (skill.target)
                            {
                            case SkillConsts.MEMBER:
                            case SkillConsts.ENEMY:
                                _battlerSpriteView.DeSelectOutline(sprite);
                                _battlerSpriteModel.SelectUniqId = sprite.UniqId;
                                break;

                            case SkillConsts.ALL:
                            case SkillConsts.ALL_ENEMY:
                            case SkillConsts.ALL_MEMBER:
                            case SkillConsts.RANDOM_ENEMY:
                            case SkillConsts.RANDOM_MEMBER:
                                BattlerSpriteView.Sprites.ForEach(x =>
                                {
                                    _battlerSpriteView.DeSelectOutline(x);
                                });
                                break;
                            }

                            _battlerSpriteModel.SelectedSubject.OnNext(Unit.Default);
                        }
                    }
                }));
            });
        }