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:
Akinari1087 2013-08-01 12:38:52 -04:00
parent 1a73141ff8
commit 7301278987
2 changed files with 32 additions and 27 deletions

View File

@ -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

View File

@ -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: