Esempio n. 1
0
        /// <summary>
        /// 是否在攻击范围内
        /// </summary>
        public bool IsInSkillDistance(Vector2Int coordinate, Vector2Int targetCoordinate, MCharacter distanceCharacter, MSkill targetSkill)
        {
            //MSkill targetSkill = distanceCharacter.CurrentSkill;
            App.Model.Master.MSkill targetSkillMaster = targetSkill.master;
            int distance = Global.mapSearch.GetDistance(coordinate, targetCoordinate);

            if (distance >= targetSkillMaster.distance[0] && distance <= targetSkillMaster.distance[1])
            {
                return(true);
            }
            //技能攻击扩展范围
            List <int[]> distances = distanceCharacter.skillDistances;

            if (distances.Count == 0)
            {
                return(false);
            }
            foreach (int[] child in distances)
            {
                if (distance >= child[0] && distance <= child[1])
                {
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 2
0
        /// <summary>
        /// 恢复量=
        /// </summary>
        /// <param name="attackCharacter">Attack character.</param>
        /// <param name="targetCharacter">Target character.</param>
        public int Heal(MCharacter attackCharacter, MCharacter targetCharacter, VTile tile = null, VTile targetTile = null)
        {
            MSkill skill = attackCharacter.CurrentSkill;

            App.Model.Master.MSkill skillMaster = skill.Master;
            return(1 + attackCharacter.Level + attackCharacter.Ability.MagicAttack * skillMaster.strength);
        }
Esempio n. 3
0
        /// <summary>
        /// 是否在攻击范围内
        /// </summary>
        public bool IsInSkillDistance(int CoordinateX, int CoordinateY, int targetX, int targetY, MCharacter distanceCharacter, MSkill targetSkill)
        {
            //MSkill targetSkill = distanceCharacter.CurrentSkill;
            App.Model.Master.MSkill targetSkillMaster = targetSkill.Master;
            int distance = cBattlefield.mapSearch.GetDistance(CoordinateX, CoordinateY, targetX, targetY);

            if (distance >= targetSkillMaster.distance[0] && distance <= targetSkillMaster.distance[1])
            {
                return(true);
            }
            //技能攻击扩展范围
            List <int[]> distances = distanceCharacter.SkillDistances;

            if (distances.Count == 0)
            {
                return(false);
            }
            foreach (int[] child in distances)
            {
                if (distance >= child[0] && distance <= child[1])
                {
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 4
0
 public IEnumerator OnBoutStart()
 {
     while (true)
     {
         MCharacter mCharacter = System.Array.Find(mBaseMap.Characters, c => c.Belong == this.currentBelong && c.Hp > 0 && !c.IsHide && !c.boutEventComplete);
         if (mCharacter == null)
         {
             break;
         }
         App.Model.Master.MSkill skill = mCharacter.BoutFixedDamageSkill;
         if (skill != null)
         {
             List <VCharacter> characters = vBaseMap.Characters.FindAll(c => c.ViewModel.Hp.Value > 0 && !c.ViewModel.IsHide.Value && !this.charactersManager.IsSameBelong(c.ViewModel.Belong.Value, currentBelong));
             yield return(OnBoutFixedDamage(mCharacter, skill, characters));
         }
         mCharacter.boutEventComplete = true;
     }
     if (currentBelong != Belong.self)
     {
         ai.Execute(currentBelong);
     }
     else
     {
         CloseOperatingMenu();
         if (scriptWaitPaths != null)
         {
             WaitScript(scriptWaitPaths);
         }
     }
 }
Esempio n. 5
0
 private void LevelChanged(int oldvalue, int newvalue)
 {
     App.Model.Master.MSkill skillMaster = App.Util.Cacher.SkillCacher.Instance.Get(ViewModel.SkillId.Value, ViewModel.Level.Value);
     skillLevel.text = string.Format("Lv.{0}", newvalue);
     money.text      = skillMaster.character_level > 0 ? skillMaster.price.ToString() : "MAX";
     levelUpButton.SetActive(skillMaster.character_level > 0);
     strength.text = string.Format("威力:{0}", skillMaster.strength);
 }
Esempio n. 6
0
 /// <summary>
 /// 开始动作
 /// </summary>
 /// <returns><c>true</c>, if start run was actioned, <c>false</c> otherwise.</returns>
 /// <param name="vCharacter">Current character.</param>
 private void ActionStartRun(VCharacterBase vCharacter)
 {
     Debug.LogError("ActionStartRun");
     System.Action actionStartEvent = () =>
     {
         //cBattlefield.MapMoveToPosition(currentCharacter.CoordinateX, currentCharacter.CoordinateY);
         //vCharacter.direction = (vCharacter.mCharacter.coordinate.x > vCharacter.mCharacter.target.coordinate.x ? Direction.left : Direction.right);
         vCharacter.direction = Global.mapSearch.GetDirection(vCharacter.mCharacter.coordinate, vCharacter.mCharacter.target.coordinate);
         vCharacter.action    = ActionType.attack;
         App.Model.Master.MSkill skillMaster = vCharacter.mCharacter.currentSkill.master;
         if (!string.IsNullOrEmpty(skillMaster.animation))
         {
             VTile vTile = Global.mapSearch.GetTile(vCharacter.mCharacter.target.coordinate);
             //this.cBattlefield.CreateEffect(skillMaster.animation, vTile.transform);
         }
     };
     if (vCharacter.mCharacter.currentSkill.master.effect.special == SkillEffectSpecial.back_thrust)
     {
         //回马枪
         VTile     currentTile = Global.mapSearch.GetTile(vCharacter.mCharacter.coordinate);
         VTile     targetTile  = Global.mapSearch.GetTile(vCharacter.mCharacter.target.coordinate);
         Direction direction   = Global.mapSearch.GetDirection(targetTile, currentTile);
         VTile     backTile    = Global.mapSearch.GetTile(currentTile, direction);
         if (Global.charactersManager.GetCharacter(backTile.coordinate) != null)
         {
             actionStartEvent();
             return;
         }
         Sequence   sequence   = new Sequence();
         TweenParms tweenParms = new TweenParms()
                                 .Prop("X", backTile.transform.localPosition.x, false)
                                 .Prop("Y", backTile.transform.localPosition.y, false)
                                 .Ease(EaseType.Linear);
         TweenParms tweenParmsTarget = new TweenParms()
                                       .Prop("X", currentTile.transform.localPosition.x, false)
                                       .Prop("Y", currentTile.transform.localPosition.y, false)
                                       .Ease(EaseType.Linear);
         Holoville.HOTween.Core.TweenDelegate.TweenCallback moveComplete = () =>
         {
             vCharacter.mCharacter.coordinate.y        = backTile.coordinate.y;
             vCharacter.mCharacter.coordinate.x        = backTile.coordinate.x;
             vCharacter.mCharacter.target.coordinate.y = currentTile.coordinate.y;
             vCharacter.mCharacter.target.coordinate.x = currentTile.coordinate.x;
             actionStartEvent();
         };
         tweenParms.OnComplete(moveComplete);
         VCharacterBase vTarget = Global.charactersManager.GetVCharacter(vCharacter.mCharacter.target);
         sequence.Insert(0f, HOTween.To(vCharacter, 0.5f, tweenParms));
         sequence.Insert(0f, HOTween.To(vTarget, 0.5f, tweenParmsTarget));
         sequence.Play();
     }
     else
     {
         actionStartEvent();
     }
 }
Esempio n. 7
0
        public void ShowSkillDetail(int skillId)
        {
            skillPreview.SetActive(true);
            App.Model.Master.MSkill skillMaster = App.Util.Cacher.SkillCacher.Instance.Get(skillId);
            RectTransform           trans       = skillPreview.GetComponent <RectTransform>();

            trans.position = new Vector3(trans.position.x, Input.mousePosition.y, 0f);
            skillPreview.SetActive(true);
            skillPreview.transform.Find("Name").GetComponent <Text>().text     = skillMaster.name;
            skillPreview.transform.Find("Detailed").GetComponent <Text>().text = skillMaster.explanation;
            this.StopAllCoroutines();
            this.StartCoroutine(WaitForHideSkillDetail());
        }
Esempio n. 8
0
 /// <summary>
 /// 开始动作
 /// </summary>
 /// <returns><c>true</c>, if start run was actioned, <c>false</c> otherwise.</returns>
 /// <param name="currentCharacter">Current character.</param>
 private void ActionStartRun(MCharacter currentCharacter)
 {
     System.Action actionStartEvent = () =>
     {
         cBattlefield.MapMoveToPosition(currentCharacter.CoordinateX, currentCharacter.CoordinateY);
         currentCharacter.Direction = (currentCharacter.X > currentCharacter.Target.X ? Direction.left : Direction.right);
         currentCharacter.Action    = ActionType.attack;
         App.Model.Master.MSkill skillMaster = currentCharacter.CurrentSkill.Master;
         if (!string.IsNullOrEmpty(skillMaster.animation))
         {
             VTile vTile = this.cBattlefield.mapSearch.GetTile(currentCharacter.Target.CoordinateX, currentCharacter.Target.CoordinateY);
             this.cBattlefield.CreateEffect(skillMaster.animation, vTile.transform);
         }
     };
     if (currentCharacter.CurrentSkill.Master.effect.special == App.Model.Master.SkillEffectSpecial.back_thrust)
     {
         //回马枪
         VTile     currentTile = cBattlefield.mapSearch.GetTile(currentCharacter.CoordinateX, currentCharacter.CoordinateY);
         VTile     targetTile  = cBattlefield.mapSearch.GetTile(currentCharacter.Target.CoordinateX, currentCharacter.Target.CoordinateY);
         Direction direction   = cBattlefield.mapSearch.GetDirection(targetTile, currentTile);
         VTile     backTile    = cBattlefield.mapSearch.GetTile(currentTile, direction);
         if (cBattlefield.charactersManager.GetCharacter(backTile.Index) != null)
         {
             actionStartEvent();
             return;
         }
         Sequence   sequence         = new Sequence();
         TweenParms tweenParms       = new TweenParms().Prop("X", backTile.transform.localPosition.x, false).Prop("Y", backTile.transform.localPosition.y, false).Ease(EaseType.Linear);
         TweenParms tweenParmsTarget = new TweenParms().Prop("X", currentTile.transform.localPosition.x, false).Prop("Y", currentTile.transform.localPosition.y, false).Ease(EaseType.Linear);
         Holoville.HOTween.Core.TweenDelegate.TweenCallback moveComplete = () =>
         {
             currentCharacter.CoordinateY        = backTile.CoordinateY;
             currentCharacter.CoordinateX        = backTile.CoordinateX;
             currentCharacter.Target.CoordinateY = currentTile.CoordinateY;
             currentCharacter.Target.CoordinateX = currentTile.CoordinateX;
             actionStartEvent();
         };
         tweenParms.OnComplete(moveComplete);
         sequence.Insert(0f, HOTween.To(currentCharacter, 0.5f, tweenParms));
         sequence.Insert(0f, HOTween.To(currentCharacter.Target, 0.5f, tweenParmsTarget));
         sequence.Play();
     }
     else
     {
         actionStartEvent();
     }
 }
Esempio n. 9
0
        /// <summary>
        /// 获取反击次数
        /// </summary>
        /// <param name="attackCharacter">Attack character.</param>
        /// <param name="targetCharacter">Target character.</param>
        public int CounterAttackCount(MCharacter attackCharacter, MCharacter targetCharacter)
        {
            int count = 1;

            if (targetCharacter.weaponType == WeaponType.dualWield)
            {
                //双手兵器或者相关的技能可双击
                count = 2;
            }
            //技能反击次数
            App.Model.Master.MSkill skillMaster = attackCharacter.currentSkill.master;
            if (skillMaster.effect.special == SkillEffectSpecial.counter_attack_count)
            {
                count = skillMaster.effect.special_value;
            }
            return(count);
        }
Esempio n. 10
0
        /// <summary>
        /// 获取主动次数
        /// </summary>
        /// <param name="attackCharacter">Attack character.</param>
        /// <param name="targetCharacter">Target character.</param>
        public int SkillCount(MCharacter currentCharacter, MCharacter targetCharacter)
        {
            int count = 1;

            if (currentCharacter.WeaponType == WeaponType.dualWield)
            {
                //双手兵器或者相关的技能可双击
                count = 2;
            }
            //技能攻击次数
            App.Model.Master.MSkill skillMaster = currentCharacter.CurrentSkill.Master;
            if (skillMaster.effect.special == App.Model.Master.SkillEffectSpecial.attack_count)
            {
                count = skillMaster.effect.special_value;
            }
            return(count);
        }
Esempio n. 11
0
        public override IEnumerator OnLoad(Request request)
        {
            yield return(StartCoroutine(base.OnLoad(request)));

            mCharacter = request.Get <MCharacter>("character");
            HidePreview();
            ScrollViewSets(content, childItem, System.Array.FindAll(mCharacter.Skills, (s) => {
                App.Model.Master.MSkill skillMaster = s.Master;
                Debug.LogError("CBattleSkillListDialog : " + skillMaster.id + ", " + skillMaster.name);
                bool isType = App.Model.Master.MSkill.IsSkillType(skillMaster, SkillType.attack) || App.Model.Master.MSkill.IsSkillType(skillMaster, SkillType.magic) || App.Model.Master.MSkill.IsSkillType(skillMaster, SkillType.heal);
                if (!isType)
                {
                    return(false);
                }
                bool isWeaponSkill = App.Model.Master.MSkill.IsWeaponType(skillMaster, mCharacter.WeaponType);
                return(isWeaponSkill);
            }));
        }
Esempio n. 12
0
        public float TileAid(App.View.VTile vTile)
        {
            int aid = 0;

            foreach (MSkill skill in this.Skills)
            {
                App.Model.Master.MSkill mSkill = skill.Master;
                if (!App.Model.Master.MSkill.IsSkillType(mSkill, SkillType.help) || mSkill.effect.special != App.Model.Master.SkillEffectSpecial.tile)
                {
                    continue;
                }
                if (mSkill.wild > 0 && System.Array.Exists(App.Util.Global.Constant.tile_wild, v => v == vTile.TileId))
                {
                    aid += mSkill.wild;
                }
                if (mSkill.swim > 0 && System.Array.Exists(App.Util.Global.Constant.tile_swim, v => v == vTile.TileId))
                {
                    aid += mSkill.swim;
                }
            }
            return(aid == 0 ? 1f : (100 + aid) * 0.01f);
        }
Esempio n. 13
0
 public IEnumerator OnBoutFixedDamage(MCharacter mCharacter, App.Model.Master.MSkill skill, List <VCharacter> characters)
 {
     App.View.VTile targetTile = this.mapSearch.GetTile(mCharacter.CoordinateX, mCharacter.CoordinateY);
     foreach (VCharacter child in characters)
     {
         App.View.VTile tile = this.mapSearch.GetTile(child.ViewModel.CoordinateX.Value, child.ViewModel.CoordinateY.Value);
         if (this.mapSearch.GetDistance(targetTile, tile) <= skill.radius)
         {
             int hert = skill.strength;
             if (child.ViewModel.Hp.Value - hert <= 0)
             {
                 hert = child.ViewModel.Hp.Value - 1;
             }
             App.Model.Battle.MDamageParam arg = new App.Model.Battle.MDamageParam(-hert);
             child.SendMessage(CharacterEvent.OnDamage.ToString(), arg);
         }
     }
     while (HasDynamicCharacter())
     {
         yield return(new UnityEngine.WaitForEndOfFrame());
     }
 }
Esempio n. 14
0
 public override void UpdateView()
 {
     content.SetActive(ViewModel.SkillId.Value > 0);
     emptyContent.SetActive(ViewModel.SkillId.Value == 0);
     if (ViewModel.SkillId.Value == 0)
     {
         background.color = wakeColor;
         return;
     }
     App.Model.Master.MSkill skillMaster = App.Util.Cacher.SkillCacher.Instance.Get(ViewModel.SkillId.Value);
     skillName.text = skillMaster.name;
     icon.sprite    = ImageAssetBundleManager.GetSkillIcon(ViewModel.SkillId.Value);
     levelupContent.SetActive(ViewModel.Id.Value > 0);
     unlockContent.SetActive(ViewModel.Id.Value == 0);
     if (ViewModel.Id.Value == 0)
     {
         unlockButton.SetActive(ViewModel.CanUnlock.Value);
         unlockLabel.gameObject.SetActive(!ViewModel.CanUnlock.Value);
         background.color = ViewModel.CanUnlock.Value ? wakeColor : disabledColor;
         return;
     }
     background.color = learnedColor;
     LevelChanged(0, ViewModel.Level.Value);
 }
Esempio n. 15
0
        /// <summary>
        /// 获取攻击到的所有敌人
        /// </summary>
        /// <returns>The damage characters.</returns>
        /// <param name="vCharacter">攻击方</param>
        /// <param name="targetView">攻击目标</param>
        /// <param name="skill">Skill.</param>
        public List <VCharacter> GetTargetCharacters(VCharacter vCharacter, VCharacter targetView, App.Model.Master.MSkill skill)
        {
            List <VCharacter> result = new List <VCharacter>()
            {
                targetView
            };

            if (skill.radius_type == RadiusType.point)
            {
                return(result);
            }
            List <VCharacter> characters;

            if (System.Array.Exists(skill.types, s => s == SkillType.heal))
            {
                characters = vBaseMap.Characters.FindAll(c => c.ViewModel.Hp.Value > 0 && this.IsSameBelong(c.ViewModel.Belong.Value, vCharacter.ViewModel.Belong.Value) && !this.IsSameCharacter(targetView, c));
            }
            else/* if (System.Array.Exists(skill.types, s => s == SkillType.attack))*/
            {
                characters = vBaseMap.Characters.FindAll(c => c.ViewModel.Hp.Value > 0 && this.IsSameBelong(c.ViewModel.Belong.Value, targetView.ViewModel.Belong.Value) && !this.IsSameCharacter(targetView, c));
            }
            VTile targetTile;

            if (skill.effect.special == App.Model.Master.SkillEffectSpecial.attack_all_near)
            {
                targetTile = cBattlefield.mapSearch.GetTile(vCharacter.ViewModel.CoordinateX.Value, vCharacter.ViewModel.CoordinateY.Value);
            }
            else
            {
                targetTile = cBattlefield.mapSearch.GetTile(targetView.ViewModel.CoordinateX.Value, targetView.ViewModel.CoordinateY.Value);
            }
            if (skill.radius_type == RadiusType.range)
            {
                foreach (VCharacter child in characters)
                {
                    VTile tile = cBattlefield.mapSearch.GetTile(child.ViewModel.CoordinateX.Value, child.ViewModel.CoordinateY.Value);
                    if (targetTile.Index != tile.Index && cBattlefield.mapSearch.GetDistance(targetTile, tile) <= skill.radius)
                    {
                        result.Add(child);
                    }
                }
                bool quantity_plus = skill.effect.special == App.Model.Master.SkillEffectSpecial.quantity_plus;
                if (quantity_plus)
                {
                    List <VCharacter> resultPlus = new List <VCharacter>();
                    while (result.Count > 1 && resultPlus.Count < skill.effect.special_value)
                    {
                        int        index    = Random.Range(1, result.Count - 1);
                        VCharacter plusView = result[index];
                        resultPlus.Add(plusView);
                        result.RemoveAt(index);
                    }
                    resultPlus.Add(targetView);
                    return(resultPlus);
                }
            }
            else if (skill.radius_type == RadiusType.direction)
            {
                VTile tile     = cBattlefield.mapSearch.GetTile(vCharacter.ViewModel.CoordinateX.Value, vCharacter.ViewModel.CoordinateY.Value);
                int   distance = cBattlefield.mapSearch.GetDistance(targetTile, tile);
                if (distance > 1)
                {
                    return(result);
                }
                var direction = cBattlefield.mapSearch.GetDirection(tile, targetTile);
                var radius    = skill.radius;
                while (radius-- > 0)
                {
                    tile = cBattlefield.mapSearch.GetTile(targetTile, direction);
                    VCharacter child = GetCharacter(tile.Index, characters);
                    if (child == null)
                    {
                        break;
                    }
                    result.Add(child);
                    targetTile = tile;
                }
            }
            return(result);
        }
Esempio n. 16
0
        /// <summary>
        /// 攻击伤害=技能*0.3+攻击力-防御力*2
        /// </summary>
        /// <param name="attackCharacter">Attack character.</param>
        /// <param name="targetCharacter">Target character.</param>
        public int Hert(MCharacter attackCharacter, MCharacter targetCharacter, VTile tile = null, VTile targetTile = null)
        {
            //获取地形辅助
            float  tileAid       = attackCharacter.TileAid(tile);
            float  targetTileAid = targetCharacter.TileAid(targetTile);
            MSkill skill         = attackCharacter.CurrentSkill;

            App.Model.Master.MSkill skillMaster = skill.Master;
            if (tile == null)
            {
                tile = cBattlefield.mapSearch.GetTile(attackCharacter.CoordinateX, attackCharacter.CoordinateY);
            }
            if (targetTile == null)
            {
                targetTile = cBattlefield.mapSearch.GetTile(targetCharacter.CoordinateX, targetCharacter.CoordinateY);
            }
            float attack = System.Array.Exists(skillMaster.types, s => s == SkillType.attack) ? attackCharacter.Ability.PhysicalAttack : attackCharacter.Ability.MagicAttack;

            //地形辅助
            attack *= tileAid;
            if (attackCharacter.IsPike && targetCharacter.IsKnife)
            {
                //枪剑类克制刀类
                attack *= 1.2f;
            }
            else if (attackCharacter.IsKnife && targetCharacter.IsAx)
            {
                //刀类克制斧类
                attack *= 1.2f;
            }
            else if (attackCharacter.IsAx && targetCharacter.IsPike)
            {
                //斧类克制枪剑类
                attack *= 1.2f;
            }
            float defense = System.Array.Exists(skillMaster.types, s => s == SkillType.attack) ? targetCharacter.Ability.PhysicalDefense : targetCharacter.Ability.MagicDefense;

            //地形辅助
            defense *= targetTileAid;
            if (attackCharacter.IsLongWeapon && targetCharacter.IsShortWeapon)
            {
                //长兵器克制短兵器
                defense *= 0.8f;
            }
            else if (attackCharacter.IsShortWeapon && targetCharacter.IsArcheryWeapon)
            {
                //短兵器克制远程兵器
                defense *= 0.8f;
            }
            else if (attackCharacter.IsArcheryWeapon && targetCharacter.IsLongWeapon)
            {
                //远程类兵器克制长兵器
                defense *= 0.8f;
            }
            App.Model.Master.MTile mTile = TileCacher.Instance.Get(targetTile.TileId);
            //地形对技能威力的影响
            int   five_elements = (int)skillMaster.five_elements;
            float skillStrength = skillMaster.strength * mTile.strategys[five_elements];
            //抗性对技能威力的影响
            int resistance = targetCharacter.Master.resistances[five_elements];

            if (resistance > 0)
            {
                skillStrength *= ((100 - resistance) * 0.01f);
            }
            float result = skillStrength * 0.3f + attack - defense;

            //Debug.LogError("result="+result + ", skillMaster.strength="+skillMaster.strength +", attack=" + attack+", defense="+defense);
            if (attackCharacter.MoveType == MoveType.cavalry && targetCharacter.MoveType == MoveType.infantry && !targetCharacter.IsArcheryWeapon)
            {
                //骑兵克制近身步兵
                result *= 1.2f;
            }
            else if (attackCharacter.IsArcheryWeapon && targetCharacter.MoveType == MoveType.cavalry && !targetCharacter.IsArcheryWeapon)
            {
                //远程类克制近身类骑兵
                result *= 1.2f;
            }
            else if (attackCharacter.MoveType == MoveType.infantry && targetCharacter.WeaponType != WeaponType.archery && targetCharacter.IsArcheryWeapon)
            {
                //近身步兵克制远程类
                result *= 1.2f;
            }
            if (targetCharacter.MoveType == MoveType.cavalry && skillMaster.effect.special == App.Model.Master.SkillEffectSpecial.horse_hert)
            {
                //对骑兵技能伤害加成
                result *= (1f + skillMaster.effect.special_value * 0.01f);
            }
            else if (skillMaster.effect.special == App.Model.Master.SkillEffectSpecial.move_and_attack && attackCharacter.roadLength > 0)
            {
                //移动攻击
                result *= (1f + attackCharacter.roadLength * skillMaster.effect.special_value * 0.01f);
            }
            result = result > 1 ? result : 1;
            result = result > targetCharacter.Hp ? targetCharacter.Hp : result;
            return((int)result);
        }
Esempio n. 17
0
        public void Update(MCharacter mCharacter)
        {
            App.Model.Master.MCharacter master = mCharacter.Master;
            if (master == null)
            {
                return;
            }
            App.Model.MSkill[] skills = mCharacter.Skills;
            this.Power            = master.power;
            this.Knowledge        = master.knowledge;
            this.Speed            = master.speed;
            this.Trick            = master.trick;
            this.Endurance        = master.endurance;
            this.MovingPower      = master.moving_power;
            this.Riding           = master.riding;
            this.Walker           = master.walker;
            this.Pike             = master.pike;
            this.Sword            = master.sword;
            this.LongKnife        = master.long_knife;
            this.Knife            = master.knife;
            this.LongAx           = master.long_ax;
            this.Ax               = master.ax;
            this.LongSticks       = master.long_sticks;
            this.Sticks           = master.sticks;
            this.Archery          = master.archery;
            this.HiddenWeapons    = master.hidden_weapons;
            this.DualWield        = master.dual_wield;
            this.ResistanceMetal += master.resistance_metal;
            this.ResistanceWood  += master.resistance_wood;
            this.ResistanceWater += master.resistance_water;
            this.ResistanceFire  += master.resistance_fire;
            this.ResistanceEarth += master.resistance_earth;
            int hp = master.hp;
            int mp = master.mp;

            if (skills != null)
            {
                foreach (App.Model.MSkill skill in skills)
                {
                    App.Model.Master.MSkill skillMaster = skill.Master;
                    if (skillMaster == null)
                    {
                        Debug.LogError("master.name=" + master.name + ", " + skill.SkillId + "," + skill.Level);
                        return;
                    }
                    if (!System.Array.Exists(skillMaster.types, s => s == SkillType.ability))
                    {
                        continue;
                    }
                    hp                   += skillMaster.hp;
                    mp                   += skillMaster.mp;
                    this.Power           += skillMaster.power;
                    this.Knowledge       += skillMaster.knowledge;
                    this.Speed           += skillMaster.speed;
                    this.Trick           += skillMaster.trick;
                    this.Endurance       += skillMaster.endurance;
                    this.MovingPower     += skillMaster.moving_power;
                    this.Riding          += skillMaster.riding;
                    this.Walker          += skillMaster.walker;
                    this.Pike            += skillMaster.pike;
                    this.Sword           += skillMaster.sword;
                    this.LongKnife       += skillMaster.long_knife;
                    this.Knife           += skillMaster.knife;
                    this.LongAx          += skillMaster.long_ax;
                    this.Ax              += skillMaster.ax;
                    this.LongSticks      += skillMaster.long_sticks;
                    this.Sticks          += skillMaster.sticks;
                    this.Archery         += skillMaster.archery;
                    this.HiddenWeapons   += skillMaster.hidden_weapons;
                    this.DualWield       += skillMaster.dual_wield;
                    this.Magic           += skillMaster.magic;
                    this.ResistanceMetal += skillMaster.resistance_metal;
                    this.ResistanceWood  += skillMaster.resistance_wood;
                    this.ResistanceWater += skillMaster.resistance_water;
                    this.ResistanceFire  += skillMaster.resistance_fire;
                    this.ResistanceEarth += skillMaster.resistance_earth;
                }
            }
            List <App.Model.Master.MEquipment> equipments = new List <App.Model.Master.MEquipment>();

            if (mCharacter.Weapon > 0)
            {
                equipments.Add(EquipmentCacher.Instance.GetEquipment(mCharacter.Weapon, App.Model.Master.MEquipment.EquipmentType.weapon));
            }
            if (mCharacter.Clothes > 0)
            {
                equipments.Add(EquipmentCacher.Instance.GetEquipment(mCharacter.Clothes, App.Model.Master.MEquipment.EquipmentType.clothes));
            }
            if (mCharacter.Horse > 0)
            {
                equipments.Add(EquipmentCacher.Instance.GetEquipment(mCharacter.Horse, App.Model.Master.MEquipment.EquipmentType.horse));
            }
            int physicalAttack  = 0;
            int physicalDefense = 0;
            int magicAttack     = 0;
            int magicDefense    = 0;

            foreach (App.Model.Master.MEquipment equipment in equipments)
            {
                hp                   += equipment.hp;
                mp                   += equipment.mp;
                this.Power           += equipment.power;
                this.Knowledge       += equipment.knowledge;
                this.Speed           += equipment.speed;
                this.Trick           += equipment.trick;
                this.Endurance       += equipment.endurance;
                this.MovingPower     += equipment.moving_power;
                this.Riding          += equipment.riding;
                this.Walker          += equipment.walker;
                this.Pike            += equipment.pike;
                this.Sword           += equipment.sword;
                this.LongKnife       += equipment.long_knife;
                this.Knife           += equipment.knife;
                this.LongAx          += equipment.long_ax;
                this.Ax              += equipment.ax;
                this.LongSticks      += equipment.long_sticks;
                this.Sticks          += equipment.sticks;
                this.Archery         += equipment.archery;
                this.HiddenWeapons   += equipment.hidden_weapons;
                this.DualWield       += equipment.dual_wield;
                this.Magic           += equipment.magic;
                this.ResistanceMetal += equipment.resistance_metal;
                this.ResistanceWood  += equipment.resistance_wood;
                this.ResistanceWater += equipment.resistance_water;
                this.ResistanceFire  += equipment.resistance_fire;
                this.ResistanceEarth += equipment.resistance_earth;
                physicalAttack       += equipment.physical_attack;
                physicalDefense      += equipment.physical_defense;
                magicAttack          += equipment.magic_attack;
                magicDefense         += equipment.magic_defense;
            }

            this.HpMax = Mathf.FloorToInt(mCharacter.Level * (10 + this.Endurance * 0.2f) + hp);
            this.MpMax = Mathf.FloorToInt(mCharacter.Level * (5 + this.Knowledge * 0.1f) + mp);
            float moveTypeValue = (mCharacter.MoveType == MoveType.cavalry ? this.Riding : this.Walker);

            switch (mCharacter.WeaponType)
            {
            case WeaponType.archery:
                moveTypeValue += this.Archery;
                break;

            case WeaponType.pike:
                moveTypeValue += this.Pike;
                break;

            case WeaponType.sword:
                moveTypeValue += this.Sword;
                break;

            case WeaponType.longAx:
                moveTypeValue += this.LongAx;
                break;

            case WeaponType.ax:
                moveTypeValue += this.Ax;
                break;

            case WeaponType.longKnife:
                moveTypeValue += this.LongKnife;
                break;

            case WeaponType.shortKnife:
                moveTypeValue += this.Knife;
                break;

            case WeaponType.longSticks:
                moveTypeValue += this.LongSticks;
                break;

            case WeaponType.sticks:
                moveTypeValue += this.Sticks;
                break;

            case WeaponType.dualWield:
                moveTypeValue += this.DualWield;
                break;

            case WeaponType.magic:
                moveTypeValue += this.Magic;
                break;
            }
            float starPower = 0.7f + mCharacter.Star * 0.06f;

            this.PhysicalAttack   = Mathf.FloorToInt((this.Power + this.Knowledge) * 0.3f + (this.Power * 2f + this.Knowledge) * (0.4f + (moveTypeValue * 0.5f) * 0.006f) * (1f + mCharacter.Level * starPower * 0.5f) * 0.1f);
            this.PhysicalAttack  += physicalAttack;
            this.MagicAttack      = Mathf.FloorToInt((this.Trick + this.Knowledge) * 0.3f + (this.Trick * 2f + this.Knowledge) * (0.4f + (moveTypeValue * 0.5f) * 0.006f) * (1f + mCharacter.Level * starPower * 0.5f) * 0.1f);
            this.MagicAttack     += magicAttack;
            this.PhysicalDefense  = Mathf.FloorToInt((this.Power * 0.5f + this.Knowledge) * 0.3f + (this.Power + this.Knowledge) * (1f + mCharacter.Level * starPower * 0.5f) * 0.04f);
            this.PhysicalDefense += physicalDefense;
            this.MagicDefense     = Mathf.FloorToInt((this.Trick * 0.5f + this.Knowledge) * 0.3f + (this.Trick + this.Knowledge) * (1f + mCharacter.Level * starPower * 0.5f) * 0.04f);
            this.MagicDefense    += magicDefense;
        }
Esempio n. 18
0
        public IEnumerator Execute()
        {
            //行动顺序
            MCharacter[] characters = System.Array.FindAll(mBaseMap.Characters, c => c.Belong == this.belong && c.Hp > 0 && !c.IsHide && !c.ActionOver);
            System.Array.Sort(characters, (a, b) => {
                VTile aTile = cBattlefield.mapSearch.GetTile(a.CoordinateX, a.CoordinateY);
                VTile bTile = cBattlefield.mapSearch.GetTile(b.CoordinateX, b.CoordinateY);
                App.Model.Master.MTile aMTile = TileCacher.Instance.Get(aTile.TileId);
                App.Model.Master.MTile bMTile = TileCacher.Instance.Get(bTile.TileId);
                //恢复地形
                if (aMTile.heal > bMTile.heal)
                {
                    return(1);
                }
                else if (aMTile.heal > bMTile.heal)
                {
                    return(-1);
                }
                bool aPant = a.IsPant;
                bool bPant = b.IsPant;
                //残血状态
                if (aPant && !bPant)
                {
                    return(1);
                }
                else if (!aPant && bPant)
                {
                    return(-1);
                }
                bool aMagic = a.WeaponType == WeaponType.magic;
                bool bMagic = b.WeaponType == WeaponType.magic;
                bool aHeal  = a.CanHeal;
                bool bHeal  = b.CanHeal;
                //攻击型法师
                if (aMagic && !bMagic && !aHeal)
                {
                    return(1);
                }
                else if (!aMagic && bMagic && !bHeal)
                {
                    return(-1);
                }
                bool aArchery = a.IsArcheryWeapon;
                bool bArchery = b.IsArcheryWeapon;
                //远程类
                if (aArchery && !bArchery)
                {
                    return(1);
                }
                else if (!aArchery && bArchery)
                {
                    return(-1);
                }
                //近战类
                if (!aMagic && bMagic)
                {
                    return(1);
                }
                else if (aMagic && !bMagic)
                {
                    return(-1);
                }
                //恢复型法师
                return(0);
            });
            mCharacter = characters[0];
            MSkill attackSkill = System.Array.Find(mCharacter.Skills, delegate(MSkill skill){
                App.Model.Master.MSkill skillMaster = skill.Master;
                return(System.Array.Exists(skillMaster.types, s => (s == SkillType.attack || s == SkillType.magic)) &&
                       System.Array.IndexOf(skillMaster.weapon_types, mCharacter.WeaponType) >= 0);
            });

            mCharacter.CurrentSkill = attackSkill;
            int index = cBattlefield.mapSearch.GetTile(mCharacter.CoordinateX, mCharacter.CoordinateY).Index;

            cBattlefield.manager.ClickNoneNode(index);
            yield return(new WaitForEndOfFrame());

            FindAttackTarget();
            //yield return cBattlefield.StartCoroutine();
            bool canKill = false;

            if (targetTile != null)
            {
                canKill = cBattlefield.calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.Hp >= 0;
            }
            if (canKill)
            {
                yield return(cBattlefield.StartCoroutine(Attack()));
            }
            else
            {
                bool   needHeal  = false;
                MSkill healSkill = System.Array.Find(mCharacter.Skills, delegate(MSkill skill){
                    App.Model.Master.MSkill skillMaster = skill.Master;
                    return(System.Array.Exists(skillMaster.types, s => s == SkillType.heal) &&
                           System.Array.IndexOf(skillMaster.weapon_types, mCharacter.WeaponType) >= 0);
                });
                if (healSkill != null)
                {
                    mCharacter.CurrentSkill = healSkill;
                    cBattlefield.manager.CharacterReturnNone();
                    cBattlefield.manager.ClickNoneNode(index);
                    yield return(new WaitForEndOfFrame());

                    MCharacter healTarget = null;
                    VTile      healTile   = null;
                    FindHealTarget(out healTarget, out healTile);
                    if (healTarget != null)
                    {
                        attackTarget = healTarget;
                        targetTile   = healTile;
                        needHeal     = true;
                    }
                }
                if (needHeal)
                {
                    yield return(cBattlefield.StartCoroutine(Heal()));

                    mCharacter.CurrentSkill = attackSkill;
                }
                else
                {
                    if (healSkill != null)
                    {
                        cBattlefield.manager.CharacterReturnNone();
                        cBattlefield.manager.ClickNoneNode(index);
                        yield return(new WaitForEndOfFrame());

                        mCharacter.CurrentSkill = attackSkill;
                    }
                    yield return(cBattlefield.StartCoroutine(Attack()));
                }
            }
        }
Esempio n. 19
0
        public IEnumerator Execute()
        {
            BattleCalculateManager  calculateManager  = Global.battleManager.calculateManager;
            BattleCharactersManager charactersManager = Global.charactersManager;
            TileMap mapSearch = Global.mapSearch;
            //行动顺序
            List <MCharacter> characters = charactersManager.mCharacters.FindAll((c) => {
                return(c.belong == this.belong && c.hp > 0 && !c.isHide && !c.actionOver);
            });

            characters.Sort((a, b) => {
                VTile aTile = mapSearch.GetTile(a.coordinate);
                VTile bTile = mapSearch.GetTile(b.coordinate);
                App.Model.Master.MTile aMTile = TileCacher.Instance.Get(aTile.tileId);
                App.Model.Master.MTile bMTile = TileCacher.Instance.Get(bTile.tileId);
                //恢复地形
                if (aMTile.heal > bMTile.heal)
                {
                    return(1);
                }
                else if (aMTile.heal > bMTile.heal)
                {
                    return(-1);
                }
                bool aPant = a.isPant;
                bool bPant = b.isPant;
                //残血状态
                if (aPant && !bPant)
                {
                    return(1);
                }
                else if (!aPant && bPant)
                {
                    return(-1);
                }
                bool aMagic = a.weaponType == WeaponType.magic;
                bool bMagic = b.weaponType == WeaponType.magic;
                bool aHeal  = a.canHeal;
                bool bHeal  = b.canHeal;
                //攻击型法师
                if (aMagic && !bMagic && !aHeal)
                {
                    return(1);
                }
                else if (!aMagic && bMagic && !bHeal)
                {
                    return(-1);
                }
                bool aArchery = a.isArcheryWeapon;
                bool bArchery = b.isArcheryWeapon;
                //远程类
                if (aArchery && !bArchery)
                {
                    return(1);
                }
                else if (!aArchery && bArchery)
                {
                    return(-1);
                }
                //近战类
                if (!aMagic && bMagic)
                {
                    return(1);
                }
                else if (aMagic && !bMagic)
                {
                    return(-1);
                }
                //恢复型法师
                return(0);
            });
            mCharacter = characters[0];
            Debug.LogError("mCharacter = " + mCharacter.name);
            MSkill attackSkill = System.Array.Find(mCharacter.skills, (MSkill skill) => {
                Model.Master.MSkill skillMaster = skill.master;
                return(System.Array.Exists(skillMaster.types, s => (s == SkillType.attack || s == SkillType.magic)) &&
                       System.Array.IndexOf(skillMaster.weaponTypes, mCharacter.weaponType) >= 0);
            });

            mCharacter.currentSkill = attackSkill;
            Global.battleManager.ClickNoneNode(mCharacter.coordinate);
            //VTile tile = mapSearch.GetTile(mCharacter.coordinate);
            //Global.battleManager.ClickNoneNode(tile.coordinate);
            yield return(new WaitForEndOfFrame());

            FindAttackTarget();
            Debug.LogError("targetTile=" + targetTile);
            bool canKill = false;

            if (targetTile != null)
            {
                canKill = calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.hp >= 0;
            }
            Debug.LogError("canKill=" + canKill);
            if (canKill)
            {
                yield return(AppManager.CurrentScene.StartCoroutine(Attack()));
            }
            else
            {
                bool   needHeal  = false;
                MSkill healSkill = System.Array.Find(mCharacter.skills, (MSkill skill) => {
                    App.Model.Master.MSkill skillMaster = skill.master;
                    return(System.Array.Exists(skillMaster.types, s => s == SkillType.heal) &&
                           System.Array.IndexOf(skillMaster.weaponTypes, mCharacter.weaponType) >= 0);
                });
                Debug.LogError("healSkill=" + healSkill);
                if (healSkill != null)
                {
                    mCharacter.currentSkill = healSkill;
                    Global.battleManager.CharacterReturnNone();
                    Global.battleManager.ClickNoneNode(mCharacter.coordinate);
                    yield return(new WaitForEndOfFrame());

                    MCharacter healTarget = null;
                    VTile      healTile   = null;
                    FindHealTarget(out healTarget, out healTile);
                    if (healTarget != null)
                    {
                        attackTarget = healTarget;
                        targetTile   = healTile;
                        needHeal     = true;
                    }
                }
                if (needHeal)
                {
                    yield return(AppManager.CurrentScene.StartCoroutine(Heal()));

                    mCharacter.currentSkill = attackSkill;
                }
                else
                {
                    if (healSkill != null)
                    {
                        Global.battleManager.CharacterReturnNone();
                        Global.battleManager.ClickNoneNode(mCharacter.coordinate);
                        yield return(new WaitForEndOfFrame());

                        mCharacter.currentSkill = attackSkill;
                    }
                    yield return(AppManager.CurrentScene.StartCoroutine(Attack()));
                }
            }
        }