Example #1
0
 private VTile GetNearestNode(MCharacter target, List <VTile> tiles)
 {
     if (mCharacter.Mission == Mission.defensive)
     {
         return(tiles.Find(t => t.CoordinateX == mCharacter.CoordinateX && t.CoordinateY == mCharacter.CoordinateY));
     }
     if (cBattlefield.tilesManager.CurrentMovingTiles.Count == 1)
     {
         return(cBattlefield.tilesManager.CurrentMovingTiles[0]);
     }
     tiles.Sort((a, b) => {
         bool aNotRoad = System.Array.Exists(mBaseMap.Characters, c => c.Hp > 0 && !c.IsHide && c.CoordinateX == a.CoordinateX && c.CoordinateY == a.CoordinateY);
         if (aNotRoad)
         {
             return(1);
         }
         bool aCanAttack = cBattlefield.charactersManager.IsInSkillDistance(target.CoordinateX, target.CoordinateY, a.CoordinateX, a.CoordinateY, mCharacter);
         bool bCanAttack = cBattlefield.charactersManager.IsInSkillDistance(target.CoordinateX, target.CoordinateY, b.CoordinateX, b.CoordinateY, mCharacter);
         if (aCanAttack && !bCanAttack)
         {
             return(-1);
         }
         else if (!aCanAttack && bCanAttack)
         {
             return(1);
         }
         else if (aCanAttack && bCanAttack)
         {
             bool aCanCounter = cBattlefield.calculateManager.CanCounterAttack(mCharacter, target, a.CoordinateX, a.CoordinateY, target.CoordinateX, target.CoordinateY);
             bool bCanCounter = cBattlefield.calculateManager.CanCounterAttack(mCharacter, target, b.CoordinateX, b.CoordinateY, target.CoordinateX, target.CoordinateY);
             if (aCanCounter && !bCanCounter)
             {
                 return(1);
             }
             else if (!aCanCounter && bCanCounter)
             {
                 return(-1);
             }
             else if (aCanCounter && bCanCounter)
             {
                 //地形优势
                 float aTileAid = mCharacter.TileAid(a);
                 float bTileAid = mCharacter.TileAid(b);
                 if (aTileAid < bTileAid)
                 {
                     return(-1);
                 }
                 else if (aTileAid > bTileAid)
                 {
                     return(1);
                 }
             }
         }
         int aDistance = cBattlefield.mapSearch.GetDistance(mCharacter.CoordinateX, mCharacter.CoordinateY, a.CoordinateX, a.CoordinateY);
         int bDistance = cBattlefield.mapSearch.GetDistance(mCharacter.CoordinateX, mCharacter.CoordinateY, b.CoordinateX, b.CoordinateY);
         return(aDistance - bDistance);
     });
     return(cBattlefield.tilesManager.CurrentMovingTiles[0]);
 }
Example #2
0
        /// <summary>
        /// 攻击命中
        /// 技巧+速度*2
        /// </summary>
        /// <returns><c>true</c>, if hitrate was attacked, <c>false</c> otherwise.</returns>
        /// <param name="attackCharacter">Attack character.</param>
        /// <param name="targetCharacter">Target character.</param>
        public bool AttackHitrate(MCharacter attackCharacter, MCharacter targetCharacter)
        {
            /* TODO::
             * //游戏教学时100%命中
             * if (Global.SUser.self.IsTutorial)
             * {
             *  return true;
             * }*/
            //技能100%命中
            if (attackCharacter.isForceHit)
            {
                return(true);
            }
            //获取地形辅助
            float tileAid       = attackCharacter.TileAid(Global.mapSearch.GetTile(attackCharacter.coordinate));
            float targetTileAid = attackCharacter.TileAid(Global.mapSearch.GetTile(targetCharacter.coordinate));
            int   attackValue   = (int)((attackCharacter.ability.knowledge + attackCharacter.ability.speed * 2) * tileAid);
            int   targetValue   = (int)((targetCharacter.ability.knowledge + targetCharacter.ability.speed * 2) * targetTileAid);
            int   r;

            if (attackValue > 2 * targetValue)
            {
                r = 100;
            }
            else if (attackValue > targetValue)
            {
                r = (attackValue - targetValue) * 10 / targetValue + 90;
            }
            else if (attackValue > targetValue * 0.5)
            {
                r = (attackValue - targetValue / 2) * 30 / (targetValue / 2) + 60;
            }
            else
            {
                r = (attackValue - targetValue / 3) * 30 / (targetValue / 3) + 30;
            }
            int randValue = UnityEngine.Random.Range(0, 100);

            if (randValue <= r)
            {
                return(true);
            }
            return(false);
        }
Example #3
0
        /// <summary>
        /// 攻击命中
        /// 技巧+速度*2
        /// </summary>
        /// <returns><c>true</c>, if hitrate was attacked, <c>false</c> otherwise.</returns>
        /// <param name="attackCharacter">Attack character.</param>
        /// <param name="targetCharacter">Target character.</param>
        public bool AttackHitrate(MCharacter attackCharacter, MCharacter targetCharacter)
        {
            //游戏教学时100%命中
            if (Global.SUser.self.IsTutorial)
            {
                return(true);
            }
            //技能100%命中
            if (attackCharacter.IsForceHit)
            {
                return(true);
            }
            //获取地形辅助
            float tileAid       = attackCharacter.TileAid(cBattlefield.mapSearch.GetTile(attackCharacter.CoordinateX, attackCharacter.CoordinateY));
            float targetTileAid = attackCharacter.TileAid(cBattlefield.mapSearch.GetTile(targetCharacter.CoordinateX, targetCharacter.CoordinateY));
            int   attackValue   = (int)((attackCharacter.Ability.Knowledge + attackCharacter.Ability.Speed * 2) * tileAid);
            int   targetValue   = (int)((targetCharacter.Ability.Knowledge + targetCharacter.Ability.Speed * 2) * targetTileAid);
            int   r;

            if (attackValue > 2 * targetValue)
            {
                r = 100;
            }
            else if (attackValue > targetValue)
            {
                r = (attackValue - targetValue) * 10 / targetValue + 90;
            }
            else if (attackValue > targetValue * 0.5)
            {
                r = (attackValue - targetValue / 2) * 30 / (targetValue / 2) + 60;
            }
            else
            {
                r = (attackValue - targetValue / 3) * 30 / (targetValue / 3) + 30;
            }
            int randValue = Random.Range(0, 100);

            if (randValue <= r)
            {
                return(true);
            }
            return(false);
        }
Example #4
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);
        }
Example #5
0
        private void FindAttackTarget()
        {
            BattleCalculateManager  calculateManager  = Global.battleManager.calculateManager;
            BattleTilesManager      tilesManager      = Global.battleManager.tilesManager;
            BattleCharactersManager charactersManager = Global.charactersManager;

            attackTarget = null;
            targetTile   = null;
            if (mCharacter.currentSkill == null)
            {
                return;
            }
            float tileAid = 0;

            foreach (MCharacter character in charactersManager.mCharacters)
            {
                if (character.hp == 0 || character.isHide)
                {
                    continue;
                }
                if (charactersManager.IsSameBelong(mCharacter.belong, character.belong))
                {
                    continue;
                }
                VTile vTile = GetNearestNode(character, tilesManager.currentMovingTiles);
                //可否攻击
                bool canAttack = charactersManager.IsInSkillDistance(character.coordinate, vTile.coordinate, mCharacter);
                if (!canAttack)
                {
                    continue;
                }
                if (attackTarget == null)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = 0;
                    continue;
                }
                //是否可杀死
                bool aCanKill = calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.hp >= 0;
                if (aCanKill)
                {
                    continue;
                }
                bool bCanKill = calculateManager.Hert(mCharacter, character, targetTile) - character.hp >= 0;
                if (!aCanKill && bCanKill)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = 0;
                    continue;
                }
                //是否反击
                bool aCanCounter = calculateManager.CanCounterAttack(mCharacter, attackTarget, targetTile.coordinate, attackTarget.coordinate);
                bool bCanCounter = calculateManager.CanCounterAttack(mCharacter, character, vTile.coordinate, character.coordinate);
                if (!aCanCounter && bCanCounter)
                {
                    continue;
                }
                else if (aCanCounter && !bCanCounter)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = 0;
                    continue;
                }
                //地形优势
                float aTileAid = tileAid;
                if (Global.IsFloatZero(aTileAid))
                {
                    aTileAid = attackTarget.TileAid(targetTile);
                }
                float bTileAid = character.TileAid(vTile);
                if (aTileAid > bTileAid)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = bTileAid;
                    continue;
                }
            }
        }
Example #6
0
        private VTile GetNearestNode(MCharacter target, List <VTile> tiles)
        {
            BattleCalculateManager  calculateManager  = Global.battleManager.calculateManager;
            BattleCharactersManager charactersManager = Global.charactersManager;
            TileMap mapSearch = Global.mapSearch;

            Debug.LogError("GetNearestNode tiles = " + tiles.Count);
            if (mCharacter.mission == Mission.defensive)
            {
                return(tiles.Find(t => t.coordinate.Equals(mCharacter.coordinate)));
            }
            if (tiles.Count == 1)
            {
                return(tiles[0]);
            }
            tiles.Sort((a, b) => {
                bool aNotRoad = charactersManager.mCharacters.Exists((c) => {
                    return(c.hp > 0 && !c.isHide && c.coordinate.Equals(a.coordinate));
                });
                if (aNotRoad)
                {
                    return(1);
                }
                bool aCanAttack = charactersManager.IsInSkillDistance(target.coordinate, a.coordinate, mCharacter);
                bool bCanAttack = charactersManager.IsInSkillDistance(target.coordinate, b.coordinate, mCharacter);
                if (aCanAttack && !bCanAttack)
                {
                    return(-1);
                }
                else if (!aCanAttack && bCanAttack)
                {
                    return(1);
                }
                else if (aCanAttack && bCanAttack)
                {
                    bool aCanCounter = calculateManager.CanCounterAttack(mCharacter, target, a.coordinate, target.coordinate);
                    bool bCanCounter = calculateManager.CanCounterAttack(mCharacter, target, b.coordinate, target.coordinate);
                    if (aCanCounter && !bCanCounter)
                    {
                        return(1);
                    }
                    else if (!aCanCounter && bCanCounter)
                    {
                        return(-1);
                    }
                    else if (aCanCounter && bCanCounter)
                    {
                        //地形优势
                        float aTileAid = mCharacter.TileAid(a);
                        float bTileAid = mCharacter.TileAid(b);
                        if (aTileAid < bTileAid)
                        {
                            return(-1);
                        }
                        else if (aTileAid > bTileAid)
                        {
                            return(1);
                        }
                    }
                }
                int aDistance = mapSearch.GetDistance(mCharacter.coordinate, a.coordinate);
                int bDistance = mapSearch.GetDistance(mCharacter.coordinate, b.coordinate);
                return(aDistance - bDistance);
            });
            return(tiles[0]);
        }
Example #7
0
        private void FindAttackTarget()
        {
            attackTarget = null;
            targetTile   = null;
            if (mCharacter.CurrentSkill == null)
            {
                return;
            }
            float tileAid = 0;

            foreach (MCharacter character in mBaseMap.Characters)
            {
                if (character.Hp == 0 || character.IsHide)
                {
                    continue;
                }
                if (cBattlefield.charactersManager.IsSameBelong(mCharacter.Belong, character.Belong))
                {
                    continue;
                }
                VTile vTile = GetNearestNode(character, cBattlefield.tilesManager.CurrentMovingTiles);
                //可否攻击
                bool canAttack = cBattlefield.charactersManager.IsInSkillDistance(character.CoordinateX, character.CoordinateY, vTile.CoordinateX, vTile.CoordinateY, mCharacter);
                if (!canAttack)
                {
                    continue;
                }
                if (attackTarget == null)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = 0;
                    continue;
                }
                //是否可杀死
                bool aCanKill = cBattlefield.calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.Hp >= 0;
                if (aCanKill)
                {
                    continue;
                }
                bool bCanKill = cBattlefield.calculateManager.Hert(mCharacter, character, targetTile) - character.Hp >= 0;
                if (!aCanKill && bCanKill)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = 0;
                    continue;
                }
                //是否反击
                bool aCanCounter = cBattlefield.calculateManager.CanCounterAttack(mCharacter, attackTarget, targetTile.CoordinateX, targetTile.CoordinateY, attackTarget.CoordinateX, attackTarget.CoordinateY);
                bool bCanCounter = cBattlefield.calculateManager.CanCounterAttack(mCharacter, character, vTile.CoordinateX, vTile.CoordinateY, character.CoordinateX, character.CoordinateY);
                if (!aCanCounter && bCanCounter)
                {
                    continue;
                }
                else if (aCanCounter && !bCanCounter)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = 0;
                    continue;
                }
                //地形优势
                float aTileAid = tileAid;
                if (aTileAid == 0)
                {
                    aTileAid = attackTarget.TileAid(targetTile);
                }
                float bTileAid = character.TileAid(vTile);
                if (aTileAid > bTileAid)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = bTileAid;
                    continue;
                }
            }
        }