Some Skill Updates
Updated Axe Boomerange and Power Swing skill ratio formulas - Fixes bugreport:7937 - Updated Power Swing Stun rate Updated Triangle Shot skill ratio formula - Fixes bugreport:7936 Updated Overbrand skill ratio formulas - Fixes bugreport:7938 Fixed Hundred Spear activating Spear Boomerang twice - Fixes bugreport:7899 Thanks to reineil for all the reports. Re-added Magic Crasher fix for attack formula - Fixes bugreport:7869 Follow up to 5e3bb8a - Revert changes to attacker card fixing
This commit is contained in:
parent
1a73141ff8
commit
7301278987
@ -1643,11 +1643,13 @@ static int battle_calc_base_damage(struct status_data *status, struct weapon_atk
|
||||
|
||||
//Finally, add baseatk
|
||||
if(flag&4)
|
||||
damage += status->matk_min;
|
||||
#ifdef RENEWAL
|
||||
else if(flag&32)
|
||||
damage += status->matk_min + status->batk;
|
||||
#else
|
||||
damage += status->matk_min;
|
||||
#endif
|
||||
else if(flag&32)
|
||||
damage += status->matk_min;
|
||||
else
|
||||
damage += status->batk;
|
||||
|
||||
@ -2591,9 +2593,9 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
|
||||
i = (is_attack_critical(wd, src, target, skill_id, skill_lv, false)?1:0)|
|
||||
(is_skill_using_arrow(src, skill_id)?2:0)|
|
||||
(skill_id == HW_MAGICCRASHER?4:0)|
|
||||
(!skill_id && sc && sc->data[SC_CHANGE]?4:0)|
|
||||
(skill_id == MO_EXTREMITYFIST?8:0)|
|
||||
(sc && sc->data[SC_WEAPONPERFECTION]?8:0);
|
||||
(sc && sc->data[SC_WEAPONPERFECTION]?8:0)|
|
||||
(!skill_id && sc && sc->data[SC_CHANGE]?32:0);
|
||||
if (is_skill_using_arrow(src, skill_id) && sd)
|
||||
switch(sd->status.weapon) {
|
||||
case W_BOW:
|
||||
@ -3218,7 +3220,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
//NOTE: Their's some other factors that affects damage, but not sure how exactly. Will recheck one day. [Rytech]
|
||||
break;
|
||||
case NC_AXEBOOMERANG:
|
||||
skillratio += 60 + 40 * skill_lv;
|
||||
skillratio += (skill_lv * 50) + 250;
|
||||
if( sd ) {
|
||||
short index = sd->equip_index[EQI_HAND_R];
|
||||
if( index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON )
|
||||
@ -3226,9 +3228,10 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
}
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case NC_POWERSWING:
|
||||
skillratio += 80 + 20 * skill_lv + sstatus->str + sstatus->dex;
|
||||
case NC_POWERSWING: // According to current sources, only the str + dex gets modified by level [Akinari]
|
||||
skillratio += sstatus->str + sstatus->dex;
|
||||
RE_LVL_DMOD(100);
|
||||
skillratio += 300 + 100 * skill_lv;
|
||||
break;
|
||||
case NC_AXETORNADO:
|
||||
skillratio += 100 + 100 * skill_lv + sstatus->vit;
|
||||
@ -3238,7 +3241,8 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
skillratio += 100 * skill_lv;
|
||||
break;
|
||||
case SC_TRIANGLESHOT:
|
||||
skillratio += 270 + 30 * skill_lv;
|
||||
skillratio += ((skill_lv - 1) * (sstatus->agi / 2)) + 300;
|
||||
RE_LVL_DMOD(120);
|
||||
break;
|
||||
case SC_FEINTBOMB:
|
||||
skillratio += (skill_lv + 1) * (sstatus->dex / 2) * (sd?(sd->status.job_level / 10):5);
|
||||
@ -3281,16 +3285,15 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case LG_OVERBRAND:
|
||||
skillratio = 400 * skill_lv + (pc_checkskill(sd,CR_SPEARQUICKEN) * 30);
|
||||
skillratio = 200 * skill_lv + (pc_checkskill(sd,CR_SPEARQUICKEN) * 50);
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case LG_OVERBRAND_BRANDISH:
|
||||
skillratio = 300 * skill_lv + (2 * (sstatus->str + sstatus->dex) / 3);
|
||||
skillratio = 100 * skill_lv + (sstatus->str + sstatus->dex);
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case LG_OVERBRAND_PLUSATK:
|
||||
skillratio = 150 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
case LG_OVERBRAND_PLUSATK: // Only Piercing and Swing damage get RE_LVL_DMOD bonus damage
|
||||
skillratio = (100 * skill_lv) + rnd()%90 + 10;
|
||||
break;
|
||||
case LG_RAYOFGENESIS:
|
||||
skillratio = 300 + 300 * skill_lv;
|
||||
@ -4316,7 +4319,15 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
}
|
||||
|
||||
#ifdef RENEWAL
|
||||
// In Renewal we only cardfix to the weapon and equip ATK
|
||||
if (sd) { //monsters, homuns and pets have their damage computed directly
|
||||
//Card Fix for attacker (sd), 2 is added to the "left" flag meaning "attacker cards only"
|
||||
wd.weaponAtk += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.weaponAtk, 2, wd.flag);
|
||||
wd.equipAtk += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.equipAtk, 2, wd.flag);
|
||||
if( is_attack_left_handed(src, skill_id )) {
|
||||
wd.weaponAtk2 += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.weaponAtk2, 3, wd.flag);
|
||||
wd.equipAtk2 += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.equipAtk2, 3, wd.flag);
|
||||
}
|
||||
wd.damage = wd.statusAtk + wd.weaponAtk + wd.equipAtk + wd.masteryAtk;
|
||||
wd.damage2 = wd.statusAtk2 + wd.weaponAtk2 + wd.equipAtk2 + wd.masteryAtk2;
|
||||
}
|
||||
@ -4365,10 +4376,12 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
ATK_ADD(wd.damage, wd.damage2, 10*sd->status.inventory[index].refine);
|
||||
}
|
||||
|
||||
#ifndef RENEWAL
|
||||
//Card Fix for attacker (sd), 2 is added to the "left" flag meaning "attacker cards only"
|
||||
wd.damage += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.damage, 2, wd.flag);
|
||||
if( is_attack_left_handed(src, skill_id ))
|
||||
wd.damage2 += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.damage2, 3, wd.flag);
|
||||
#endif
|
||||
}
|
||||
|
||||
// final attack bonuses that aren't affected by cards
|
||||
|
@ -1275,9 +1275,9 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
|
||||
sc_start(src,bl, SC_FREEZING, 20 + 10 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
break;
|
||||
case NC_POWERSWING:
|
||||
sc_start(src,bl, SC_STUN, 5*skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
status_change_start(src,bl,SC_STUN,1000,skill_lv,0,0,0,skill_get_time(skill_id, skill_lv),10);
|
||||
if( rnd()%100 < 5*skill_lv )
|
||||
skill_castend_damage_id(src, bl, NC_AXEBOOMERANG, pc_checkskill(sd, NC_AXEBOOMERANG), tick, 1);
|
||||
skill_castend_damage_id(src, bl, NC_AXEBOOMERANG, sd?pc_checkskill(sd, NC_AXEBOOMERANG):1, tick, 1);
|
||||
break;
|
||||
case GC_WEAPONCRUSH:
|
||||
skill_castend_nodamage_id(src,bl,skill_id,skill_lv,tick,BCT_ENEMY);
|
||||
@ -3400,14 +3400,6 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
|
||||
map_foreachinrange(skill_area_sub, target, skill_get_splash(skl->skill_id, skl->skill_lv), BL_CHAR,
|
||||
src, skl->skill_id, skl->skill_lv, 0, skl->flag|1|BCT_ENEMY, skill_castend_damage_id);
|
||||
break;
|
||||
case RK_HUNDREDSPEAR:
|
||||
if(src->type == BL_PC) {
|
||||
int skill_lv = pc_checkskill((struct map_session_data *)src,KN_SPEARBOOMERANG);
|
||||
if(skill_lv > 0)
|
||||
skill_attack(BF_WEAPON,src,src,target,KN_SPEARBOOMERANG,skill_lv,tick,skl->flag);
|
||||
} else
|
||||
skill_attack(BF_WEAPON,src,src,target,KN_SPEARBOOMERANG,1,tick,skl->flag);
|
||||
break;
|
||||
case CH_PALMSTRIKE:
|
||||
{
|
||||
struct status_change* tsc = status_get_sc(target);
|
||||
@ -4329,11 +4321,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
case RK_HUNDREDSPEAR:
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
if(rnd()%100 < (10 + 3*skill_lv)) {
|
||||
if( !sd || pc_checkskill(sd,KN_SPEARBOOMERANG) == 0 )
|
||||
break; // Spear Boomerang auto cast chance only works if you have mastered Spear Boomerang.
|
||||
int skill_req = sd?pc_checkskill(sd,KN_SPEARBOOMERANG):1;
|
||||
if( !skill_req )
|
||||
break; // Spear Boomerang auto cast chance only works if you have Spear Boomerang.
|
||||
skill_blown(src,bl,6,-1,0);
|
||||
skill_addtimerskill(src,tick+800,bl->id,0,0,skill_id,skill_lv,BF_WEAPON,flag);
|
||||
skill_castend_damage_id(src,bl,KN_SPEARBOOMERANG,1,tick,0);
|
||||
skill_castend_damage_id(src,bl,KN_SPEARBOOMERANG,skill_req,tick,0);
|
||||
}
|
||||
break;
|
||||
case RK_CRUSHSTRIKE:
|
||||
|
Loading…
x
Reference in New Issue
Block a user