Bläddra i källkod

* Changed weapon skills to read list_num from the skill_db when calculating damage

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1111 54d463be-8e91-2dee-dedb-b68131a5f0ec
celest 20 år sedan
förälder
incheckning
7fa2d81908
2 ändrade filer med 45 tillägg och 46 borttagningar
  1. 2 0
      Changelog-SVN.txt
  2. 43 46
      src/map/battle.c

+ 2 - 0
Changelog-SVN.txt

@@ -1,6 +1,8 @@
 Date	Added
 
 02/15
+        * Added Wallex's changes for weapon skills to read list_num from the skill_db
+          when calculating damage [celest]
 	* Login / Login SQL: Fixed the EXE-Version check (now it works finally :) [Sirius]
 	* Char SQL: Fixed the '0x2b05' reply to the mapserver (now multi - mapservers works again!)
         * Rewrote skill blocking system that was allowing people to bypass blocking

+ 43 - 46
src/map/battle.c

@@ -620,6 +620,8 @@ static struct Damage battle_calc_pet_weapon_attack(
 	int flag,dmg_lv=0;
 	int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
 	struct status_change *t_sc_data;
+	int div_flag=0;	// 0: total damage is to be divided by div_
+					// 1: damage is distributed,and has to be multiplied by div_ [celest]
 
 	//return前の処理があるので情報出力部のみ変更
 	if( target == NULL || pd == NULL ){ //srcは内容に直接触れていないのでスルーしてみる
@@ -661,7 +663,11 @@ static struct Damage battle_calc_pet_weapon_attack(
 	hitrate=status_get_hit(src) - flee + 80;
 
 	type=0;	// normal
-	div_ = 1; // single attack
+	if (skill_num > 0) {
+		div_ = skill_get_num(skill_num,skill_lv);
+		if (div_ < 1) div_ = 1;	//Avoid the rare case where the db says div_ is 0 and below
+	}
+	else div_ = 1; // single attack
 
 	luk=status_get_luk(src);
 
@@ -735,7 +741,6 @@ static struct Damage battle_calc_pet_weapon_attack(
 				break;
 			case AC_DOUBLE:	// ダブルストレイフィング
 				damage = damage*(180+ 20*skill_lv)/100;
-				div_=2;
 				flag=(flag&~BF_RANGEMASK)|BF_LONG;
 				break;
 			case AC_SHOWER:	// アローシャワー
@@ -750,7 +755,7 @@ static struct Damage battle_calc_pet_weapon_attack(
 				damage = damage*(100+ 10*skill_lv)/100;
 				hitrate = hitrate*(100+5*skill_lv)/100;
 				div_=t_size+1;
-				damage*=div_;
+				div_flag = 1;
 				break;
 			case KN_SPEARSTAB:	// スピアスタブ
 				damage = damage*(100+ 15*skill_lv)/100;
@@ -783,7 +788,6 @@ static struct Damage battle_calc_pet_weapon_attack(
 				break;
 			case AS_SONICBLOW:	// ソニックブロウ
 				damage = damage*(300+ 50*skill_lv)/100;
-				div_=8;
 				break;
 			case TF_SPRINKLESAND:	// 砂まき
 				damage = damage*125/100;
@@ -793,8 +797,7 @@ static struct Damage battle_calc_pet_weapon_attack(
 				break;
 			// 以下MOB
 			case NPC_COMBOATTACK:	// 多段攻撃
-				div_=skill_get_num(skill_num,skill_lv);
-				damage *= div_;
+				div_flag = 1;
 				break;
 			case NPC_RANDOMATTACK:	// ランダムATK攻撃
 				damage = damage*(50+rand()%150)/100;
@@ -842,7 +845,6 @@ static struct Damage battle_calc_pet_weapon_attack(
 				break;
 			case CR_HOLYCROSS:	// ホーリークロス
 				damage = damage*(100+ 35*skill_lv)/100;
-				div_=2;
 				break;
 			case CR_GRANDCROSS:
 				hitrate= 1000000;
@@ -859,7 +861,6 @@ static struct Damage battle_calc_pet_weapon_attack(
 				break;
 			case MO_FINGEROFFENSIVE:	//指弾
 				damage = damage * (125 + 25 * skill_lv) / 100;
-				div_ = 1;
 				flag=(flag&~BF_RANGEMASK)|BF_LONG;   //orn
 				break;
 			case MO_INVESTIGATE:	// 発 勁
@@ -875,7 +876,6 @@ static struct Damage battle_calc_pet_weapon_attack(
 				break;
 			case MO_CHAINCOMBO:	// 連打掌
 				damage = damage*(150+ 50*skill_lv)/100;
-				div_=4;
 				break;
 			case MO_COMBOFINISH:	// 猛龍拳
 				damage = damage*(240+ 60*skill_lv)/100;
@@ -893,14 +893,12 @@ static struct Damage battle_calc_pet_weapon_attack(
 				break;
 			case CH_CHAINCRUSH:	// 連柱崩撃
 				damage = damage*(400+ 100*skill_lv)/100;
-				div_=skill_get_num(skill_num,skill_lv);
 				break;
 			case CH_PALMSTRIKE:	// 猛虎硬派山
 				damage = damage*(200+ 100*skill_lv)/100;
 				break;
 			case LK_SPIRALPIERCE:			/* スパイラルピアース */
 				damage = damage*(100+ 50*skill_lv)/100; //増加量が分からないので適当に
-				div_=5;
 				flag=(flag&~BF_RANGEMASK)|BF_LONG;
 				if(target->type == BL_PC)
 					((struct map_session_data *)target)->canmove_tick = gettick() + 1000;
@@ -921,12 +919,15 @@ static struct Damage battle_calc_pet_weapon_attack(
 				break;
 			case CG_ARROWVULCAN:			/* アローバルカン */
 				damage = damage*(200+100*skill_lv)/100;
-				div_=9;
 				break;
 			case AS_SPLASHER:		/* ベナムスプラッシャー */
 				damage = damage*(200+20*skill_lv)/100;
 				break;
 			}
+			if (div_flag && div_ > 1) {	// [Skotlex]
+				damage *= div_;
+				damage2 *= div_;
+			}
 		}
 
 		if( skill_num!=NPC_CRITICALSLASH ){
@@ -1061,6 +1062,8 @@ static struct Damage battle_calc_mob_weapon_attack(
 	struct status_change *sc_data,*t_sc_data;
 	short *sc_count;
 	short *option, *opt1, *opt2;
+	int div_flag=0;	// 0: total damage is to be divided by div_
+					// 1: damage is distributed,and has to be multiplied by div_ [celest]
 
 	//return前の処理があるので情報出力部のみ変更
 	if( src == NULL || target == NULL || md == NULL ){
@@ -1129,7 +1132,10 @@ static struct Damage battle_calc_mob_weapon_attack(
 	hitrate=status_get_hit(src) - flee + 80;
 
 	type=0;	// normal
-	div_ = 1; // single attack
+	if (skill_num > 0) {
+		div_ = skill_get_num(skill_num,skill_lv);
+		if (div_ < 1) div_ = 1;	//Avoid the rare case where the db says div_ is 0 and below
+	} else div_ = 1; // single attack
 
 	luk=status_get_luk(src);
 
@@ -1230,7 +1236,6 @@ static struct Damage battle_calc_mob_weapon_attack(
 				break;
 			case AC_DOUBLE:	// ダブルストレイフィング
 				damage = damage*(180+ 20*skill_lv)/100;
-				div_=2;
 				flag=(flag&~BF_RANGEMASK)|BF_LONG;
 				break;
 			case AC_SHOWER:	// アローシャワー
@@ -1243,9 +1248,9 @@ static struct Damage battle_calc_mob_weapon_attack(
 				break;
 			case KN_PIERCE:	// ピアース
 				damage = damage*(100+ 10*skill_lv)/100;
-				hitrate=hitrate*(100+5*skill_lv)/100;
-				div_=t_size+1;
-				damage*=div_;
+				hitrate = hitrate*(100+5*skill_lv)/100;
+				div_ = t_size+1;
+				div_flag = 1;
 				break;
 			case KN_SPEARSTAB:	// スピアスタブ
 				damage = damage*(100+ 15*skill_lv)/100;
@@ -1285,7 +1290,6 @@ static struct Damage battle_calc_mob_weapon_attack(
 				break;
 			case AS_SONICBLOW:	// ソニックブロウ
 				damage = damage*(300+ 50*skill_lv)/100;
-				div_=8;
 				break;
 			case TF_SPRINKLESAND:	// 砂まき
 				damage = damage*125/100;
@@ -1295,8 +1299,7 @@ static struct Damage battle_calc_mob_weapon_attack(
 				break;
 			// 以下MOB
 			case NPC_COMBOATTACK:	// 多段攻撃
-				div_=skill_get_num(skill_num,skill_lv);
-				damage *= div_;
+				div_flag = 1;
 				break;
 			case NPC_RANDOMATTACK:	// ランダムATK攻撃
 				damage = damage*(50+rand()%150)/100;
@@ -1344,7 +1347,6 @@ static struct Damage battle_calc_mob_weapon_attack(
 				break;
 			case CR_HOLYCROSS:	// ホーリークロス
 				damage = damage*(100+ 35*skill_lv)/100;
-				div_=2;
 				break;
 			case CR_GRANDCROSS:
 				hitrate= 1000000;
@@ -1361,7 +1363,6 @@ static struct Damage battle_calc_mob_weapon_attack(
 				break;
 			case MO_FINGEROFFENSIVE:	//指弾
 				damage = damage * (125 + 25 * skill_lv) / 100;
-				div_ = 1;
 				flag=(flag&~BF_RANGEMASK)|BF_LONG;   //orn
 				break;
 			case MO_INVESTIGATE:	// 発 勁
@@ -1377,7 +1378,6 @@ static struct Damage battle_calc_mob_weapon_attack(
 				break;
 			case MO_CHAINCOMBO:	// 連打掌
 				damage = damage*(150+ 50*skill_lv)/100;
-				div_=4;
 				break;
 			case BA_MUSICALSTRIKE:	// ミュージカルストライク
 				damage = damage*(60+ 40 * skill_lv)/100;
@@ -1395,14 +1395,12 @@ static struct Damage battle_calc_mob_weapon_attack(
 				break;
 			case CH_CHAINCRUSH:	// 連柱崩撃
 				damage = damage*(400+ 100*skill_lv)/100;
-				div_=skill_get_num(skill_num,skill_lv);
 				break;
 			case CH_PALMSTRIKE:	// 猛虎硬派山
 				damage = damage*(200+ 100*skill_lv)/100;
 				break;
 			case LK_SPIRALPIERCE:			/* スパイラルピアース */
 				damage = damage*(100+ 50*skill_lv)/100; //増加量が分からないので適当に
-				div_=5;
 				flag=(flag&~BF_RANGEMASK)|BF_LONG;
 				if(tsd)
 					tsd->canmove_tick = gettick() + 1000;
@@ -1423,12 +1421,15 @@ static struct Damage battle_calc_mob_weapon_attack(
 				break;
 			case CG_ARROWVULCAN:			/* アローバルカン */
 				damage = damage*(200+100*skill_lv)/100;
-				div_=9;
 				break;
 			case AS_SPLASHER:		/* ベナムスプラッシャー */
 				damage = damage*(200+20*skill_lv)/100;
 				break;
 			}
+			if (div_flag && div_ > 1) {	// [Skotlex]
+				damage *= div_;
+				damage2 *= div_;
+			}
 		}
 
 		if( skill_num!=NPC_CRITICALSLASH ){
@@ -1617,6 +1618,8 @@ static struct Damage battle_calc_pc_weapon_attack(
 	int watk,watk_,cardfix,t_ele;
 	int da=0,i,t_class,ac_flag = 0;
 	int idef_flag=0,idef_flag_=0;
+	int div_flag=0;	// 0: total damage is to be divided by div_
+					// 1: damage is distributed,and has to be multiplied by div_ [celest]
 
 	//return前の処理があるので情報出力部のみ変更
 	if( src == NULL || target == NULL || sd == NULL ){
@@ -1695,7 +1698,10 @@ static struct Damage battle_calc_pc_weapon_attack(
 	hitrate=status_get_hit(src) - flee + 80; //命中率計算
 
 	type=0;	// normal
-	div_ = 1; // single attack
+	if (skill_num > 0) {
+		div_=skill_get_num(skill_num,skill_lv);
+		if (div_ < 1) div_ = 1;	//Avoid the rare case where the db says div_ is 0 and below
+	} else div_ = 1; // single attack
 
 	dex=status_get_dex(src); //DEX
 	luk=status_get_luk(src); //LUK
@@ -1955,7 +1961,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 				}
 				damage = damage*(180+ 20*skill_lv)/100;
 				damage2 = damage2*(180+ 20*skill_lv)/100;
-				div_=2;
 				if(sd->arrow_ele > 0) {
 					s_ele = sd->arrow_ele;
 					s_ele_ = sd->arrow_ele;
@@ -1998,8 +2003,7 @@ static struct Damage battle_calc_pc_weapon_attack(
 				damage2 = damage2*(100+ 10*skill_lv)/100;
 				hitrate=hitrate*(100+5*skill_lv)/100;
 				div_=t_size+1;
-				damage*=div_;
-				damage2*=div_;
+				div_flag=1;
 				break;
 			case KN_SPEARSTAB:	// スピアスタブ
 				damage = damage*(100+ 15*skill_lv)/100;
@@ -2054,7 +2058,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 				hitrate+=30; // hitrate +30, thanks to midas
 				damage = damage*(300+ 50*skill_lv)/100;
 				damage2 = damage2*(300+ 50*skill_lv)/100;
-				div_=8;
 				break;
 			case TF_SPRINKLESAND:	// 砂まき
 				damage = damage*125/100;
@@ -2074,9 +2077,7 @@ static struct Damage battle_calc_pc_weapon_attack(
 				break;
 			// 以下MOB
 			case NPC_COMBOATTACK:	// 多段攻撃
-				div_=skill_get_num(skill_num,skill_lv);
-				damage *= div_;
-				damage2 *= div_;
+				div_flag=1;
 				break;
 			case NPC_RANDOMATTACK:	// ランダムATK攻撃
 				damage = damage*(50+rand()%150)/100;
@@ -2137,7 +2138,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 			case CR_HOLYCROSS:	// ホーリークロス
 				damage = damage*(100+ 35*skill_lv)/100;
 				damage2 = damage2*(100+ 35*skill_lv)/100;
-				div_=2;
 				break;
 			case CR_GRANDCROSS:
 				hitrate= 1000000;
@@ -2159,16 +2159,13 @@ static struct Damage battle_calc_pc_weapon_attack(
 				no_cardfix = 1;
 				break;
 			case MO_FINGEROFFENSIVE:	//指弾
+				damage = damage * (125 + 25 * skill_lv) / 100;
+				damage2 = damage2 * (125 + 25 * skill_lv) / 100;
 				if(battle_config.finger_offensive_type == 0) {
-					damage = damage * (125 + 25 * skill_lv) / 100 * sd->spiritball_old;
-					damage2 = damage2 * (125 + 25 * skill_lv) / 100 * sd->spiritball_old;
 					div_ = sd->spiritball_old;
+					div_flag = 1;
 				}
-				else {
-					damage = damage * (125 + 25 * skill_lv) / 100;
-					damage2 = damage2 * (125 + 25 * skill_lv) / 100;
-					div_ = 1;
-				}
+				else div_ = 1;
 				flag=(flag&~BF_RANGEMASK)|BF_LONG;   //orn
 				break;
 			case MO_INVESTIGATE:	// 発 勁
@@ -2192,7 +2189,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 			case MO_CHAINCOMBO:	// 連打掌
 				damage = damage*(150+ 50*skill_lv)/100;
 				damage2 = damage2*(150+ 50*skill_lv)/100;
-				div_=4;
 				break;
 			case MO_COMBOFINISH:	// 猛龍拳
 				damage = damage*(240+ 60*skill_lv)/100;
@@ -2229,7 +2225,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 			case CH_CHAINCRUSH:	// 連柱崩撃
 				damage = damage*(100+ 60*skill_lv)/100;
 				damage2 = damage2*(100+ 60*skill_lv)/100;
-				div_=skill_get_num(skill_num,skill_lv);
 				break;
 			case CH_PALMSTRIKE:	// 猛虎硬派山
 				damage = damage*(50+ 100*skill_lv)/100;
@@ -2238,7 +2233,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 			case LK_SPIRALPIERCE:			/* スパイラルピアース */
 				damage = damage*(100+ 50*skill_lv)/100; //増加量が分からないので適当に
 				damage2 = damage2*(100+ 50*skill_lv)/100; //増加量が分からないので適当に
-				div_=5;
 				flag=(flag&~BF_RANGEMASK)|BF_LONG;
 				if(tsd)
 					tsd->canmove_tick = gettick() + 1000;
@@ -2265,7 +2259,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 			case CG_ARROWVULCAN:			/* アローバルカン */
 				damage = damage*(200+100*skill_lv)/100;
 				damage2 = damage2*(200+100*skill_lv)/100;
-				div_=9;
 				if(sd->arrow_ele > 0) {
 					s_ele = sd->arrow_ele;
 					s_ele_ = sd->arrow_ele;
@@ -2325,6 +2318,10 @@ static struct Damage battle_calc_pc_weapon_attack(
 				}
 				break;
 			}
+			if (div_flag && div_ > 1) {	// [Skotlex]
+				damage *= div_;
+				damage2 *= div_;
+			}
 		}
 		if(da == 2) { //三段掌が発動しているか
 			type = 0x08;