using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace YLBattle
{
///
/// 战斗公式
///
public class BattleFomula
{
///
/// buff治疗公式
///
/// 目标对象
/// 治疗值
public static float buffCure(float cure)
{
return cure;
}
///
/// 治疗量计算
///
/// 技能适配器
/// 技能id1
/// 技能等级
/// 施法者
/// 目标
/// 实际治疗
public static float Cure(ISkillAdapter ada, string skillID, int level, LogicFighter caster, LogicFighter target)
{
int dianshu = int.Parse(ada.GetSkillProperty(skillID, ESkillProperty.ESKILL_PROPERTY_parmValue, level));
string proValue = ada.GetSkillProperty(skillID, ESkillProperty.ESKILL_PROPERTY_proValue, level);
if (proValue.IndexOf('F') != -1)
{
proValue = proValue.Substring(0, proValue.IndexOf('F'));
}
int bili = int.Parse(proValue);
float maxHp = target.GetProperty(EBattleProperty.HPMAX);
float result = dianshu + maxHp * bili / 100;
LogHelper.Log(String.Format(target.ID() + " 恢复血量:skillID:{0},CastarPlayerTID:{1},PlayerLevel:{2}:目标MAXHP:{3},增加血量值{4}",
skillID, caster.TID(), caster.Level, maxHp, (int)result));
return result;
}
///
/// 物理(普攻)伤害
///
/// 目标
/// 伤害值
/// 公式伤害
public static float PhyDamage(LogicFighter caster, LogicFighter target, int dianshu, float phypower, bool iscritical = false, string skillid = "")
{
//Debug.LogError(caster.ID() + " attack....." + skillID);
//2017-09-19版,公式
//角色属性:战斗力、生命值、能量值、物理攻击、法术强度、护甲、魔抗、攻速、暴击
//A*100/(D+100)+a*100/(d+100)=对敌方造成的伤害(战斗公式)
//A=己方物理攻击 D=敌方护甲 a=己方法术强度 d=敌方魔抗
//己方物理攻击*100/(敌方护甲+100)+己方法术强度*100/(敌方魔抗+100)=伤害
float casterWulishanghai = dianshu + phypower;
float casterFashu = caster.GetProperty(EBattleProperty.MAGICSTRENGTH);///己方法术强度
float targethujia = target.GetProperty(EBattleProperty.DEFENSE);//敌方护甲
float targetMokang = target.GetProperty(EBattleProperty.MAGICFORCE);//敌方魔抗
float result = casterWulishanghai * 100 / (targethujia + 100) + casterFashu * 100 / (targetMokang + 100);
//Debug.Log(String.Format(target.ID() + " 受到物理伤害:skillID:{0},PlayerTID:{1},PlayerLevel:{2}:({3}+{4}) * 100 / ({5} + 100) + {6} * 100 / ({7} + 100)={8}",
// skillid, caster.TID(), caster.Level, dianshu, phypower, targethujia, casterFashu, targetMokang, (int)result));
if (iscritical)
{
result = BattleFomula.CritticalDmage(result);
}
return result;
}
///
/// 魔法伤害
///
/// 目标
/// 伤害值
/// 公式伤害
public static float MagicDamage(LogicFighter caster, LogicFighter target, int dianshu, float magpower, bool iscritical = false, string skillid = "")
{
//2017-09-19版,公式
//角色属性:战斗力、生命值、能量值、物理攻击、法术强度、护甲、魔抗、攻速、暴击
//A*100/(D+100)+a*100/(d+100)=对敌方造成的伤害(战斗公式)
//A=己方物理攻击 D=敌方护甲 a=己方法术强度 d=敌方魔抗
//己方物理攻击*100/(敌方护甲+100)+己方法术强度*100/(敌方魔抗+100)=伤害
float casterWulishanghai = caster.GetProperty(EBattleProperty.ATTACK);///己方物理攻击
float casterFashu = dianshu + magpower;///己方法术强度
float targethujia = target.GetProperty(EBattleProperty.DEFENSE);//敌方护甲
float targetMokang = target.GetProperty(EBattleProperty.MAGICFORCE);//敌方魔抗
float result = casterWulishanghai * 100 / (targethujia + 100) + casterFashu * 100 / (targetMokang + 100);
// Debug.Log(String.Format(target.ID() + " 受到魔法伤害:skillID:{0},PTID:{1},playerLevl:{2}: {3} * 100 / ( {4} + 100) + ({5}+{6}) * 100 / ( {7} + 100))={8}",
//skillid, caster.TID(), caster.Level, casterWulishanghai, targethujia, dianshu, magpower, targetMokang, (int)result));
if (iscritical)
{
result = BattleFomula.CritticalDmage(result);
}
return result * (iscritical ? 2 : 1);
}
///
/// 魔法暴击伤害公式
///
/// 伤害值
/// 换算暴击后数值
public static float CritticalDmage(float damage)
{
//2017-11-08 暴击倍率=2 产生暴击率则伤害翻倍
return damage * BattleConst.BattleCriticalDamageRate;
}
///
/// 暴击伤害
///
/// 施法者
/// 伤害值
/// 是否暴击
public static bool CriticalRate(LogicFighter caster)
{
/*
* ****暴击倍率默认为【2】
* random 40 >30暴率率。。。。。100=100*2
*/
int rateResult = UnityEngine.Random.Range(1, 100);
float critical = caster.GetProperty(EBattleProperty.CRITICALPROB);
return rateResult <= critical;
}
}
}