瀏覽代碼

Fix card damage fixing - Fixes bugreport:7935
Fix GVG and Card reductions for skills that use separate damage calc functions
Removed some unnecessary code causing attack underflow in homunculus - Fixes bugreport:7925
Update Feint Bomb damage formula to 2011 rebalance - Concering bugreport:7912
Update Siren's Voice to 2011 rebalance formulas - Fixes bugreport:7878

Akinari1087 11 年之前
父節點
當前提交
1a73141ff8
共有 3 個文件被更改,包括 55 次插入50 次删除
  1. 45 39
      src/map/battle.c
  2. 7 3
      src/map/skill.c
  3. 3 8
      src/map/status.c

+ 45 - 39
src/map/battle.c

@@ -2411,7 +2411,6 @@ struct Damage battle_calc_damage_parts(struct Damage wd, struct block_list *src,
 	struct status_data *sstatus = status_get_status_data(src);
 	struct status_data *tstatus = status_get_status_data(target);
 	struct map_session_data *sd = BL_CAST(BL_PC, src);
-	struct map_session_data *tsd = BL_CAST(BL_PC, target);
 
 	int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, false);
 	int left_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_L, false);
@@ -2448,17 +2447,6 @@ struct Damage battle_calc_damage_parts(struct Damage wd, struct block_list *src,
 
 	wd = battle_calc_attack_masteries(wd, src, target, skill_id, skill_lv);
 
-	if(tsd) {// Card Fix for target
-		wd.weaponAtk += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.weaponAtk, is_attack_left_handed(src, skill_id), wd.flag);
-		wd.weaponAtk2 += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.weaponAtk2, is_attack_left_handed(src, skill_id), 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, is_attack_left_handed(src, skill_id), 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, is_attack_left_handed(src, skill_id), wd.flag);
-
-		wd.masteryAtk += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), ELE_NONE, ELE_NONE, wd.masteryAtk, is_attack_left_handed(src, skill_id), wd.flag);
-		wd.masteryAtk2 += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), ELE_NONE, ELE_NONE, wd.masteryAtk2, is_attack_left_handed(src, skill_id), wd.flag);
-	}
-
 	wd.damage = 0;
 	wd.damage2 = 0;
 
@@ -3253,7 +3241,8 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
 			skillratio += 270 + 30 * skill_lv;
 			break;
 		case SC_FEINTBOMB:
-			skillratio += 100 + 100 * skill_lv;
+			skillratio += (skill_lv + 1) * (sstatus->dex / 2) * (sd?(sd->status.job_level / 10):5);
+			RE_LVL_DMOD(120);
 			break;
 		case LG_CANNONSPEAR:// Stimated formula. Still need confirm it.
 			skillratio += -100 + (50  + sstatus->str) * skill_lv;
@@ -4327,23 +4316,10 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
 		}
 	
 #ifdef RENEWAL
-		//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);
-		}
-	
-		// final attack bonuses that aren't affected by cards
-		wd = battle_attack_sc_bonus(wd, src, skill_id);
-
 		if (sd) { //monsters, homuns and pets have their damage computed directly
 			wd.damage = wd.statusAtk + wd.weaponAtk + wd.equipAtk + wd.masteryAtk;
 			wd.damage2 = wd.statusAtk2 + wd.weaponAtk2 + wd.equipAtk2 + wd.masteryAtk2;
 		}
-#else 
-		wd = battle_attack_sc_bonus(wd, src, skill_id);
 #endif
 
 		// check if attack ignores DEF
@@ -4389,16 +4365,26 @@ 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
 	}
 
-	if(tsd) // Card Fix for target (tsd), 2 is not added to the "left" flag meaning "target 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, is_attack_left_handed(src, skill_id), wd.flag);
+	// final attack bonuses that aren't affected by cards
+	wd = battle_attack_sc_bonus(wd, src, skill_id);
+
+	if(tsd) { // Card Fix for target (tsd), 2 is not added to the "left" flag meaning "target cards only"
+		switch(skill_id) { // These skills will do a card fix later
+			case CR_ACIDDEMONSTRATION:
+			case NJ_ISSEN:
+			case ASC_BREAKER:
+			case KO_HAPPOKUNAI:
+				break;
+			default:
+				wd.damage += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.damage, is_attack_left_handed(src, skill_id), wd.flag);
+		}
+	}
 
 	// forced to neutral skills [helvetica]
 	// skills forced to neutral gain benefits from weapon element
@@ -4427,10 +4413,18 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
 
 	wd = battle_calc_attack_left_right_hands(wd, src, target, skill_id, skill_lv);
 
-	wd = battle_calc_attack_gvg_bg(wd, src, target, skill_id, skill_lv);
-
 	wd = battle_calc_weapon_final_atk_modifiers(wd, src, target, skill_id, skill_lv);
 
+	switch(skill_id) { // These skills will do a GVG fix later
+		case CR_ACIDDEMONSTRATION:
+		case NJ_ISSEN:
+		case ASC_BREAKER:
+		case KO_HAPPOKUNAI:
+			return wd;
+		default:
+			wd = battle_calc_attack_gvg_bg(wd, src, target, skill_id, skill_lv);
+	}
+
 	return wd;
 }
 
@@ -4976,7 +4970,13 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 			}
 		}
 #ifdef RENEWAL
-		ad.damage += battle_calc_cardfix(BF_MAGIC, src, target, nk, s_ele, 0, ad.damage, 0, ad.flag);
+		switch(skill_id) { // These skills will do a card fix later
+			case CR_ACIDDEMONSTRATION:
+			case ASC_BREAKER:
+				break;
+			default:
+				ad.damage += battle_calc_cardfix(BF_MAGIC, src, target, nk, s_ele, 0, ad.damage, 0, ad.flag);
+		}
 #endif
 		if(sd) {
 			//Damage bonuses
@@ -5078,11 +5078,17 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 	if (flag.infdef && ad.damage)
 		ad.damage = ad.damage>0?1:-1;
 
-	ad.damage=battle_calc_damage(src,target,&ad,ad.damage,skill_id,skill_lv);
-	if( map_flag_gvg2(target->m) )
-		ad.damage=battle_calc_gvg_damage(src,target,ad.damage,ad.div_,skill_id,skill_lv,ad.flag);
-	else if( map[target->m].flag.battleground )
-		ad.damage=battle_calc_bg_damage(src,target,ad.damage,ad.div_,skill_id,skill_lv,ad.flag);
+	switch(skill_id) { // These skills will do a GVG fix later
+		case CR_ACIDDEMONSTRATION:
+		case ASC_BREAKER:
+			return ad;
+		default:
+			ad.damage=battle_calc_damage(src,target,&ad,ad.damage,skill_id,skill_lv);
+			if( map_flag_gvg2(target->m) )
+				ad.damage=battle_calc_gvg_damage(src,target,ad.damage,ad.div_,skill_id,skill_lv,ad.flag);
+			else if( map[target->m].flag.battleground )
+				ad.damage=battle_calc_bg_damage(src,target,ad.damage,ad.div_,skill_id,skill_lv,ad.flag);
+	}
 
 	switch( skill_id ) { /* post-calc modifiers */
 		case SO_VARETYR_SPEAR: { // Physical damage.
@@ -5224,7 +5230,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
 		{
 			struct Damage atk = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0);
 			struct Damage matk = battle_calc_magic_attack(src, target, skill_id, skill_lv, 0);
-			md.damage = 7 * ((atk.damage/skill_lv + matk.damage/skill_lv)  * tstatus->vit / 100 );
+			md.damage = 7 * ((atk.damage/skill_lv + matk.damage/skill_lv) * tstatus->vit / 100 );
 			
 			// AD benefits from endow/element but damage is forced back to neutral
 			battle_attr_fix(src, target, md.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv);

+ 7 - 3
src/map/skill.c

@@ -8694,16 +8694,20 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case WM_SIRCLEOFNATURE:
 		flag |= BCT_SELF|BCT_PARTY|BCT_GUILD;
 	case WM_VOICEOFSIREN:
-		if( skill_id != WM_SIRCLEOFNATURE )
+	{
+		int rate = 100;
+		if( skill_id != WM_SIRCLEOFNATURE ) {
+			rate = 6 * skill_lv + (sd ? pc_checkskill(sd,WM_LESSON)*2 + sd->status.job_level/2 : 0 );
 			flag &= ~BCT_SELF;
+		}
 		if( flag&1 ) {
-			sc_start2(src,bl,type,(skill_id==WM_VOICEOFSIREN)?20+10*skill_lv:100,skill_lv,(skill_id==WM_VOICEOFSIREN)?src->id:0,skill_get_time(skill_id,skill_lv));
+			sc_start2(src,bl,type,rate,skill_lv,(skill_id==WM_VOICEOFSIREN)?src->id:0,skill_get_time(skill_id,skill_lv));
 		} else {
 			map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),(skill_id==WM_VOICEOFSIREN)?BL_CHAR|BL_SKILL:BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 		}
 		break;
-
+	}
 	case WM_GLOOMYDAY:
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 		if( dstsd && ( pc_checkskill(dstsd,KN_BRANDISHSPEAR) || pc_checkskill(dstsd,LK_SPIRALPIERCE) ||

+ 3 - 8
src/map/status.c

@@ -3735,14 +3735,6 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
 				status->lhw.atk2= status_calc_watk(bl, sc, b_status->lhw.atk2);
 			}
 		}
-
-		if( bl->type&BL_HOM )
-		{
-			status->rhw.atk += (status->dex - b_status->dex);
-			status->rhw.atk2 += (status->str - b_status->str);
-			if( status->rhw.atk2 < status->rhw.atk )
-				status->rhw.atk2 = status->rhw.atk;
-		}
 	}
 
 	if(flag&SCB_HIT) {
@@ -6476,6 +6468,9 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
 		case SC_PARALYSIS:
 			tick_def2 = (status->vit + status->luk)*50;
 			break;
+		case SC_VOICEOFSIREN:
+			tick_def2 = (status_get_lv(bl) * 100) + ((bl->type == BL_PC)?((TBL_PC*)bl)->status.job_level : 0);
+			break;
 		default:
 			//Effect that cannot be reduced? Likely a buff.
 			if (!(rnd()%10000 < rate))