/// <summary>
    /// 造成伤害
    /// </summary>
    /// <param name="attackHurtStruct"></param>
    public override CalculateHurt.Result GiveAttackHurtStruct(AttackHurtStruct attackHurtStruct)
    {
        MonsterControl monsterControl = GetComponent <MonsterControl>();

        if (monsterControl != null &&
            monsterControl.monsterDataInfo != null &&
            monsterControl.monsterDataInfo.MonsterBaseAttribute != null)
        {
            PhysicDefenseFactor  physicDefenseFactor = monsterControl.monsterDataInfo.PhysicDefenseFactor; //物理防御系数
            MagicDefenseFactor   magicDefenseFactor  = monsterControl.monsterDataInfo.MagicDefenseFactor;  //魔法防御系数
            CalculateHurt.Result result = CalculateHurt.Calculate(attackHurtStruct, monsterControl.thisAttribute, physicDefenseFactor, magicDefenseFactor);
            monsterControl.GiveHit();
            //显示伤害
            base.ShowHurt(result, gameObject);
            //显示怪物的血条
            iGameState.ShowMonsterHP = new MonsterHPUIStruct()
            {
                monsterName = monsterControl.monsterDataInfo.monsterPrefabName,
                maxHP       = monsterControl.thisAttribute.MaxHP,
                nowHP       = monsterControl.thisAttribute.HP,
                monsterObj  = gameObject
            };
            return(result);
        }
        return(default(CalculateHurt.Result));
    }
    /// <summary>
    /// 造成伤害
    /// </summary>
    /// <param name="attackHurtStruct"></param>
    public override CalculateHurt.Result GiveAttackHurtStruct(AttackHurtStruct attackHurtStruct)
    {
        IPlayerState        iPlayerState        = GameState.Instance.GetEntity <IPlayerState>();
        IAttributeState     playerAttribute     = iPlayerState.GetResultAttribute();
        PhysicDefenseFactor physicDefenseFactor = new PhysicDefenseFactor()//物理防御系数
        {
            CoefficientRatioReducingDamageFactor = iPlayerState.SelfRoleOfRaceInfoStruct.physicDefenseToHurtRateRatio,
            ImmunityInjury = iPlayerState.SelfRoleOfRaceInfoStruct.physicQuickToHurtExemptRatio
        };
        MagicDefenseFactor magicDefenseFactor = new MagicDefenseFactor() //魔法防御系数
        {
            CoefficientRatioReducingDamageFactor = iPlayerState.SelfRoleOfRaceInfoStruct.magicDefenseToHurtRateRatio
        };

        CalculateHurt.Result calculateHurtResult = CalculateHurt.Calculate(attackHurtStruct, playerAttribute, physicDefenseFactor, magicDefenseFactor);
        if (calculateHurtResult.hurt >= 0)
        {
            if (calculateHurtResult.hurt != 0)
            {
                //减血(因为这里是整合的属性,必须在外部将自身血量减去)
                iPlayerState.HP -= calculateHurtResult.hurt;
                //终端咏唱
                ISkillState iSkillState = GameState.Instance.GetEntity <ISkillState>();
                iSkillState.GetHitToSkillState();
                //手柄震动
                iPlayerState.SetVibration(0.1f, 0.7f, 0.7f);
            }
            //显示伤害
            base.ShowHurt(calculateHurtResult, iPlayerState.PlayerObj);
        }
        return(calculateHurtResult);
    }
Exemple #3
0
    public void Init()
    {
        RoleOfRaceData       roleOfRaceData       = DataCenter.Instance.GetMetaData <RoleOfRaceData>();
        RoleOfRaceInfoStruct roleOfRaceInfoStruct = roleOfRaceData[roleOfRace];

        if (roleOfRaceInfoStruct != null)
        {
            //重置属性
            IAttributeState tempAdditional = new AttributeStateAdditional();// MonsterBaseAttribute.Clone();//赋值出来一份用来计算种族成长
            tempAdditional.SetRoleOfRaceAddition(roleOfRaceInfoStruct);
            tempAdditional.Power         = MonsterBaseAttribute.Power;
            tempAdditional.Mental        = MonsterBaseAttribute.Mental;
            tempAdditional.Quick         = MonsterBaseAttribute.Quick;
            MonsterBaseAttribute         = (AttributeStateAdditional)(MonsterBaseAttribute + tempAdditional);
            MonsterBaseAttribute.Power  /= 2;
            MonsterBaseAttribute.Quick  /= 2;
            MonsterBaseAttribute.Mental /= 2;
            //系数
            PhysicAttackFactor = new PhysicAttackFactor()
            {
                IncreaseRatioInjuryFactor = roleOfRaceInfoStruct.physicAttackToDamageRateRatio,
                MinimumDamageFactor       = roleOfRaceInfoStruct.physicQuickToMinDamageRatio
            };
            PhysicDefenseFactor = new PhysicDefenseFactor()
            {
                CoefficientRatioReducingDamageFactor = roleOfRaceInfoStruct.physicDefenseToHurtRateRatio,
                ImmunityInjury = roleOfRaceInfoStruct.physicQuickToHurtExemptRatio
            };
            MagicAttackFactor = new MagicAttackFactor()
            {
                IncreaseRatioInjuryFactor = roleOfRaceInfoStruct.magicAttackToDamageRateRatio
            };
            MagicDefenseFactor = new MagicDefenseFactor()
            {
                CoefficientRatioReducingDamageFactor = roleOfRaceInfoStruct.magicDefenseToHurtRateRatio
            };
        }
    }
Exemple #4
0
    /// <summary>
    /// 具体的计算
    /// </summary>
    /// <param name="from">伤害来自于</param>
    /// <param name="to">伤害指向</param>
    /// <param name="physicDefenseFactor">物理防御系数</param>
    /// <param name="magicDefenseFactor">魔法防御系数</param>
    public static Result Calculate(AttackHurtStruct from, IAttributeState to, PhysicDefenseFactor physicDefenseFactor, MagicDefenseFactor magicDefenseFactor)
    {
        //计算本次伤害造成的结果
        Result calculateHurtResult;

        calculateHurtResult.IsCrit = false;
        float maxHP = to.MaxHP;
        //先判断是否命中
        float isHitRate = from.attributeState.HitRate - to.EvadeRate; //本次攻击是否命中的概率(0-?(1))

        if (isHitRate < 1 && Random.Range(0, 1) > isHitRate)          //如果本次攻击有几率命中且本次攻击没有命中则返回
        {
            return(default(Result));
        }
        isHitRate = 1;
        float baseDamage = 0;

        //根据攻击防御计算初步的基础伤害
        switch (from.hurtType)
        {
        case EnumHurtType.Magic:
        {
            float hurtRate    = 1 + from.attributeState.MagicAttacking * from.MagicAttackFactor.IncreaseRatioInjuryFactor;     //伤害倍率
            float defenceRate = 1 / (1 + to.MagicResistance * magicDefenseFactor.CoefficientRatioReducingDamageFactor);        //减伤倍率
            float baseHurt    = from.thisUsedMana * from.attributeState.BaseMagicDamage / 25;
            float otherHurt   = (from.attributeState.MagicAttacking - to.MagicResistance) * 0.1f;
            otherHurt  = Mathf.Clamp(otherHurt, 0, float.MaxValue);
            baseDamage = (baseHurt * defenceRate + otherHurt) * hurtRate;
            //如果是信仰系魔法还要计算信仰差值.....
            //暂时空
        }
        break;

        case EnumHurtType.PhysicSkill:
        case EnumHurtType.NormalAction:
        {
            float hurtExempt = to.Quick * physicDefenseFactor.ImmunityInjury;                                                     //额外豁免=敏捷*额外豁免系数
            float baseHurt   = from.attributeState.BasePhysicDamage - to.BasePhysicDefense - hurtExempt;                          //基础伤害值= 装备基础伤害-装备基础护甲-额外豁免
            baseHurt = Mathf.Clamp(baseHurt, 0, float.MaxValue);                                                                  //如果小于0则取制为0
            float minHurt         = from.attributeState.Quick * from.PhysicAttackFactor.MinimumDamageFactor;                      //最低伤害=敏捷*最低伤害系数
            float baseDefHurtRate = 1 / (1 + physicDefenseFactor.CoefficientRatioReducingDamageFactor * to.PhysicsResistance);    //受到伤害倍率= 1/(1+减伤倍率系数*防御力)
            float baseHurtRate    = 1 + from.attributeState.PhysicsAttacking * from.PhysicAttackFactor.IncreaseRatioInjuryFactor; //伤害倍率=1+物理攻击力*增伤倍率系数
            baseDamage = (baseHurt * baseDefHurtRate + minHurt) * baseHurtRate;                                                   //根据公式计算出的最初伤害 = (伤害基础值*受伤害倍率+最低伤害值)*伤害倍率
        }
        break;
        }
        //计算暴击
        float isCrit = from.attributeState.CritRate;

        if (from.hurtType != EnumHurtType.Magic && isHitRate >= 1 && Random.Range(0f, 1f) < isCrit)//如果命中并且本次攻击随机到了暴击概率阶段
        {
            calculateHurtResult.IsCrit = true;
            float critDamageRatio = from.attributeState.CritDamageRatio - to.CriticalDef;
            critDamageRatio = Mathf.Clamp(critDamageRatio, 0.2f, 10);//将暴击倍率倍率范围限定在0.2到10之间,也就是有可能暴击伤害可能会更低
            baseDamage     *= critDamageRatio;
        }
        //计算格挡
        float isEquipBlock = to.EquipBlock;

        if (isHitRate >= 1 && Random.Range(0f, 1f) < isEquipBlock)//如果命中并且本次随机到了格挡概率阶段
        {
            baseDamage *= 0.7f;
        }
        //计算浮动之
        float hurtDrift = Random.Range(1f, 1.15f);

        baseDamage *= hurtDrift;
        //附加或倍率等处理
        //.......
        to.HP -= baseDamage;

        calculateHurtResult.hurtRate = baseDamage / maxHP;
        calculateHurtResult.hurt     = baseDamage;
        if (from.statusLevelDataInfos != null && from.statusLevelDataInfos.Length > 0)
        {
            float specialRate = from.attributeState.EffectAffine - to.AbnormalStateResistance;
            List <StatusDataInfo.StatusLevelDataInfo> tempStatusLevelDataInfos = new List <StatusDataInfo.StatusLevelDataInfo>();
            foreach (StatusDataInfo.StatusLevelDataInfo tempStatusLevelDataInfo in from.statusLevelDataInfos)
            {
                float tempSpecialRate = Random.Range(0, 100);
                if (tempSpecialRate < specialRate)
                {
                    tempStatusLevelDataInfos.Add(tempStatusLevelDataInfo);
                }
            }
            calculateHurtResult.statusDatas = tempStatusLevelDataInfos.ToArray();
        }
        else
        {
            calculateHurtResult.statusDatas = new StatusDataInfo.StatusLevelDataInfo[0];
        }
        return(calculateHurtResult);
    }