Beispiel #1
0
    //
    /// <summary>
    /// 使用技能
    /// </summary>
    /// <param name="useSkillIdex">使用的技能在当前生物可用技能表中的下标</param>
    public virtual bool ToUseSkill(int useSID)
    {
        //技能冷却、MP判定
        if (Logic.time - SkillLastFireTime[useSID] < curSkillDataList[useSID].CoolingTime)
        {
            return(false); //技能未冷却
        }
        if (curCreatureData.curMP < curSkillDataList[useSID].CostMP)
        {
            return(false); //MP不足
        }
        //询问状态机状态是否能够改变
        if (!curFSM.ChangeState(curSkillDataList[useSID].StateName))
        {
            return(false); //不可更改为当前技能;
        }
        //更改当前正在释放的技能为请求释放的技能
        curSID = useSID;

        //技能进入冷却时间
        SkillReset(curSID);
        curCreatureData.curMP -= curSkillDataList[useSID].CostMP;

        //--------------------------------攻击属性----------------------------------------------------------------
        foreach (var t in curSkillDataList[useSID].ATKs)
        {
            SkillAttackType e = t;
            timer.Add((Logic.time + e.SkillAttackJudgeBeginTime, delegate() {
                MeleeMultiplayerAttack(e);
            }));
        }
        //--------------------------------BUFF属性----------------------------------------------------------------
        foreach (var t in curSkillDataList[useSID].BUFFs)
        {
            SkillBUFFType e = t;
            timer.Add((Logic.time + e.BeginTime, delegate(){
                for (int i = 0; i < e.RoleTimes; i++)
                {
                    int j = i;
                    BUFFtimer.Add((Logic.time + e.BeginTime + j * e.EachRoleTime, delegate() {
                        if ((e.RoleAttribute & 1) != 0)
                        {
                            HPRecover(e.EffectValue);
                            //curCreatureData.curHP += e.EffectValue;
                            //if(curCreatureData.curHP>curCreatureData.maxMP) curCreatureData.curHP = curCreatureData.maxHP;
                        }
                        if ((e.RoleAttribute & 2) != 0)
                        {
                            MPRecover(e.EffectValue);
                            //curCreatureData.curMP += e.EffectValue;
                            //if(curCreatureData.curMP>curCreatureData.maxMP) curCreatureData.curMP = curCreatureData.maxMP;
                        }
                        if ((e.RoleAttribute & 4) != 0)
                        {
                            //curCreatureData.Speed *= e.EffectRatio>1?0:(1-e.EffectRatio);
                            SpeedChange(e.EffectRatio);
                        }
                        if ((e.RoleAttribute & 8) != 0)
                        {
                            //curCreatureData.Defence *= e.EffectRatio>1?0:(1-e.EffectRatio);
                            DefenceChange(e.EffectRatio);
                        }
                        if ((e.RoleAttribute & 16) != 0)
                        {
                            //curCreatureData.Attack *= e.EffectRatio>1?0:(1-e.EffectRatio);
                            AttackChange(e.EffectRatio);
                        }
                    }));
                    if (e.IfRecycle)
                    {
                        BUFFtimer.Add((Logic.time + e.BeginTime + e.RoleTimes * e.EachRoleTime, delegate() {
                            if ((e.RoleAttribute & 1) != 0)
                            {
                                HPRecover(-e.EffectValue * e.RoleTimes);
                                //curCreatureData.curHP -= e.EffectValue*e.RoleTimes;
                            }
                            if ((e.RoleAttribute & 2) != 0)
                            {
                                MPRecover(-e.EffectValue * e.RoleTimes);
                                //curCreatureData.curMP -= e.EffectValue*e.RoleTimes;
                            }
                            if ((e.RoleAttribute & 4) != 0)
                            {
                                //curCreatureData.Speed *= e.EffectRatio>1?0:(1-e.EffectRatio);
                                SpeedChange(-e.EffectRatio);
                            }
                            if ((e.RoleAttribute & 8) != 0)
                            {
                                //curCreatureData.Defence *= e.EffectRatio>1?0:(1-e.EffectRatio);
                                DefenceChange(-e.EffectRatio);
                            }
                            if ((e.RoleAttribute & 16) != 0)
                            {
                                //curCreatureData.Attack *= e.EffectRatio>1?0:(1-e.EffectRatio);
                                AttackChange(-e.EffectRatio);
                            }
                        }));
                    }
                }
            }));
        }
        //--------------------------------子弹属性----------------------------------------------------------------
        foreach (var t in curSkillDataList[useSID].Bullets)
        {
            SkillBulletType e = t;
            timer.Add((Logic.time + e.BulletFireTime, delegate() {
                BulletsManager.CreateBullet(name, e);
            }));
        }
        //--------------------------------位移属性----------------------------------------------------------------
        foreach (var t in curSkillDataList[useSID].MOVEs)
        {
            SkillMoveType e = t;
            for (float i = 0; i < e.DuringTime; i += Logic.eachframtime)
            {
                timer.Add((Logic.time + e.BeginTime + i, delegate() {
                    Move(e.Speed);
                    //float angle = 15.0f * dir;
                    //float f = (float)(angle*Math.PI/180.0f);
                    //pos += (new Vector3((float)Math.Sin(f),0,(float)Math.Cos(f)))*((float)(e.Speed*Logic.eachframtime));
                    //rot = new Vector3(0,15.0f*dir,0);
                }));
            }
        }


        //curSkillStage = (0,0,0);

        //技能释放成功
        //Debug.Log("use skill " + useSID);
        return(true);
    }