コード例 #1
0
    public DamageResult testHurt(sdActorInterface _gameActor, Hashtable _state, sdActorInterface targetActor, int hitPointIndex, HeaderProto.ESkillEffect bySkillEffect)
    {
        DamageResult dr;

        dr.damage     = 0;
        dr.bubbleType = Bubble.BubbleType.eBT_BaseHurt;
        dr.attracker  = _gameActor;

        Hashtable recProp = targetActor.GetProperty();

        if (recProp == null)
        {
            return(dr);
        }
        SkillProperty skillProp = new SkillProperty();

        int   dmgMin            = (int)_gameActor["AtkDmgMin"];
        int   dmgMax            = (int)_gameActor["AtkDmgMax"];
        int   iceAtt            = (int)_gameActor["IceAtt"];
        int   fireAtt           = (int)_gameActor["FireAtt"];
        int   poisonAtt         = (int)_gameActor["PoisonAtt"];
        int   thunerAtt         = (int)_gameActor["ThunderAtt"];
        int   intervalPerAttack = (int)_gameActor["AttSpeed"];       // ms per attack
        float attackPerSecond   = 1000.0f / (float)intervalPerAttack;
        int   d10000            = ((int[])_state["dwAtkPowerPer[10]"])[hitPointIndex];
        int   dx = ((int[])_state["dwDmg[10]"])[hitPointIndex];
        int   byPeriodicDamageType = 0;                   //(int)_state.stateData["byPeriodicDamage"];

        Hashtable attTable = new Hashtable();
        int       phyAtt   = dmgMin;

        //如果最小攻击力 大于 最大攻击力 直接取最小攻击力...
        if (dmgMax > dmgMin)
        {
            phyAtt = Random.Range(dmgMin, dmgMax);
        }

        float iPercentFix = 0.0f;
        int   iDamageFix  = 0;

        switch ((EPeriodicDamage)byPeriodicDamageType)
        {
        ///每波伤害相同...
        case    EPeriodicDamage.PERIODIC_DAMAGE_SAME: {} break;

        ///固定值递增:Data + DataPeriodic * (Index)...
        case    EPeriodicDamage.PERIODIC_DAMAGE_INCREASE: {
            iDamageFix = (int)_state["dwPeriodicTraumaHP"] * (hitPointIndex + 1);
        } break;

        ///百分比递增:HP*(Data + DataPeriodic * (Index))...
        case        EPeriodicDamage.PERIODIC_DAMAGE_INCREASE_PERCENT: {
            iPercentFix = ((int)_state["dwPeriodicTraumaHP"] / 10000.0f) * (hitPointIndex + 1);
        } break;

        ///固定值递减:Data - DataPeriodic * (Index)...
        case    EPeriodicDamage.PERIODIC_DAMAGE_DECREASE: {
            iDamageFix = -(int)_state["dwPeriodicTraumaHP"] * (hitPointIndex + 1);
        } break;

        ///百分比递减:HP*(Data - DataPeriodic * (Index))...
        case    EPeriodicDamage.PERIODIC_DAMAGE_DECREASE_PERCENT: {
            iPercentFix = -((int)_state["dwPeriodicTraumaHP"] / 10000.0f) * (hitPointIndex + 1);
        } break;

        ///第一波伤害最大,其余伤害相同,第一波伤害计算公式:...
        ///固定值方式:Data - DataPeriodic...
        case    EPeriodicDamage.PERIODIC_DAMAGE_FIRST: {
            if (hitPointIndex == 0)
            {
                iDamageFix = (int)_state["dwPeriodicTraumaHP"];
            }
        } break;

        ///百分比方式:HP*(Data + DataPeriodic)...
        case    EPeriodicDamage.PERIODIC_DAMAGE_FIRST_PERCENT: {
            if (hitPointIndex == 0)
            {
                iPercentFix = ((int)_state["dwPeriodicTraumaHP"] / 10000.0f);
            }
        } break;

        ///最后一波伤害最大,其余伤害相同,第一波伤害计算公式:
        ///固定值方式:Data + DataPeriodic
        case        EPeriodicDamage.PERIODIC_DAMAGE_END: {
            if (hitPointIndex == -1)
            {
                iPercentFix = (int)_state["dwPeriodicTraumaHP"];
            }
        } break;

        ///百分比方式:HP*(Data + DataPeriodic)...
        case    EPeriodicDamage.PERIODIC_DAMAGE_END_PERCENT: {
            if (hitPointIndex == -1)
            {
                iPercentFix = ((int)_state["dwPeriodicTraumaHP"] / 10000.0f);
            }
        } break;
        }
        int skillHit    = (int)_state["dwHitPer"];
        int skillCri    = (int)_state["dwCriticalPer"];
        int skillCriDmg = (int)_state["dwCriticalDmgPer"];

        skillProp.atk        = phyAtt;
        skillProp.iceAtk     = iceAtt;
        skillProp.fireAtk    = fireAtt;
        skillProp.poisonAtk  = poisonAtt;
        skillProp.thunderAtk = thunerAtt;
        skillProp.Y          = (float)d10000 / 10000.0f;
        skillProp.Z          = dx;
        skillProp.YZFix      = iPercentFix;
        skillProp.ZFix       = iDamageFix;
        skillProp.hitRate    = (float)_gameActor["Hit"] * fPropertyScale + (float)_gameActor["HitPer"] * 0.0001f + (skillHit) * 0.0001f;
        int pierce = _gameActor["Pierce"];

        skillProp.passThrough = (float)pierce / (float)(pierce + (int)recProp["Level"] * 270 + 2700);

        skillProp.superAttack  = (float)_gameActor["CriDmg"] * 0.0001f + (skillCriDmg) * 0.0001f;
        skillProp.superRate    = (float)_gameActor["Cri"] * fPropertyScale + (float)_gameActor["CriPer"] * 0.0001f + (skillCri) * 0.0001f;
        skillProp.attPerSecond = attackPerSecond;
        if (_state.ContainsKey("dwDamagePer"))
        {
            skillProp.damagePer = ((int)_state["dwDamagePer"]) * 0.0001f;
        }
        else
        {
            skillProp.damagePer = 1.0f;
        }
        if (_gameActor.Property.ContainsKey("HurtOtherModify"))
        {
            skillProp.hurtOtherModify = ((int)_gameActor["HurtOtherModify"]) * 0.0001f;
        }
        else
        {
            skillProp.hurtOtherModify = 0.0f;
        }

        //属性修正aaa
        int attAttr = (int)_state["byDamegePro"];

        if (attAttr == 0)
        {
            skillProp.type = SkillType.Skill_Physic;
        }
        else if (attAttr == 1)
        {
            skillProp.type = SkillType.Skill_Ice;
        }
        else if (attAttr == 2)
        {
            skillProp.type = SkillType.Skill_Fire;
        }
        else if (attAttr == 3)
        {
            skillProp.type = SkillType.Skill_Poison;
        }
        else if (attAttr == 4)
        {
            skillProp.type = SkillType.Skill_Thunder;
        }
        skillProp.PropertyModify = CalulatePropertyModify(_gameActor, attAttr);
        ///体型修正aaaa
        skillProp.BodyTypeModify = CalulateBodyModify(_state, targetActor);
        //控制状态修正aaa
        skillProp.StateModify = CalulateStateModify(_gameActor, targetActor);

        SkillDefProperty defProp = new SkillDefProperty();

        defProp.level = (int)recProp["Level"];
        defProp.def   = (int)recProp["Def"];
        int dodge = (int)recProp["Dodge"];

        defProp.dodgeRate  = dodge * fPropertyScale;
        defProp.dodgeRate += ((int)recProp["DodgePer"]) * 0.0001f;
        defProp.fireDef    = (int)recProp["FireDef"];
        defProp.iceDef     = (int)recProp["IceDef"];
        defProp.poisonDef  = (int)recProp["PoisonDef"];
        int criDmgDef = (int)recProp["CriDmgDef"];

        defProp.superDef   = (float)criDmgDef * 0.0001f;
        defProp.thunderDef = (int)recProp["ThunderDef"];
        int flex = (int)recProp["Flex"];

        defProp.toughness = (float)flex * fPropertyScale;
        if (recProp.ContainsKey("BeHurtModify"))
        {
            defProp.beHurtModify = ((int)recProp["BeHurtModify"]) * 0.0001f;
        }
        else
        {
            defProp.beHurtModify = 0.0f;
        }

        bool isNormalAtk = false;

        if (attAttr == 0)
        {
            isNormalAtk = true;
        }

        bool isSuper;
        bool bDodge;

        dr.damage = CalculateAttack(skillProp, defProp, isNormalAtk, bySkillEffect, out isSuper, out bDodge);
        CalculateBubbleType(_state, _gameActor, targetActor, isSuper, bDodge, ref dr);
        if (bySkillEffect == HeaderProto.ESkillEffect.SKILL_EFFECT_CURE_HP)
        {
            targetActor.AddHP(dr.damage);
        }
        else if (bySkillEffect == HeaderProto.ESkillEffect.SKILL_EFFECT_CURE_MP)
        {
            targetActor.AddSP(dr.damage);
        }
        else if (bySkillEffect == HeaderProto.ESkillEffect.SKILL_EFFECT_DAMAGE_SP)
        {
            targetActor.AddSP(-dr.damage);
        }
        else
        {
            if (targetActor.CheckDebuffState(HeaderProto.ECreatureActionState.CREATURE_ACTION_STATE_UNBEAT))
            {
                dr.bubbleType = Bubble.BubbleType.eBT_Dodge;
                dr.damage     = 0;
            }
            targetActor.OnHurt(dr);
        }
        if (_state.Contains("WeaponHitType"))
        {
            targetActor.DoHittedAudio((string)_state["WeaponHitType"]);
        }
        if (targetActor.actorType == ActorType.AT_Monster && dr.damage > 0)
        {
            sdGameMonster monster     = (sdGameMonster)targetActor;
            int           monsterType = (int)monster.Property["BodyType"];
            if (_state.Contains("ParentID") && _state.Contains("dwTemplateID"))            //临时代码判断是技能伤害aa
            {
                int id = (int)_state["dwTemplateID"];
                _gameActor.OnAttackRestore(id, dr.damage, monsterType);
            }
        }
        //是否打断被击目标的某些buffer
        if (_state.ContainsKey("BreakState"))
        {
            int[] buffID = (int[])(_state["BreakState"]);
            if (buffID.Length == 2)
            {
                targetActor.RemoveBuff(buffID[0], buffID[1]);
            }
        }
        return(dr);
    }
コード例 #2
0
    public int CalculateAttack(SkillProperty skill, SkillDefProperty receiver, bool isNormalAtk, HeaderProto.ESkillEffect byskilleffect, out bool isSuper, out bool bDodge)
    {
        //首先判断是否命中...
        isSuper = false;
        bDodge  = false;
        float hitRate = skill.hitRate - receiver.dodgeRate;

        if (hitRate <= 0.0f)
        {
            bDodge = true;
            return(0);
        }
        int hit = Random.Range(0, 10001);

        if (hit > (int)(hitRate * 10000))
        {
            bDodge = true;
            return(0);
        }
        //判断是否暴击...
        float superAttack = 0.0f;
        float superRate   = skill.superRate - receiver.toughness;

        if (superRate > 0.0f)
        {
            int super = Random.Range(0, 10001);

            if (super <= (int)(superRate * 10000))
            {
                isSuper     = true;
                superAttack = skill.superAttack - receiver.superDef;
                if (superAttack < 1.0f)
                {
                    superAttack = 1.0f;
                }
                skill.atk        = (int)((float)skill.atk * superAttack);
                skill.iceAtk     = (int)((float)skill.iceAtk * superAttack);
                skill.fireAtk    = (int)((float)skill.fireAtk * superAttack);
                skill.thunderAtk = (int)((float)skill.thunderAtk * superAttack);
                skill.poisonAtk  = (int)((float)skill.poisonAtk * superAttack);
            }
        }
        float attPerSec = skill.attPerSecond;
        int   def       = receiver.def;

        if (skill.type == SkillType.Skill_Ice)
        {
            def = receiver.iceDef;
        }
        else if (skill.type == SkillType.Skill_Fire)
        {
            def = receiver.fireDef;
        }
        else if (skill.type == SkillType.Skill_Poison)
        {
            def = receiver.poisonDef;
        }
        else if (skill.type == SkillType.Skill_Thunder)
        {
            def = receiver.thunderDef;
        }

        def = (int)(def * (1.0f - skill.passThrough));
        //计算减伤...
        float hurtDec = def / ((float)def + receiver.level * 270 + 2700);
        //计算最终伤害...
        int damage = (int)((((skill.atk + skill.iceAtk + skill.fireAtk + skill.poisonAtk + skill.thunderAtk) * skill.Y + skill.Z) *
                            (1.0f + skill.YZFix) + skill.ZFix) * skill.damagePer);
        //伤害附加 减伤
        int hurt = 0;

        if (byskilleffect == HeaderProto.ESkillEffect.SKILL_EFFECT_CURE_HP ||
            byskilleffect == HeaderProto.ESkillEffect.SKILL_EFFECT_CURE_MP)
        {
            hurt = damage;
        }
        else
        {
            hurt = (int)(damage * (1.0f + skill.hurtOtherModify + skill.PropertyModify + skill.BodyTypeModify + skill.StateModify) * (1.0f - hurtDec) * (1.0f + receiver.beHurtModify));
        }
        if (hurt <= 0)
        {
            hurt = Random.Range(1, 6);
        }
        return(hurt);
    }