public static SkillDamageType GetSkillDamageType(string strtype) { SkillDamageType type = SkillDamageType.Target; switch (strtype.ToLower()) { case "target": type = SkillDamageType.Target; break; case "targetarea": type = SkillDamageType.TargetArea; break; case "casterarea": type = SkillDamageType.CasterArea; break; case "casterfront": type = SkillDamageType.CasterFront; break; } return(type); }
public static float CalcDamage(SkillDamageType type, Character chara, float skillDamageFactor, float baseSkillDamage) { float damage = 0; switch (type) { case SkillDamageType.ATK: { damage = Mathf.FloorToInt(Clamp(chara.ATK) * skillDamageFactor + baseSkillDamage); } break; case SkillDamageType.HP: { damage = Mathf.FloorToInt(Clamp(chara.MaxHp) * skillDamageFactor + baseSkillDamage); } break; case SkillDamageType.AS: { damage = Mathf.FloorToInt(Clamp(chara.AS) * skillDamageFactor + baseSkillDamage); } break; case SkillDamageType.DEF: { damage = Mathf.FloorToInt(Clamp(chara.DEF) * skillDamageFactor + baseSkillDamage); } break; default: { damage = baseSkillDamage; } break; } return damage; }
void InitDamage() { string str = skilldata.Damage; JsonData[] json = JsonMapper.ToObject<JsonData[]>(str); int type = (int)json[0]; skillDamType = (SkillDamageType)type; baseSkillDamage = (float)json[1]; baseSkillDamage = baseSkillDamage + lv * skilldata.GrowDamage; skillDamageFactor = (float)json[2]; }
public static int CalcImpactDamage(CharacterInfo sender, CharacterInfo receiver, SkillDamageType damageType, ElementDamageType elementType, float attackFactor, int damageFromConfig, out bool isCritical) { isCritical = false; if (null == sender || null == receiver) { return(damageFromConfig); } int ad = sender.GetActualProperty().AttackBase; int adp = receiver.GetActualProperty().ADefenceBase; int mdp = receiver.GetActualProperty().MDefenceBase; int level = receiver.GetLevel(); float fd = sender.GetActualProperty().FireDamage; float fe = receiver.GetActualProperty().FireERD; float id = sender.GetActualProperty().IceDamage; float ie = receiver.GetActualProperty().IceERD; float pd = sender.GetActualProperty().PoisonDamage; float pe = receiver.GetActualProperty().PoisonERD; float c = sender.GetActualProperty().Critical; float cp = sender.GetActualProperty().CriticalPow; float cbhp = sender.GetActualProperty().CriticalBackHitPow; float ccp = sender.GetActualProperty().CriticalCrackPow; float sd = sender.GetMovementStateInfo().GetFaceDir(); float rd = receiver.GetMovementStateInfo().GetFaceDir(); if (level <= 0) { return(damageFromConfig); } float baseDamage = 0f; float elementDamage = 0f; float normalDamage = 0f; float skillDamage = 0f; float totalDamage = damageFromConfig; /// base if (SkillDamageType.DC_Ad == damageType) { if (IsInvalid(adp, level)) { baseDamage = 0; } else { baseDamage = ad * (1 - (adp / (float)level) / (float)(10 + Math.Abs(adp) / (float)level)); } } else if (SkillDamageType.DC_Ap == damageType) { if (IsInvalid(mdp, level)) { baseDamage = 0; } else { baseDamage = ad * (1 - (mdp / (float)level) / (float)(10 + Math.Abs(mdp) / (float)level)); } } /// element if (ElementDamageType.DC_Fire == elementType) { if (IsInvalid(fe, level)) { elementDamage = 0; } else { elementDamage = fd * (1 - (fe / (float)level) / (float)(10 + Math.Abs(fe) / (float)level)); } } else if (ElementDamageType.DC_Ice == elementType) { if (IsInvalid(ie, level)) { elementDamage = 0; } else { elementDamage = id * (1 - (ie / (float)level) / (float)(10 + Math.Abs(ie) / (float)level)); } } else if (ElementDamageType.DC_Poison == elementType) { if (IsInvalid(pe, level)) { elementDamage = 0; } else { elementDamage = pd * (1 - (pe / (float)level) / (float)(10 + Math.Abs(pe) / (float)level)); } } /// normal normalDamage = (baseDamage + elementDamage) * attackFactor; /// skill if (IsInvalid(adp, level)) { skillDamage = 0; } else { skillDamage = damageFromConfig * (1 - (adp / (float)level) / (float)(10 + Math.Abs(adp) / (float)level)); } /// total totalDamage = normalDamage + skillDamage; /// critical int num = CrossEngineHelper.Random.Next(0, 100); float random = (float)(num * 0.01); if (random < c) { isCritical = true; totalDamage *= cp; } /// check backhit if (IsBackHit(sd, rd)) { totalDamage *= cbhp; } /// ckeck crack if (IsCrack(receiver)) { totalDamage *= ccp; } return((int)totalDamage); }