Browse Source

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

Akinari1087 11 years ago
parent
commit
7301278987
2 changed files with 32 additions and 27 deletions
  1. 26 13
      src/map/battle.c
  2. 6 14
      src/map/skill.c

+ 26 - 13
src/map/battle.c

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

+ 6 - 14
src/map/skill.c

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