Crown The Empire
New member
- Messages
- 14
- Points
- 0
Old damage formula (before the 175/60 update, implemented December 10, 2014 in iRO):
Damage = [(CurrHP ÷ 50) + (MaxSP ÷ 4)] × (SkillLv × BaseLv ÷ 150) × (95 + DragonTraining_Lv × 5)%
New damage formula (after the 175/60 update):
Damage = [(CurrHP ÷ 50) + (MaxSP ÷ 4)] × (SkillLv × BaseLv ÷ 150) × (95 + DragonTraining_Lv × 5)% × (100 + Ranged Damage Modifiers)% x (Elemental Modifiers)%
battle.c (Hercules)
case RK_DRAGONBREATH:
case RK_DRAGONBREATH_WATER:
md.damage = ((status_get_hp(src) / 50) + (status_get_max_sp(src) / 4)) * skill_lv;
RE_LVL_MDMOD(150);
if (sd) md.damage = md.damage * (95 + 5 * pc->checkskill(sd,RK_DRAGONTRAINING)) / 100;
md.flag |= BF_LONG|BF_WEAPON;
break;
battle.ccp (rAthena)
case RK_DRAGONBREATH:
case RK_DRAGONBREATH_WATER:
{
int damagevalue = (sstatus->hp / 50 + status_get_max_sp(src) / 4) * skill_lv;
if(status_get_lv(src) > 100)
damagevalue = damagevalue * status_get_lv(src) / 150;
if(sd)
damagevalue = damagevalue * (100 + 5 * (pc_checkskill(sd,RK_DRAGONTRAINING) - 1)) / 100;
ATK_ADD(wd->damage, wd->damage2, damagevalue);
#ifdef RENEWAL
ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue);
#endif
wd->flag |= BF_LONG;
}
skill.c (Hercules)
case RK_DRAGONBREATH_WATER:
case RK_DRAGONBREATH:
{
struct status_change *tsc = NULL;
if( (tsc = status->get_sc(bl)) && (tsc->data[SC_HIDING] )) {
clif->skill_nodamage(src,src,skill_id,skill_lv,1);
} else
skill->attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
}
skill.cpp (rAthena)
case RK_DRAGONBREATH_WATER:
case RK_DRAGONBREATH:
if( tsc && tsc->data[SC_HIDING] )
clif_skill_nodamage(src,src,skill_id,skill_lv,1);
else
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
break;
So I think the difference is the new formula takes these range, elemental and racial modifiers into account.
It seems this formula was recently implemented in rAthena (BF_WEAPON TYPE), while Hercules is still using the old formula (BF_MISC TYPE). I have tried to merge rathena's new formula into Hercules, but encountered several problems.
Damage = [(CurrHP ÷ 50) + (MaxSP ÷ 4)] × (SkillLv × BaseLv ÷ 150) × (95 + DragonTraining_Lv × 5)%
New damage formula (after the 175/60 update):
Damage = [(CurrHP ÷ 50) + (MaxSP ÷ 4)] × (SkillLv × BaseLv ÷ 150) × (95 + DragonTraining_Lv × 5)% × (100 + Ranged Damage Modifiers)% x (Elemental Modifiers)%
battle.c (Hercules)
case RK_DRAGONBREATH:
case RK_DRAGONBREATH_WATER:
md.damage = ((status_get_hp(src) / 50) + (status_get_max_sp(src) / 4)) * skill_lv;
RE_LVL_MDMOD(150);
if (sd) md.damage = md.damage * (95 + 5 * pc->checkskill(sd,RK_DRAGONTRAINING)) / 100;
md.flag |= BF_LONG|BF_WEAPON;
break;
battle.ccp (
case RK_DRAGONBREATH:
case RK_DRAGONBREATH_WATER:
{
int damagevalue = (sstatus->hp / 50 + status_get_max_sp(src) / 4) * skill_lv;
if(status_get_lv(src) > 100)
damagevalue = damagevalue * status_get_lv(src) / 150;
if(sd)
damagevalue = damagevalue * (100 + 5 * (pc_checkskill(sd,RK_DRAGONTRAINING) - 1)) / 100;
ATK_ADD(wd->damage, wd->damage2, damagevalue);
#ifdef RENEWAL
ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue);
#endif
wd->flag |= BF_LONG;
}
skill.c (Hercules)
case RK_DRAGONBREATH_WATER:
case RK_DRAGONBREATH:
{
struct status_change *tsc = NULL;
if( (tsc = status->get_sc(bl)) && (tsc->data[SC_HIDING] )) {
clif->skill_nodamage(src,src,skill_id,skill_lv,1);
} else
skill->attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
}
skill.cpp (
case RK_DRAGONBREATH_WATER:
case RK_DRAGONBREATH:
if( tsc && tsc->data[SC_HIDING] )
clif_skill_nodamage(src,src,skill_id,skill_lv,1);
else
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
break;
So I think the difference is the new formula takes these range, elemental and racial modifiers into account.
It seems this formula was recently implemented in rAthena (BF_WEAPON TYPE), while Hercules is still using the old formula (BF_MISC TYPE). I have tried to merge rathena's new formula into Hercules, but encountered several problems.
Last edited by a moderator: