예제 #1
0
 /// <summary>
 /// 怪物的 AI 逻辑
 /// </summary>
 public override void TickAILogic()
 {
     if (!runAI)
     {
         return;
     }
     // 防止还在 出生状态 就开始移动,从而出现滑动效果
     if (currentAniState == AniState.Idle || currentAniState == AniState.Move)
     {
         // 暂停游戏
         if (battleMgr.isPauseGame)
         {
             Idle();
             return;
         }
         // 检测时间间隔计算
         float delta = Time.deltaTime;
         checkCountTime += delta;
         if (checkCountTime < checkTime)
         {
             return;
         }
         else
         {
             // 计算目标方向
             Vector2 dir = CalcTargetDir();
             // 判断目标是否在攻击范围
             if (!InAtkRange())   // 不在,设置移动方向,移动
             {
                 SetDir(dir);
                 Move();
             }
             else   // 在,停止移动,攻击
             {
                 SetDir(Vector2.zero);
                 // 判断攻击间隔
                 atkCountTime += checkCountTime; // 把移动的时间当成时间间隔的一部分,防止移动到目标身边后还要等待一会才会攻击
                 if (atkCountTime > atkTime)     // 达到攻击时间,转向并攻击
                 {
                     SetAtkRotation(dir);
                     Attack(md.mCfg.skillID);
                     atkCountTime = 0;
                 }
                 else   // 等待
                 {
                     Idle();
                 }
             }
             checkCountTime = 0;
             checkTime      = PETools.RanInt(1, 5) * 1.0f / 10; // 第一次 2 s,之后随机检测时间间隔
         }
     }
 }
예제 #2
0
    /// <summary>
    /// 获取一个随机的名字
    /// </summary>
    /// <param name="man">默认男人名字,false 为女人</param>
    /// <returns></returns>
    public string GetRanName(bool man = true)
    {
        string ranName = surnameLst[PETools.RanInt(0, surnameLst.Count - 1)];

        if (man)
        {
            ranName += manLst[PETools.RanInt(0, manLst.Count - 1)];
        }
        else
        {
            ranName += womanLst[PETools.RanInt(0, womanLst.Count - 1)];
        }
        return(ranName);
    }
예제 #3
0
    /// <summary>
    /// 伤害运算
    /// </summary>
    private void CalcDamage(EntityBase caster, EntityBase target, SkillCfg skillCfg, int damage)
    {
        int dmgSum = damage;

        // AD 伤害
        if (skillCfg.dmgType == DamageType.AD)
        {
            // 计算闪避
            int dodgeNum = PETools.RanInt(1, 100, rd);
            if (dodgeNum <= target.Props.dodge)
            {
                // UI 显示闪避 TODO
                PECommon.Log("闪避Rate:" + dodgeNum + "/" + target.Props.dodge);
                target.SetDodge();
                return;
            }
            // 计算属性加成
            dmgSum += caster.Props.ad;
            // 计算暴击
            int criticalNum = PETools.RanInt(1, 100, rd);
            if (criticalNum <= caster.Props.critical)
            {
                float criticalRate = 1 + (PETools.RanInt(1, 100, rd) / 100.0f); // 暴击率
                dmgSum = (int)criticalRate * dmgSum;
                PECommon.Log("暴击Rate:" + criticalNum + "/" + caster.Props.critical);
                target.SetCritical(dmgSum);
            }
            // 计算穿甲
            int addef = (int)((1 - caster.Props.pierce / 100.0f) * target.Props.addef);
            dmgSum -= addef;
        }
        // AP 伤害
        else if (skillCfg.dmgType == DamageType.AP)
        {
            // 计算属性加成
            dmgSum += caster.Props.ap;
            // 计算魔法抗性
            dmgSum -= target.Props.apdef;
        }
        else
        {
        }

        // 最终伤害
        if (dmgSum < 0)
        {
            dmgSum = 0;
            return;
        }

        target.SetHurt(dmgSum);

        if (target.HP < dmgSum)
        {
            target.HP = 0;
            target.Die(); // 目标死亡

            if (target.entityType == EntityType.Monster)
            {
                target.battleMgr.RmvMonster(target.Name); // 移除
            }
            else if (target.entityType == EntityType.Player)
            {
                target.battleMgr.EndBattle(false, 0); // 结束战斗
                target.battleMgr.entitySelfPlayer = null;
            }
        }
        else
        {
            target.HP -= dmgSum;
            if (target.entityState == EntityState.None && target.GetBreakState())
            {
                target.Hit();
            }
        }
    }